diff --git a/.github/workflows/Ubuntu_CI.yml b/.github/workflows/Ubuntu_CI.yml index 931b5ff6c3..f1fedc4a90 100644 --- a/.github/workflows/Ubuntu_CI.yml +++ b/.github/workflows/Ubuntu_CI.yml @@ -60,7 +60,7 @@ jobs: with: submodules: 'true' - name: Install dependencies - run: sudo apt-get update && sudo apt-get install g++ gcc build-essential libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev freeglut3-dev libavcodec-dev libavformat-dev libswscale-dev libsdl2-dev libswresample-dev libavutil-dev libavresample-dev libportmidi-dev libzstd-dev libcurl4-openssl-dev libltc-dev liblua5.3-dev wget git cbp2make + run: sudo apt-get update && sudo apt-get install g++ gcc build-essential libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev freeglut3-dev libavcodec-dev libavformat-dev libswscale-dev libsdl2-dev libswresample-dev libavutil-dev libavresample-dev libportmidi-dev libzstd-dev libwebp-dev libcurl4-openssl-dev libltc-dev liblua5.3-dev wget git cbp2make - name: Make run: make -j 2 diff --git a/.github/workflows/Ubuntu_Window_Release.yml b/.github/workflows/Ubuntu_Window_Release.yml index 86b9172318..ae09bb10f7 100644 --- a/.github/workflows/Ubuntu_Window_Release.yml +++ b/.github/workflows/Ubuntu_Window_Release.yml @@ -14,8 +14,8 @@ jobs: - uses: actions/checkout@v2 with: submodules: 'true' - - run: docker pull debenham/xlights - - run: docker run --name buildvm debenham/xlights /bin/bash Recipe.appimage + - run: docker pull ghcr.io/xlightssequencer/xlights-build-docker:master + - run: docker run --name buildvm ghcr.io/xlightssequencer/xlights-build-docker /bin/bash Recipe.appimage - run: 'docker cp buildvm:/xLights/xLights/AppImage/ /tmp/' - run: ls -lh /tmp/AppImage diff --git a/.github/workflows/docker_manual.yml b/.github/workflows/docker_manual.yml index 7e17696c72..8e92a4e17f 100644 --- a/.github/workflows/docker_manual.yml +++ b/.github/workflows/docker_manual.yml @@ -10,8 +10,8 @@ jobs: - uses: actions/checkout@v2 with: submodules: 'true' - - run: docker pull debenham/xlights - - run: docker run --name buildvm debenham/xlights /bin/bash Recipe.appimage + - run: docker pull ghcr.io/xlightssequencer/xlights-build-docker:master + - run: docker run --name buildvm ghcr.io/xlightssequencer/xlights-build-docker:master /bin/bash Recipe.appimage - run: 'docker cp buildvm:/xLights/xLights/AppImage/ /tmp/' - run: ls -lh /tmp/AppImage diff --git a/.travis.yml b/.travis.yml index 90269488d8..f805ea6774 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,8 @@ services: git: depth: 3 script: - - docker pull debenham/xlights - - docker run --name buildvm debenham/xlights /bin/bash Recipe.appimage + - docker pull docker pull ghcr.io/xlightssequencer/xlights-build-docker:master + - docker run --name buildvm ghcr.io/xlightssequencer/xlights-build-docker /bin/bash Recipe.appimage after_success: - docker cp buildvm:/xLights/xLights/AppImage/ /tmp/ - ls -lh /tmp/* diff --git a/README.linux b/README.linux index d2ff670025..26c74c90d7 100644 --- a/README.linux +++ b/README.linux @@ -65,11 +65,12 @@ Instructions for other Linux distributions will vary. libcurl4-openssl-dev libltc-dev liblua5.3-dev + libwebp-dev cbp2make (optional but recommended if compiling from git) Example command to install packages on Ubuntu - sudo apt-get install g++ gcc build-essential libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev freeglut3-dev libavcodec-dev libavformat-dev libswscale-dev libsdl2-dev libavutil-dev libportmidi-dev libzstd-dev libcurl4-openssl-dev libltc-dev liblua5.3-dev wget git cbp2make + sudo apt-get install g++ gcc build-essential libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev freeglut3-dev libavcodec-dev libavformat-dev libswscale-dev libsdl2-dev libavutil-dev libportmidi-dev libzstd-dev libwebp-dev libcurl4-openssl-dev libltc-dev liblua5.3-dev wget git cbp2make Example commands to install packages on Fedora 38 @@ -88,7 +89,7 @@ Instructions for other Linux distributions will vary. Install other packages: sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm - sudo dnf install gcc-c++ gtk3-devel gstreamer1-devel gstreamer1-plugins-base-devel freeglut-devel gstreamer1-plugins-bad-free-devel ffmpeg-devel SDL2-devel portmidi-devel libzstd-devel curl-devel libltc-devel lua-devel + sudo dnf install gcc-c++ gtk3-devel gstreamer1-devel gstreamer1-plugins-base-devel freeglut-devel gstreamer1-plugins-bad-free-devel ffmpeg-devel SDL2-devel portmidi-devel libzstd-devel libwebp-devel curl-devel libltc-devel lua-devel Note: newer versions of libportmidi combined the .so files. Easiest workaround is to add a sym link to the combine .so file: sudo ln -s /usr/lib64/libportmidi.so /usr/lib64/libporttime.so diff --git a/README.txt b/README.txt index 1a77469cf6..cc3c362e7e 100644 --- a/README.txt +++ b/README.txt @@ -11,6 +11,83 @@ Issue Tracker is found here: www.github.com/smeighan/xLights/issues XLIGHTS/NUTCRACKER RELEASE NOTES --------------------------------- + -- bug (scott) Fix Import Dialog Groups Blue turning white. +2023.22 Dec 5, 2023 + -- enh (claudio) Add virtual matrix to xSchedule using RGBW data + -- enh (lutz) Add palette shift buttons + -- enh (scott) Add cycles and scale to ripple effect + -- enh (scott) Add set smart remote and increment to visualiser + -- enh (scott) Add importing submodels as states + -- enh (scott) Add more controller connection property setting to the visualiser + -- enh (keith) Show progress in batch render including number left to render + -- enh (keith) Add model aliases used to improve automap and handling opening sequences with model names that have changed + -- enh (keith) Add an adjust effect - primarily for use on DMX effects to modify results without changing the underlying effects + -- enh (keith) Add support for non-zig zagging trees with multiple strands but one string + -- enh (dartunder) Add bulk edit to clear shadow models + -- bug (dartunder) Fix 3 point model dimensions incorrect + -- bug (keith) Fix Falcon V4 upload without full xlights control should not override port brightness + -- bug (keith) Fix layout model locking menu items inconsistently available + -- bug (keith) Fix Falcon V4/V5 reversed not uploading correctly + -- bug (keith) Fix click on import effect count column does not sort by effect count + -- bug (keith) Fix servo effect incompletely resets parameters + -- bug (keith) Fix Eseq playback on xSchedule + -- bug (keith) Fix default superstring to RGB handling + -- bug (scott) Fix FPP compatible audio file types incomplete + -- bug (scott) Fix missing bulk edit from some face effect properties + -- bug (dkulp) Fix 4GB+ uncompressed FSEQ files + -- bug (dkulp) Fix crash on player only controllers + -- bug (dkulp) Fix OSX font crash +2023.21 Nov 25, 2023 + -- enh (dkulp) Allow upload of config to inactive controllers + -- enh (scott) Add More Right Click Options to Multi-Controller Upload, Save/Load Selected + -- enh (scott) FPP Connect - Add Falcon V5 Support + -- enh (keith) Downgrade sketch effect image missing to warning and allow suppression of the warning in preferences. + -- enh (scott) FPP Connect - add Genius FSEQ upload + -- bug (dkulp) FPP Connect - fix crash with discovery/fpp connect if "Player Only" controller configured + -- bug (billnapier) Remove invisible unicode character in AlphxPix 4 settings + -- bug (dkulp) Fix Faces on models from Base show directory will always trigger the "dirty" flag + -- bug (keith) Fix copy on empty cell overwrites clipboard + -- bug (dkulp) Retry FSEQ upload on errors (up to three times) + -- bug (scott) HinkxPix won't allow assignment to smart receiver 3-9 + -- bug (dartunder) Fix face blink effect + -- bug (keith) Fix eyes closed not mapping correctly + -- bug (keith) Fix PixLite config retrieval +2023.20 Nov 15, 2023 + -- enh (scott) FPP Connect - Remove ancient FPP 1.x upload via mounted USB + -- enh (scott) FPP Connect - Add ability to upload Proxy Controller IPs + -- enh (MrPierreB) Selectively Offset parameters on remap of dmx channels + -- enh (keith) Add a quick way to make a block of ports a dumb receiver + -- enh (kylegrymonprez) Adding ability to adjust the frequency of the "Auto" eye blink + -- enh (degracode ) Allow the Setup tab's Activate, Activate in xLights, Deactivate, and Unlink From Base menu items to be used when multiple controllers are selected + -- enh (keith) Add option to remove placeholders from submodels + -- enh (scott) Make ModelChainDialog growable + -- enh (dartunder) Show fpp connect results in status bar + -- bug (djulien) Allow Preview to be selected when showing 3D models + -- bug (dartunder) Fix delete warning for locked models, delete all models including locked after confirmation dialog. + -- bug (dkulp) FPP String upload: don't upload "DUMMY" entries + -- bug (keith) Show smart remotes as 0-15 on HinksPix + -- bug (dartunder) Fix undo for replace model command + -- bug (scott) Fix alphapix upload + -- bug (keith) Fix crash in Check Sequence in liquid effect +2023.19 Nov 4, 2023 + -- enh (keith) Add webp image support + -- enh (dartunder) Add warning and make it easier to see that a model had a shadow model in visualizer + -- bug (Daniel Hacquebord) Fix dark mode for shadow models in visualizer + -- bug (scott) Fix AlphaPix upload + -- bug (keith) Fix crash with liquid effect on large models + -- bug (scott) LUA Script: Select Sequences and deselect highlighted does nothing + -- bug (dkulp) FPP Connect: not uploading serial outputs from FPP Connect (worked fine from controller page) + -- bug (dkulp) FPP Connect: not able to upload to FPP instances with UI password set + -- bug (dkulp) Fix crash on MacOS with RotoZoom if GPU is busy + -- bug (dkulp) Workaround some other common crashes, but underlying cause of crash still under investigation +2023.18 Oct 21, 2023 + -- enh (dkulp) FPP Connect - query and media in parallel + -- bug (scott) Custom Model Export - Export Default Render Buffer as Submodel + -- bug (scott) Fix Submodel Dialog Sizing Issues + -- bug (dartunder) FPP upload - fix e1.31 priority not being set if universes are all the same size + -- bug (scott) HinksPix - fix folder and filter selector + -- bug (dkulp) FPP Connect - attempt to fix some FPP Connect issues by remove "Expect: Continue" headers + -- bug (robfallone) Fix OpenGL crash on startup with some mesh objects 2023.17 Oct 16, 2023 -- enh (dkulp) Add monitor attribute for controllers, FPP upload of co-universes will set priority/monitoring/deDup settings -- enh (Kyle Grymonprez) Add Node Count to model tooltips diff --git a/build_scripts/msw/xLights_common.iss b/build_scripts/msw/xLights_common.iss index f098991508..7c19779a54 100644 --- a/build_scripts/msw/xLights_common.iss +++ b/build_scripts/msw/xLights_common.iss @@ -3,5 +3,5 @@ #define MyTitleName "xLights" #define Year 2023 -#define Version 17 +#define Version 22 #define Other "" diff --git a/controllers/fpp.xcontroller b/controllers/fpp.xcontroller index 263b37ad82..dc4d756a59 100644 --- a/controllers/fpp.xcontroller +++ b/controllers/fpp.xcontroller @@ -229,6 +229,7 @@ 24 1 + ttyAMA0 diff --git a/controllers/holidaycoro.xcontroller b/controllers/holidaycoro.xcontroller index 9601814792..541e69b108 100644 --- a/controllers/holidaycoro.xcontroller +++ b/controllers/holidaycoro.xcontroller @@ -10,7 +10,7 @@ 4 1 512 - 2040‬ + 2040 diff --git a/controllers/scott.xcontroller b/controllers/scott.xcontroller index 09261cde55..d04f23d2f6 100644 --- a/controllers/scott.xcontroller +++ b/controllers/scott.xcontroller @@ -10,6 +10,13 @@ 1 17,16 + + 16 + 1ttyS1 + ttyS1 + 1 + 17,-1 + @@ -28,6 +35,14 @@ ttyS1 ttyS2 + + 20 + 1ttyS1 + ttyS1 + 1 + 17,4 + 21,-1 + @@ -87,4 +102,49 @@ ttyS2 + + + 0 + 8 + + + + + 24 + 0 + 1 + 17,4 + 21,4 + 25,-1 + + + + + 24 + 0 + 1 + 5,4 + 9,4 + 13,4 + 17,4 + 21,4 + 25,-1 + + + + + 16 + 0 + 1 + 17,-1 + + + + + 16 + 0 + 1 + 17,-1 + + diff --git a/dependencies.txt b/dependencies.txt index 7d1ef829a3..81bfa53017 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -179,7 +179,7 @@ Usage: read/write of v2 FSEQ files Link: https://github.com/facebook/zstd Source: https://github.com/facebook/zstd Last Pulled: -Version: [latest version available as at Jan 2021 is 1.4.8 released Dec 2020 ... I doubt this is the version we are using] +Version: [latest version available as at Dec 2023 is 1.5.5] License: BSD Strategy: zstd.h header added to xLights repository, static libraries added to lib for OSX/Windows diff --git a/include/adjust16.xpm b/include/adjust16.xpm new file mode 100644 index 0000000000..b0b6aa8951 --- /dev/null +++ b/include/adjust16.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char *adjust16_xpm[] = { +"16 16 2 1", +" c #FFFFFF", +". c #000000", +" ", +" . ", +".. .. ", +" .. .. ", +" .... ", +" ... ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" ", +" ", +" "}; diff --git a/include/adjust24.xpm b/include/adjust24.xpm new file mode 100644 index 0000000000..36c26d5d95 --- /dev/null +++ b/include/adjust24.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *adjust24_xpm[] = { +"24 24 2 1", +" c #FFFFFF", +". c #000000", +" ", +" ", +" . . .. ", +" . . .. ", +" . . . . ", +" .. . . . ", +" . .. . . .. ", +" . . . . ", +" . . . . ", +" .... . . . ", +" . ... ", +" . .. ", +" . . . ", +" . . . ", +" . . . ", +" . ... . ", +" . . . . . ", +" . . . . . . ", +" . . . . . . ", +" . . . . . ", +" . . . .", +" . . . ", +" ", +" "}; diff --git a/include/adjust32.xpm b/include/adjust32.xpm new file mode 100644 index 0000000000..a0aeb8ae12 --- /dev/null +++ b/include/adjust32.xpm @@ -0,0 +1,37 @@ +/* XPM */ +static const char *adjust32_xpm[] = { +"32 32 2 1", +" c #FFFFFF", +". c #000000", +" ", +" ", +" .... .. ", +" . .. .. ..", +" . . .. . ", +" . .. . .. ", +" .. .. . . . ", +" ... .. . . . ", +" . .. . . .. .. ", +" . .. . . . ", +" . .. .. . ", +" .. .. . . ", +" ...... .. .. . ", +" . .. . ", +" . ... ", +" .. .. ", +" . . .. ", +" . . .. ", +" ... . .. ", +" . . .. ", +" . .... .. ", +" . . . . .. ", +" . . . . .. ", +" . . .. .. . .. ", +" . . .. .. . .. ", +" . .. .. . .. ", +" . .. .. . . ", +" . .. . .", +" . .. . . ", +" ... ... ", +" ", +" "}; diff --git a/include/adjust48.xpm b/include/adjust48.xpm new file mode 100644 index 0000000000..0dc912a633 --- /dev/null +++ b/include/adjust48.xpm @@ -0,0 +1,53 @@ +/* XPM */ +static const char *adjust48_xpm[] = { +"48 48 2 1", +" c #FFFFFF", +". c #000000", +" ", +" ", +" ", +" ...... .. ", +" ........ ..... ", +" .. .. ... . ", +" .. .. ... .. ", +" .. .. .. . ", +" . .. .. . .. ", +" .. .. . .. . ", +" ... .. . .. .. ", +" . .. .. .. .. ... ", +" . .. .. . .. .... ", +" . .... . .. .. ", +" .. .. .. .. .. ", +" . .. .. .. ", +" .. .. .. .. ", +" ... .. .. .. ", +" ......... .. .. .. ", +" ........ .. .. .. ", +" .. ... .. ", +" .. .. .. ", +" .. ... ", +" .... .. ", +" .. .. .. ", +" . .. .. ", +" . .. .. ", +" ..... .. .. ", +" .. . .. .. ", +" .. .. .. ", +" .. ...... .. ", +" .. .. ..... .. .. ", +" .. .. .. .. .. ", +" .. .. .. .. .. ", +" .. .. .. .. .. .. ", +" .. .. .. .. .. .. ", +" .. .. .. .. .. .. ", +" . .. .. .. .. .. ", +" . .. .. .. .. ", +" . .. .. .. .. ", +" . .. .. .. . ", +" .. .. .. ..", +" .. .. .. . ", +" ........ ...... ", +" ..... .... ", +" ", +" ", +" "}; diff --git a/include/adjust64.xpm b/include/adjust64.xpm new file mode 100644 index 0000000000..122bfa7e04 --- /dev/null +++ b/include/adjust64.xpm @@ -0,0 +1,69 @@ +/* XPM */ +static const char *adjust64_xpm[] = { +"64 64 2 1", +" c #FFFFFF", +". c #000000", +" ", +" ", +" ", +" ", +" ....... .. ", +" .......... .... ", +" ... .... .... .. ", +" ... ... .... .. ", +" ... ... .... ... ", +" ... .. ... .. ", +" ... .. .. ... ", +" .. ... .. .. .. ", +" ... ... .. .. .. ", +" .... .. .. .. .. ", +" ...... .. .. .. .. ", +" .. ... .. .. .. ..... ", +" .. ... .. .. .. ...... ", +" .. ...... .. .. .... ", +" .. .... ... .. ... ", +" .. .. ... .. ... ", +" .. ... .. ... ", +" ... ... .. ... ", +" ... ... .. ... ", +" ... ... .. ... ", +" ...... .... ... .. ... ", +" ........... ... .. ... ", +" ... ... ..... ... ", +" ... .... ... ", +" ... ... ... ", +" ... ..... ", +" .... ... ", +" ...... ... ", +" ... ... ... ", +" .. ... ... ", +" .. ... ... ", +" . .. ... ... ", +" ....... ... ... ", +" ....... ... ... ", +" ... ... ... ", +" ... ... ... ", +" ... .. ..... ... ", +" ... . ....... ... ... ", +" ... .. .. .. ... ... ", +" ... ... .. ... ... ", +" ... ... .. ... ... ", +" ... ... .. .. ... ... ", +" ... ... ... ... ... ... ", +" ... ... ... ... ... ... ", +" ... ... ... ... ... ... ", +" .. ... ... ... ... ... ", +" .. ... ... ... ... ... ", +" .. ... ... ... ... ", +" .. ... ... ... ... ", +" .. ... ... ... .. ", +" .. .. ... ... .. ", +" .. ... ... .. ", +" .. ... ... .. ", +" .... .... ... ... ", +" ......... ....... ", +" ...... ..... ", +" ", +" ", +" ", +" "}; diff --git a/include/left_shift.xpm b/include/left_shift.xpm new file mode 100644 index 0000000000..081469da1a --- /dev/null +++ b/include/left_shift.xpm @@ -0,0 +1,45 @@ +/* XPM */ +static const char * left_shift_xpm[] = { +"26 16 26 1", +" c None", +". c #A3A3A3", +"+ c #C6C6C6", +"@ c #C4C4C4", +"# c #BBBBBB", +"$ c #8A8A8A", +"% c #393939", +"& c #B7B7B7", +"* c #696969", +"= c #0E0E0E", +"- c #0A0A0A", +"; c #010101", +"> c #C3C3C3", +", c #B9B9B9", +"' c #626262", +") c #101010", +"! c #000000", +"~ c #B3B3B3", +"{ c #262626", +"] c #B4B4B4", +"^ c #636363", +"/ c #C5C5C5", +"( c #B6B6B6", +"_ c #0F0F0F", +": c #878787", +"< c #383838", +"..........................", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".++++@#$%++++++++++++++++.", +".+++&*=-;++++++++++++++++.", +".>,')!!!!++++++++++++++++.", +".~{!!!!!!!!!!!!!!!!!!!!!+.", +".]{!!!!!!!!!!!!!!!!!!!!!+.", +".+,^)!!!!++++++++++++++++.", +".++/(*_-!++++++++++++++++.", +".++++/#:<++++++++++++++++.", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".........................."}; diff --git a/include/reverse.xpm b/include/reverse.xpm new file mode 100644 index 0000000000..e3fccf7657 --- /dev/null +++ b/include/reverse.xpm @@ -0,0 +1,84 @@ +/* XPM */ +static const char * reverse_xpm[] = { +"26 16 65 1", +" c None", +". c #A3A3A3", +"+ c #C6C6C6", +"@ c #959595", +"# c #7E7E7E", +"$ c #C1C1C1", +"% c #C3C3C3", +"& c #8D8D8D", +"* c #828282", +"= c #808080", +"- c #8A8A8A", +"; c #9D9D9D", +"> c #BCBCBC", +", c #B5B5B5", +"' c #484848", +") c #171717", +"! c #989898", +"~ c #BABABA", +"{ c #797979", +"] c #343434", +"^ c #070707", +"/ c #000000", +"( c #030303", +"_ c #181818", +": c #060606", +"< c #010101", +"[ c #3B3B3B", +"} c #B6B6B6", +"| c #BBBBBB", +"1 c #626262", +"2 c #0C0C0C", +"3 c #1B1B1B", +"4 c #383838", +"5 c #434343", +"6 c #454545", +"7 c #3A3A3A", +"8 c #1F1F1F", +"9 c #050505", +"0 c #6D6D6D", +"a c #141414", +"b c #313131", +"c c #7C7C7C", +"d c #B9B9B9", +"e c #020202", +"f c #898989", +"g c #B2B2B2", +"h c #3E3E3E", +"i c #2D2D2D", +"j c #979797", +"k c #7A7A7A", +"l c #929292", +"m c #ADADAD", +"n c #B1B1B1", +"o c #BEBEBE", +"p c #C2C2C2", +"q c #B0B0B0", +"r c #131313", +"s c #0E0E0E", +"t c #323232", +"u c #3F3F3F", +"v c #535353", +"w c #5E5E5E", +"x c #C5C5C5", +"y c #080808", +"z c #AAAAAA", +"..........................", +".+++++++++++++++++@#$++++.", +".++++++++%.&*=-;>,')!++++.", +".+++++~{]^//////(_:<[}+++.", +".+++|12///345678////90$++.", +".++*a//bcd+++++>6e///:f++.", +".gh//ij++++++++!3/////(k%.", +".+llmn,~op++++++++++++q-+.", +".or/stu'vwj+++++++++xk2yz.", +".%k(/////3!++++++++ji//hg.", +".++f:///e6>+++++dcb//a*++.", +".++$09////876543///21|+++.", +".+++}[<:_(//////^]{~+++++.", +".++++!)',>;-=*&.%++++++++.", +".++++$#@+++++++++++++++++.", +".........................."}; diff --git a/include/right_shift.xpm b/include/right_shift.xpm new file mode 100644 index 0000000000..49c389f06b --- /dev/null +++ b/include/right_shift.xpm @@ -0,0 +1,45 @@ +/* XPM */ +static const char * right_shift_xpm[] = { +"26 16 26 1", +" c None", +". c #A3A3A3", +"+ c #C6C6C6", +"@ c #393939", +"# c #8A8A8A", +"$ c #BBBBBB", +"% c #C4C4C4", +"& c #010101", +"* c #0A0A0A", +"= c #0E0E0E", +"- c #696969", +"; c #B7B7B7", +"> c #000000", +", c #101010", +"' c #626262", +") c #B9B9B9", +"! c #C3C3C3", +"~ c #262626", +"{ c #B3B3B3", +"] c #B4B4B4", +"^ c #636363", +"/ c #0F0F0F", +"( c #B6B6B6", +"_ c #C5C5C5", +": c #383838", +"< c #878787", +"..........................", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".++++++++++++++++@#$%++++.", +".++++++++++++++++&*=-;+++.", +".++++++++++++++++>>>>,')!.", +".+>>>>>>>>>>>>>>>>>>>>>~{.", +".+>>>>>>>>>>>>>>>>>>>>>~].", +".++++++++++++++++>>>>,^)+.", +".++++++++++++++++>*/-(_++.", +".++++++++++++++++:<$_++++.", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".++++++++++++++++++++++++.", +".........................."}; diff --git a/include/switch.xpm b/include/switch.xpm deleted file mode 100644 index 7deeebd941..0000000000 --- a/include/switch.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static const char * switch_xpm[] = { -"24 24 12 1", -" c #EAEAEA", -". c #507090", -"+ c #A0A8C0", -"@ c #F6F9F6", -"# c #C0C8E0", -"$ c #C1C6D5", -"% c #F4F8F4", -"& c #F3F8F3", -"* c #AAB1C7", -"= c #A5ACC3", -"- c #F7F9F7", -"; c #BBC1D1", -" ", -" ", -" ...... ", -" +.@#..#@.$ ", -" +.%#. .#%.$ ", -" .%@. ++&** ", -" ++&== .&-.; ", -" .&&. ==%** ", -" ...@@... .@@. ", -" #.@@@@.# .@@. ", -" #.@@.# .... ", -" #..# ", -" #..# ", -" .... #.@@.# ", -" .@@. #.@@@@.# ", -" .@@. ...@@... ", -" **%== .&&. ", -" ;.-&. ==&++ ", -" **&++ .@%. ", -" $.%#. .#%.+ ", -" $.@#..#@.+ ", -" ...... ", -" ", -" "}; diff --git a/include/zstd.h b/include/zstd.h index 6c873544b4..e5c3f8b68b 100644 --- a/include/zstd.h +++ b/include/zstd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -14,26 +14,61 @@ extern "C" { #ifndef ZSTD_H_235446 #define ZSTD_H_235446 -/* ====== Dependency ======*/ +/* ====== Dependencies ======*/ +#include /* INT_MAX */ #include /* size_t */ /* ===== ZSTDLIB_API : control library symbols visibility ===== */ -#ifndef ZSTDLIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define ZSTDLIB_VISIBILITY __attribute__ ((visibility ("default"))) +#ifndef ZSTDLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE ZSTDLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_VISIBLE __attribute__ ((visibility ("default"))) # else -# define ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE # endif #endif + +#ifndef ZSTDLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDLIB_HIDDEN +# endif +#endif + #if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) -# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBILITY +# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBLE #elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) -# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ #else -# define ZSTDLIB_API ZSTDLIB_VISIBILITY +# define ZSTDLIB_API ZSTDLIB_VISIBLE #endif +/* Deprecation warnings : + * Should these warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. + * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. + */ +#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS +# define ZSTD_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define ZSTD_DEPRECATED(message) [[deprecated(message)]] +# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ >= 3) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define ZSTD_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") +# define ZSTD_DEPRECATED(message) +# endif +#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ + /******************************************************************************* Introduction @@ -70,31 +105,51 @@ extern "C" { /*------ Version ------*/ #define ZSTD_VERSION_MAJOR 1 -#define ZSTD_VERSION_MINOR 3 -#define ZSTD_VERSION_RELEASE 8 - +#define ZSTD_VERSION_MINOR 5 +#define ZSTD_VERSION_RELEASE 5 #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) -ZSTDLIB_API unsigned ZSTD_versionNumber(void); /**< to check runtime library version */ + +/*! ZSTD_versionNumber() : + * Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE). */ +ZSTDLIB_API unsigned ZSTD_versionNumber(void); #define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE #define ZSTD_QUOTE(str) #str #define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str) #define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) -ZSTDLIB_API const char* ZSTD_versionString(void); /* requires v1.3.0+ */ -/*************************************** -* Default constant -***************************************/ +/*! ZSTD_versionString() : + * Return runtime library version, like "1.4.5". Requires v1.3.0+. */ +ZSTDLIB_API const char* ZSTD_versionString(void); + +/* ************************************* + * Default constant + ***************************************/ #ifndef ZSTD_CLEVEL_DEFAULT # define ZSTD_CLEVEL_DEFAULT 3 #endif +/* ************************************* + * Constants + ***************************************/ + +/* All magic numbers are supposed read/written to/from files/memory using little-endian convention */ +#define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ +#define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */ +#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */ +#define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0 + +#define ZSTD_BLOCKSIZELOG_MAX 17 +#define ZSTD_BLOCKSIZE_MAX (1<= `ZSTD_compressBound(srcSize)`. + * NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data. * @return : compressed size written into `dst` (<= `dstCapacity), * or an error code if it fails (which can be tested using ZSTD_isError()). */ ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity, @@ -143,15 +198,49 @@ ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t * "empty", "unknown" and "error" results to the same return value (0), * while ZSTD_getFrameContentSize() gives them separate return values. * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */ -ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); +ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize") +ZSTDLIB_API +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+ + * `src` should point to the start of a ZSTD frame or skippable frame. + * `srcSize` must be >= first frame size + * @return : the compressed size of the first frame starting at `src`, + * suitable to pass as `srcSize` to `ZSTD_decompress` or similar, + * or an error code if input is invalid */ +ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); /*====== Helper functions ======*/ -#define ZSTD_COMPRESSBOUND(srcSize) ((srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ -ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ +/* ZSTD_compressBound() : + * maximum compressed size in worst case single-pass scenario. + * When invoking `ZSTD_compress()` or any other one-pass compression function, + * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize) + * as it eliminates one potential failure scenario, + * aka not enough room in dst buffer to write the compressed frame. + * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE . + * In which case, ZSTD_compressBound() will return an error code + * which can be tested using ZSTD_isError(). + * + * ZSTD_COMPRESSBOUND() : + * same as ZSTD_compressBound(), but as a macro. + * It can be used to produce constants, which can be useful for static allocation, + * for example to size a static array on stack. + * Will produce constant value 0 if srcSize too large. + */ +#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U) +#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ +ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ +/* ZSTD_isError() : + * Most ZSTD_* functions returning a size_t value can be tested for error, + * using ZSTD_isError(). + * @return 1 if error, 0 otherwise + */ ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string from an error code */ +ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed, requires v1.4.0+ */ ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compression level available */ +ZSTDLIB_API int ZSTD_defaultCLevel(void); /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */ /*************************************** @@ -159,17 +248,26 @@ ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compres ***************************************/ /*= Compression context * When compressing many times, - * it is recommended to allocate a context just once, and re-use it for each successive compression operation. + * it is recommended to allocate a context just once, + * and re-use it for each successive compression operation. * This will make workload friendlier for system's memory. - * Use one context per thread for parallel execution in multi-threaded environments. */ + * Note : re-using context is just a speed / resource optimization. + * It doesn't change the compression ratio, which remains identical. + * Note 2 : In multi-threaded environments, + * use one different context per thread for parallel execution. + */ typedef struct ZSTD_CCtx_s ZSTD_CCtx; ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void); -ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); +ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); /* accept NULL pointer */ /*! ZSTD_compressCCtx() : - * Same as ZSTD_compress(), using an explicit ZSTD_CCtx - * The function will compress at requested compression level, - * ignoring any other parameter */ + * Same as ZSTD_compress(), using an explicit ZSTD_CCtx. + * Important : in order to behave similarly to `ZSTD_compress()`, + * this function compresses at requested compression level, + * __ignoring any other parameter__ . + * If any advanced parameter was set using the advanced API, + * they will all be reset. Only `compressionLevel` remains. + */ ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, @@ -183,7 +281,7 @@ ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx, * Use one context per thread for parallel execution. */ typedef struct ZSTD_DCtx_s ZSTD_DCtx; ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); -ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); +ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ /*! ZSTD_decompressDCtx() : * Same as ZSTD_decompress(), @@ -195,93 +293,378 @@ ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, const void* src, size_t srcSize); -/************************** -* Simple dictionary API -***************************/ -/*! ZSTD_compress_usingDict() : - * Compression at an explicit compression level using a Dictionary. - * A dictionary can be any arbitrary data segment (also called a prefix), - * or a buffer with specified information (see dictBuilder/zdict.h). - * Note : This function loads the dictionary, resulting in significant startup delay. - * It's intended for a dictionary used only once. - * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */ -ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - const void* dict,size_t dictSize, - int compressionLevel); - -/*! ZSTD_decompress_usingDict() : - * Decompression using a known Dictionary. - * Dictionary must be identical to the one used during compression. - * Note : This function loads the dictionary, resulting in significant startup delay. - * It's intended for a dictionary used only once. - * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ -ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - const void* dict,size_t dictSize); - +/********************************************* +* Advanced compression API (Requires v1.4.0+) +**********************************************/ -/*********************************** - * Bulk processing dictionary API - **********************************/ -typedef struct ZSTD_CDict_s ZSTD_CDict; +/* API design : + * Parameters are pushed one by one into an existing context, + * using ZSTD_CCtx_set*() functions. + * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame. + * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` ! + * __They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx()__ . + * + * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). + * + * This API supersedes all other "advanced" API entry points in the experimental section. + * In the future, we expect to remove from experimental API entry points which are redundant with this API. + */ -/*! ZSTD_createCDict() : - * When compressing multiple messages / blocks using the same dictionary, it's recommended to load it only once. - * ZSTD_createCDict() will create a digested dictionary, ready to start future compression operations without startup cost. - * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. - * `dictBuffer` can be released after ZSTD_CDict creation, because its content is copied within CDict. - * Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate `dictBuffer` content. - * Note : A ZSTD_CDict can be created from an empty dictBuffer, but it is inefficient when used to compress small data. */ -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, - int compressionLevel); -/*! ZSTD_freeCDict() : - * Function frees memory allocated by ZSTD_createCDict(). */ -ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); +/* Compression strategies, listed from fastest to strongest */ +typedef enum { ZSTD_fast=1, + ZSTD_dfast=2, + ZSTD_greedy=3, + ZSTD_lazy=4, + ZSTD_lazy2=5, + ZSTD_btlazy2=6, + ZSTD_btopt=7, + ZSTD_btultra=8, + ZSTD_btultra2=9 + /* note : new strategies _might_ be added in the future. + Only the order (from fast to strong) is guaranteed */ +} ZSTD_strategy; -/*! ZSTD_compress_usingCDict() : - * Compression using a digested Dictionary. - * Recommended when same dictionary is used multiple times. - * Note : compression level is _decided at dictionary creation time_, - * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */ -ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - const ZSTD_CDict* cdict); +typedef enum { + /* compression parameters + * Note: When compressing with a ZSTD_CDict these parameters are superseded + * by the parameters used to construct the ZSTD_CDict. + * See ZSTD_CCtx_refCDict() for more info (superseded-by-cdict). */ + ZSTD_c_compressionLevel=100, /* Set compression parameters according to pre-defined cLevel table. + * Note that exact compression parameters are dynamically determined, + * depending on both compression level and srcSize (when known). + * Default level is ZSTD_CLEVEL_DEFAULT==3. + * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. + * Note 1 : it's possible to pass a negative compression level. + * Note 2 : setting a level does not automatically set all other compression parameters + * to default. Setting this will however eventually dynamically impact the compression + * parameters which have not been manually set. The manually set + * ones will 'stick'. */ + /* Advanced compression parameters : + * It's possible to pin down compression parameters to some specific values. + * In which case, these values are no longer dynamically selected by the compressor */ + ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2. + * This will set a memory budget for streaming decompression, + * with larger values requiring more memory + * and typically compressing more. + * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. + * Special: value 0 means "use default windowLog". + * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT + * requires explicitly allowing such size at streaming decompression stage. */ + ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2. + * Resulting memory usage is (1 << (hashLog+2)). + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. + * Larger tables improve compression ratio of strategies <= dFast, + * and improve speed of strategies > dFast. + * Special: value 0 means "use default hashLog". */ + ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2. + * Resulting memory usage is (1 << (chainLog+2)). + * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. + * Larger tables result in better and slower compression. + * This parameter is useless for "fast" strategy. + * It's still useful when using "dfast" strategy, + * in which case it defines a secondary probe table. + * Special: value 0 means "use default chainLog". */ + ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2. + * More attempts result in better and slower compression. + * This parameter is useless for "fast" and "dFast" strategies. + * Special: value 0 means "use default searchLog". */ + ZSTD_c_minMatch=105, /* Minimum size of searched matches. + * Note that Zstandard can still find matches of smaller size, + * it just tweaks its search algorithm to look for this size and larger. + * Larger values increase compression and decompression speed, but decrease ratio. + * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX. + * Note that currently, for all strategies < btopt, effective minimum is 4. + * , for all strategies > fast, effective maximum is 6. + * Special: value 0 means "use default minMatchLength". */ + ZSTD_c_targetLength=106, /* Impact of this field depends on strategy. + * For strategies btopt, btultra & btultra2: + * Length of Match considered "good enough" to stop search. + * Larger values make compression stronger, and slower. + * For strategy fast: + * Distance between match sampling. + * Larger values make compression faster, and weaker. + * Special: value 0 means "use default targetLength". */ + ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition. + * The higher the value of selected strategy, the more complex it is, + * resulting in stronger and slower compression. + * Special: value 0 means "use default strategy". */ + /* LDM mode parameters */ + ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching. + * This parameter is designed to improve compression ratio + * for large inputs, by finding large matches at long distance. + * It increases memory usage and window size. + * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB + * except when expressly set to a different value. + * Note: will be enabled by default if ZSTD_c_windowLog >= 128 MB and + * compression strategy >= ZSTD_btopt (== compression level 16+) */ + ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2. + * Larger values increase memory usage and compression ratio, + * but decrease compression speed. + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX + * default: windowlog - 7. + * Special: value 0 means "automatically determine hashlog". */ + ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher. + * Larger/too small values usually decrease compression ratio. + * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. + * Special: value 0 means "use default value" (default: 64). */ + ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution. + * Larger values improve collision resolution but decrease compression speed. + * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX. + * Special: value 0 means "use default value" (default: 3). */ + ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table. + * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). + * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. + * Larger values improve compression speed. + * Deviating far from default value will likely result in a compression ratio decrease. + * Special: value 0 means "automatically determine hashRateLog". */ -typedef struct ZSTD_DDict_s ZSTD_DDict; + /* frame parameters */ + ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) + * Content size must be known at the beginning of compression. + * This is automatically the case when using ZSTD_compress2(), + * For streaming scenarios, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */ + ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */ + ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */ -/*! ZSTD_createDDict() : - * Create a digested dictionary, ready to start decompression operation without startup delay. - * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */ -ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); + /* multi-threading parameters */ + /* These parameters are only active if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD). + * Otherwise, trying to set any other value than default (0) will be a no-op and return an error. + * In a situation where it's unknown if the linked library supports multi-threading or not, + * setting ZSTD_c_nbWorkers to any value >= 1 and consulting the return value provides a quick way to check this property. + */ + ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. + * When nbWorkers >= 1, triggers asynchronous mode when invoking ZSTD_compressStream*() : + * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller, + * while compression is performed in parallel, within worker thread(s). + * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end : + * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call). + * More workers improve speed, but also increase memory usage. + * Default value is `0`, aka "single-threaded mode" : no worker is spawned, + * compression is performed inside Caller's thread, and all invocations are blocking */ + ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1. + * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads. + * 0 means default, which is dynamically determined based on compression parameters. + * Job size must be a minimum of overlap size, or ZSTDMT_JOBSIZE_MIN (= 512 KB), whichever is largest. + * The minimum size is automatically and transparently enforced. */ + ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size. + * The overlap size is an amount of data reloaded from previous job at the beginning of a new job. + * It helps preserve compression ratio, while each job is compressed in parallel. + * This value is enforced only when nbWorkers >= 1. + * Larger values increase compression ratio, but decrease speed. + * Possible values range from 0 to 9 : + * - 0 means "default" : value will be determined by the library, depending on strategy + * - 1 means "no overlap" + * - 9 means "full overlap", using a full window size. + * Each intermediate rank increases/decreases load size by a factor 2 : + * 9: full window; 8: w/2; 7: w/4; 6: w/8; 5:w/16; 4: w/32; 3:w/64; 2:w/128; 1:no overlap; 0:default + * default value varies between 6 and 9, depending on strategy */ -/*! ZSTD_freeDDict() : - * Function frees memory allocated with ZSTD_createDDict() */ -ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_c_rsyncable + * ZSTD_c_format + * ZSTD_c_forceMaxWindow + * ZSTD_c_forceAttachDict + * ZSTD_c_literalCompressionMode + * ZSTD_c_targetCBlockSize + * ZSTD_c_srcSizeHint + * ZSTD_c_enableDedicatedDictSearch + * ZSTD_c_stableInBuffer + * ZSTD_c_stableOutBuffer + * ZSTD_c_blockDelimiters + * ZSTD_c_validateSequences + * ZSTD_c_useBlockSplitter + * ZSTD_c_useRowMatchFinder + * ZSTD_c_prefetchCDictTables + * ZSTD_c_enableSeqProducerFallback + * ZSTD_c_maxBlockSize + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly; + * also, the enums values themselves are unstable and can still change. + */ + ZSTD_c_experimentalParam1=500, + ZSTD_c_experimentalParam2=10, + ZSTD_c_experimentalParam3=1000, + ZSTD_c_experimentalParam4=1001, + ZSTD_c_experimentalParam5=1002, + ZSTD_c_experimentalParam6=1003, + ZSTD_c_experimentalParam7=1004, + ZSTD_c_experimentalParam8=1005, + ZSTD_c_experimentalParam9=1006, + ZSTD_c_experimentalParam10=1007, + ZSTD_c_experimentalParam11=1008, + ZSTD_c_experimentalParam12=1009, + ZSTD_c_experimentalParam13=1010, + ZSTD_c_experimentalParam14=1011, + ZSTD_c_experimentalParam15=1012, + ZSTD_c_experimentalParam16=1013, + ZSTD_c_experimentalParam17=1014, + ZSTD_c_experimentalParam18=1015, + ZSTD_c_experimentalParam19=1016 +} ZSTD_cParameter; -/*! ZSTD_decompress_usingDDict() : - * Decompression using a digested Dictionary. - * Recommended when same dictionary is used multiple times. */ -ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - const ZSTD_DDict* ddict); +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; +/*! ZSTD_cParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - lower and upper bounds, both inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam); -/**************************** -* Streaming -****************************/ +/*! ZSTD_CCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_cParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is generally only possible during frame initialization (before starting compression). + * Exception : when using multi-threading mode (nbWorkers >= 1), + * the following parameters can be updated _during_ compression (within same frame): + * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. + * new parameters will be active for next job only (after a flush()). + * @return : an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value); -typedef struct ZSTD_inBuffer_s { - const void* src; /**< start of input buffer */ - size_t size; /**< size of input buffer */ - size_t pos; /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ -} ZSTD_inBuffer; +/*! ZSTD_CCtx_setPledgedSrcSize() : + * Total input data size to be compressed as a single frame. + * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag. + * This value will also be controlled at end of frame, and trigger an error if not respected. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame. + * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. + * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame. + * Note 2 : pledgedSrcSize is only valid once, for the next frame. + * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN. + * Note 3 : Whenever all input data is provided and consumed in a single round, + * for example with ZSTD_compress2(), + * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end), + * this value is automatically overridden by srcSize instead. + */ +ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3 +} ZSTD_ResetDirective; + +/*! ZSTD_CCtx_reset() : + * There are 2 different things that can be reset, independently or jointly : + * - The session : will stop compressing current frame, and make CCtx ready to start a new one. + * Useful after an error, or to interrupt any ongoing compression. + * Any internal data not yet flushed is cancelled. + * Compression parameters and dictionary remain unchanged. + * They will be used to compress next frame. + * Resetting session never fails. + * - The parameters : changes all parameters back to "default". + * This also removes any reference to any dictionary or external sequence producer. + * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) + * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) + * - Both : similar to resetting the session, followed by resetting parameters. + */ +ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); + +/*! ZSTD_compress2() : + * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. + * ZSTD_compress2() always starts a new frame. + * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - The function is always blocking, returns when compression is completed. + * NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data, though it is possible it fails for other reasons. + * @return : compressed size written into `dst` (<= `dstCapacity), + * or an error code if it fails (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +/*********************************************** +* Advanced decompression API (Requires v1.4.0+) +************************************************/ + +/* The advanced API pushes parameters one by one into an existing DCtx context. + * Parameters are sticky, and remain valid for all following frames + * using the same DCtx context. + * It's possible to reset parameters to default values using ZSTD_DCtx_reset(). + * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream(). + * Therefore, no new decompression function is necessary. + */ + +typedef enum { + + ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which + * the streaming API will refuse to allocate memory buffer + * in order to protect the host from unreasonable memory requirements. + * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. + * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT). + * Special: value 0 means "use default maximum windowLog". */ + + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_d_format + * ZSTD_d_stableOutBuffer + * ZSTD_d_forceIgnoreChecksum + * ZSTD_d_refMultipleDDicts + * ZSTD_d_disableHuffmanAssembly + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly + */ + ZSTD_d_experimentalParam1=1000, + ZSTD_d_experimentalParam2=1001, + ZSTD_d_experimentalParam3=1002, + ZSTD_d_experimentalParam4=1003, + ZSTD_d_experimentalParam5=1004 + +} ZSTD_dParameter; + +/*! ZSTD_dParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - both lower and upper bounds, inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam); + +/*! ZSTD_DCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_dParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is only possible during frame initialization (before starting decompression). + * @return : 0, or an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value); + +/*! ZSTD_DCtx_reset() : + * Return a DCtx to clean state. + * Session and parameters can be reset jointly or separately. + * Parameters can only be reset when no active frame is being decompressed. + * @return : 0, or an error code, which can be tested with ZSTD_isError() + */ +ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); + + +/**************************** +* Streaming +****************************/ + +typedef struct ZSTD_inBuffer_s { + const void* src; /**< start of input buffer */ + size_t size; /**< size of input buffer */ + size_t pos; /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_inBuffer; typedef struct ZSTD_outBuffer_s { void* dst; /**< start of output buffer */ @@ -306,34 +689,46 @@ typedef struct ZSTD_outBuffer_s { * Parameters are sticky : when starting a new compression on the same context, * it will re-use the same sticky parameters as previous compression session. * When in doubt, it's recommended to fully initialize the context before usage. -* Use ZSTD_initCStream() to set the parameter to a selected compression level. -* Use advanced API (ZSTD_CCtx_setParameter(), etc.) to set more specific parameters. +* Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(), +* ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to +* set more specific parameters, the pledged source size, or load a dictionary. * -* Use ZSTD_compressStream() as many times as necessary to consume input stream. -* The function will automatically update both `pos` fields within `input` and `output`. -* Note that the function may not consume the entire input, -* for example, because the output buffer is already full, -* in which case `input.pos < input.size`. +* Use ZSTD_compressStream2() with ZSTD_e_continue as many times as necessary to +* consume input stream. The function will automatically update both `pos` +* fields within `input` and `output`. +* Note that the function may not consume the entire input, for example, because +* the output buffer is already full, in which case `input.pos < input.size`. * The caller must check if input has been entirely consumed. * If not, the caller must make some room to receive more compressed data, * and then present again remaining input data. -* @return : a size hint, preferred nb of bytes to use as input for next function call +* note: ZSTD_e_continue is guaranteed to make some forward progress when called, +* but doesn't guarantee maximal forward progress. This is especially relevant +* when compressing with multiple threads. The call won't block if it can +* consume some input, but if it can't it will wait for some, but not all, +* output to be flushed. +* @return : provides a minimum amount of data remaining to be flushed from internal buffers * or an error code, which can be tested using ZSTD_isError(). -* Note 1 : it's just a hint, to help latency a little, any value will work fine. -* Note 2 : size hint is guaranteed to be <= ZSTD_CStreamInSize() * * At any moment, it's possible to flush whatever data might remain stuck within internal buffer, -* using ZSTD_flushStream(). `output->pos` will be updated. -* Note that, if `output->size` is too small, a single invocation of ZSTD_flushStream() might not be enough (return code > 0). -* In which case, make some room to receive more compressed data, and call again ZSTD_flushStream(). +* using ZSTD_compressStream2() with ZSTD_e_flush. `output->pos` will be updated. +* Note that, if `output->size` is too small, a single invocation with ZSTD_e_flush might not be enough (return code > 0). +* In which case, make some room to receive more compressed data, and call again ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_flush until it returns 0, at which point you can change the +* operation. +* note: ZSTD_e_flush will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. * @return : 0 if internal buffers are entirely flushed, * >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), * or an error code, which can be tested using ZSTD_isError(). * -* ZSTD_endStream() instructs to finish a frame. +* Calling ZSTD_compressStream2() with ZSTD_e_end instructs to finish a frame. * It will perform a flush and write frame epilogue. * The epilogue is required for decoders to consider a frame completed. -* flush() operation is the same, and follows same rules as ZSTD_flushStream(). +* flush operation is the same, and follows same rules as calling ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_end until it returns 0, at which point you are free to +* start a new frame. +* note: ZSTD_e_end will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. * @return : 0 if frame fully completed and fully flushed, * >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), * or an error code, which can be tested using ZSTD_isError(). @@ -344,18 +739,96 @@ typedef ZSTD_CCtx ZSTD_CStream; /**< CCtx and CStream are now effectively same /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */ /*===== ZSTD_CStream management functions =====*/ ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void); -ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); +ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); /* accept NULL pointer */ /*===== Streaming compression functions =====*/ +typedef enum { + ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ + ZSTD_e_flush=1, /* flush any data provided so far, + * it creates (at least) one new block, that can be decoded immediately on reception; + * frame will continue: any future data can still reference previously compressed data, improving compression. + * note : multithreaded compression will block to flush as much output as possible. */ + ZSTD_e_end=2 /* flush any remaining data _and_ close current frame. + * note that frame is only closed after compressed data is fully flushed (return value == 0). + * After that point, any additional data starts a new frame. + * note : each frame is independent (does not reference any content from previous frame). + : note : multithreaded compression will block to flush as much output as possible. */ +} ZSTD_EndDirective; + +/*! ZSTD_compressStream2() : Requires v1.4.0+ + * Behaves about the same as ZSTD_compressStream, with additional control on end directive. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode) + * - output->pos must be <= dstCapacity, input->pos must be <= srcSize + * - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. + * - endOp must be a valid directive + * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller. + * - When nbWorkers>=1, function is non-blocking : it copies a portion of input, distributes jobs to internal worker threads, flush to output whatever is available, + * and then immediately returns, just indicating that there is some data remaining to be flushed. + * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. + * - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking. + * - @return provides a minimum amount of data remaining to be flushed from internal buffers + * or an error code, which can be tested using ZSTD_isError(). + * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. + * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. + * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. + * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), + * only ZSTD_e_end or ZSTD_e_flush operations are allowed. + * Before starting a new compression job, or changing compression parameters, + * it is required to fully flush internal buffers. + */ +ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective endOp); + + +/* These buffer sizes are softly recommended. + * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output. + * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(), + * reducing the amount of memory shuffling and buffering, resulting in minor performance savings. + * + * However, note that these recommendations are from the perspective of a C caller program. + * If the streaming interface is invoked from some other language, + * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo, + * a major performance rule is to reduce crossing such interface to an absolute minimum. + * It's not rare that performance ends being spent more into the interface, rather than compression itself. + * In which cases, prefer using large buffers, as large as practical, + * for both input and output, to reduce the nb of roundtrips. + */ +ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */ + + +/* ***************************************************************************** + * This following is a legacy streaming API, available since v1.0+ . + * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). + * It is redundant, but remains fully supported. + ******************************************************************************/ + +/*! + * Equivalent to: + * + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * + * Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API + * to compress with a dictionary. + */ ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); +/*! + * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). + * NOTE: The return value is different. ZSTD_compressStream() returns a hint for + * the next read size (if non-zero and not an error). ZSTD_compressStream2() + * returns the minimum nb of bytes left to flush (if non-zero and not an error). + */ ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); -ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ -ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block in all circumstances. */ - - /*-*************************************************************************** * Streaming decompression - HowTo @@ -388,302 +861,182 @@ typedef ZSTD_DCtx ZSTD_DStream; /**< DCtx and DStream are now effectively same /* For compatibility with versions <= v1.2.0, prefer differentiating them. */ /*===== ZSTD_DStream management functions =====*/ ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void); -ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); +ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */ /*===== Streaming decompression functions =====*/ + +/*! ZSTD_initDStream() : + * Initialize/reset DStream state for new decompression operation. + * Call before new decompression operation using same DStream. + * + * Note : This function is redundant with the advanced API and equivalent to: + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, NULL); + */ ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); + +/*! ZSTD_decompressStream() : + * Streaming decompression function. + * Call repetitively to consume full input updating it as necessary. + * Function will update both input and output `pos` fields exposing current state via these fields: + * - `input.pos < input.size`, some input remaining and caller should provide remaining input + * on the next call. + * - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + * - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + * call ZSTD_decompressStream() again to flush remaining data to output. + * Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + * + * @return : 0 when a frame is completely decoded and fully flushed, + * or an error code, which can be tested using ZSTD_isError(), + * or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + */ ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */ -#endif /* ZSTD_H_235446 */ - - +/************************** +* Simple dictionary API +***************************/ +/*! ZSTD_compress_usingDict() : + * Compression at an explicit compression level using a Dictionary. + * A dictionary can be any arbitrary data segment (also called a prefix), + * or a buffer with specified information (see zdict.h). + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + int compressionLevel); -/**************************************************************************************** - * ADVANCED AND EXPERIMENTAL FUNCTIONS - **************************************************************************************** - * The definitions in the following section are considered experimental. - * They are provided for advanced scenarios. - * They should never be used with a dynamic library, as prototypes may change in the future. - * Use them only in association with static linking. - * ***************************************************************************************/ - -#if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) -#define ZSTD_H_ZSTD_STATIC_LINKING_ONLY - - -/**************************************************************************************** - * Candidate API for promotion to stable status - **************************************************************************************** - * The following symbols and constants form the "staging area" : - * they are considered to join "stable API" by v1.4.0. - * The proposal is written so that it can be made stable "as is", - * though it's still possible to suggest improvements. - * Staging is in fact last chance for changes, - * the API is locked once reaching "stable" status. - * ***************************************************************************************/ - - -/* === Constants === */ - -/* all magic numbers are supposed read/written to/from files/memory using little-endian convention */ -#define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ -#define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */ -#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */ -#define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0 - -#define ZSTD_BLOCKSIZELOG_MAX 17 -#define ZSTD_BLOCKSIZE_MAX (1<= first frame size - * @return : the compressed size of the first frame starting at `src`, - * suitable to pass as `srcSize` to `ZSTD_decompress` or similar, - * or an error code if input is invalid */ -ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); - +/*! ZSTD_decompress_usingDict() : + * Decompression using a known Dictionary. + * Dictionary must be identical to the one used during compression. + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); -/* === Memory management === */ -/*! ZSTD_sizeof_*() : - * These functions give the _current_ memory usage of selected object. - * Note that object memory usage can evolve (increase or decrease) over time. */ -ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); -ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); -ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); -ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); -ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); -ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); +/*********************************** + * Bulk processing dictionary API + **********************************/ +typedef struct ZSTD_CDict_s ZSTD_CDict; +/*! ZSTD_createCDict() : + * When compressing multiple messages or blocks using the same dictionary, + * it's recommended to digest the dictionary only once, since it's a costly operation. + * ZSTD_createCDict() will create a state from digesting a dictionary. + * The resulting state can be used for future compression operations with very limited startup cost. + * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. + * @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict. + * Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content. + * Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer, + * in which case the only thing that it transports is the @compressionLevel. + * This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively, + * expecting a ZSTD_CDict parameter with any data, including those without a known dictionary. */ +ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, + int compressionLevel); -/*************************************** -* Advanced compression API -***************************************/ +/*! ZSTD_freeCDict() : + * Function frees memory allocated by ZSTD_createCDict(). + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); -/* API design : - * Parameters are pushed one by one into an existing context, - * using ZSTD_CCtx_set*() functions. - * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame. - * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` ! - * They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx() - * - * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). - * - * This API supercedes all other "advanced" API entry points in the experimental section. - * In the future, we expect to remove from experimental API entry points which are redundant with this API. - */ +/*! ZSTD_compress_usingCDict() : + * Compression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. + * Note : compression level is _decided at dictionary creation time_, + * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */ +ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict); -/* Compression strategies, listed from fastest to strongest */ -typedef enum { ZSTD_fast=1, - ZSTD_dfast=2, - ZSTD_greedy=3, - ZSTD_lazy=4, - ZSTD_lazy2=5, - ZSTD_btlazy2=6, - ZSTD_btopt=7, - ZSTD_btultra=8, - ZSTD_btultra2=9 - /* note : new strategies _might_ be added in the future. - Only the order (from fast to strong) is guaranteed */ -} ZSTD_strategy; +typedef struct ZSTD_DDict_s ZSTD_DDict; +/*! ZSTD_createDDict() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */ +ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); -typedef enum { +/*! ZSTD_freeDDict() : + * Function frees memory allocated with ZSTD_createDDict() + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); - /* compression parameters */ - ZSTD_c_compressionLevel=100, /* Update all compression parameters according to pre-defined cLevel table - * Default level is ZSTD_CLEVEL_DEFAULT==3. - * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. - * Note 1 : it's possible to pass a negative compression level. - * Note 2 : setting a level sets all default values of other compression parameters */ - ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2. - * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. - * Special: value 0 means "use default windowLog". - * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT - * requires explicitly allowing such window size at decompression stage if using streaming. */ - ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2. - * Resulting memory usage is (1 << (hashLog+2)). - * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. - * Larger tables improve compression ratio of strategies <= dFast, - * and improve speed of strategies > dFast. - * Special: value 0 means "use default hashLog". */ - ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2. - * Resulting memory usage is (1 << (chainLog+2)). - * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. - * Larger tables result in better and slower compression. - * This parameter is useless when using "fast" strategy. - * It's still useful when using "dfast" strategy, - * in which case it defines a secondary probe table. - * Special: value 0 means "use default chainLog". */ - ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2. - * More attempts result in better and slower compression. - * This parameter is useless when using "fast" and "dFast" strategies. - * Special: value 0 means "use default searchLog". */ - ZSTD_c_minMatch=105, /* Minimum size of searched matches. - * Note that Zstandard can still find matches of smaller size, - * it just tweaks its search algorithm to look for this size and larger. - * Larger values increase compression and decompression speed, but decrease ratio. - * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX. - * Note that currently, for all strategies < btopt, effective minimum is 4. - * , for all strategies > fast, effective maximum is 6. - * Special: value 0 means "use default minMatchLength". */ - ZSTD_c_targetLength=106, /* Impact of this field depends on strategy. - * For strategies btopt, btultra & btultra2: - * Length of Match considered "good enough" to stop search. - * Larger values make compression stronger, and slower. - * For strategy fast: - * Distance between match sampling. - * Larger values make compression faster, and weaker. - * Special: value 0 means "use default targetLength". */ - ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition. - * The higher the value of selected strategy, the more complex it is, - * resulting in stronger and slower compression. - * Special: value 0 means "use default strategy". */ +/*! ZSTD_decompress_usingDDict() : + * Decompression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_DDict* ddict); - /* LDM mode parameters */ - ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching. - * This parameter is designed to improve compression ratio - * for large inputs, by finding large matches at long distance. - * It increases memory usage and window size. - * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB - * except when expressly set to a different value. */ - ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2. - * Larger values increase memory usage and compression ratio, - * but decrease compression speed. - * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX - * default: windowlog - 7. - * Special: value 0 means "automatically determine hashlog". */ - ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher. - * Larger/too small values usually decrease compression ratio. - * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. - * Special: value 0 means "use default value" (default: 64). */ - ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution. - * Larger values improve collision resolution but decrease compression speed. - * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX. - * Special: value 0 means "use default value" (default: 3). */ - ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table. - * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). - * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. - * Larger values improve compression speed. - * Deviating far from default value will likely result in a compression ratio decrease. - * Special: value 0 means "automatically determine hashRateLog". */ - /* frame parameters */ - ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) - * Content size must be known at the beginning of compression. - * This is automatically the case when using ZSTD_compress2(), - * For streaming variants, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */ - ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */ - ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */ +/******************************** + * Dictionary helper functions + *******************************/ - /* multi-threading parameters */ - /* These parameters are only useful if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD). - * They return an error otherwise. */ - ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. - * When nbWorkers >= 1, triggers asynchronous mode when used with ZSTD_compressStream*() : - * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller, - * while compression work is performed in parallel, within worker threads. - * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end : - * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call). - * More workers improve speed, but also increase memory usage. - * Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */ - ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1. - * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads. - * 0 means default, which is dynamically determined based on compression parameters. - * Job size must be a minimum of overlapSize, or 1 MB, whichever is largest. - * The minimum size is automatically and transparently enforced */ - ZSTD_c_overlapSizeLog=402, /* Size of previous job reloaded at the beginning of each job, as a fraction of window size. - * This value is enforced only when nbWorkers >= 1. - * Larger values increase compression ratio, but decrease speed. - * Values range from 0 (no overlap) to 9 (overlap a full windowSize). - * Each rank (except 0) increase/decrease load size by a factor 2 - * 9: full window; 8: w/2; 7: w/4; 6: w/8; 5:w/16; 4: w/32; 3:w/64; 2:w/128; 1:w/256; - * default value is 6 : use 1/8th of windowSize */ +/*! ZSTD_getDictID_fromDict() : Requires v1.4.0+ + * Provides the dictID stored within dictionary. + * if @return == 0, the dictionary is not conformant with Zstandard specification. + * It can still be loaded, but as a content-only dictionary. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize); - /* note : additional experimental parameters are also available - * within the experimental section of the API. - * At the time of this writing, they include : - * ZSTD_c_rsyncable - * ZSTD_c_format - * ZSTD_c_forceMaxWindow - * ZSTD_c_forceAttachDict - * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. - * note : never ever use experimentalParam? names directly; - * also, the enums values themselves are unstable and can still change. - */ - ZSTD_c_experimentalParam1=500, - ZSTD_c_experimentalParam2=10, - ZSTD_c_experimentalParam3=1000, - ZSTD_c_experimentalParam4=1001 -} ZSTD_cParameter; +/*! ZSTD_getDictID_fromCDict() : Requires v1.5.0+ + * Provides the dictID of the dictionary loaded into `cdict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict); +/*! ZSTD_getDictID_fromDDict() : Requires v1.4.0+ + * Provides the dictID of the dictionary loaded into `ddict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); -typedef struct { - size_t error; - int lowerBound; - int upperBound; -} ZSTD_bounds; +/*! ZSTD_getDictID_fromFrame() : Requires v1.4.0+ + * Provides the dictID required to decompressed the frame stored within `src`. + * If @return == 0, the dictID could not be decoded. + * This could for one of the following reasons : + * - The frame does not require a dictionary to be decoded (most common case). + * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information. + * Note : this use case also happens when using a non-conformant dictionary. + * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). + * - This is not a Zstandard frame. + * When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); -/*! ZSTD_cParam_getBounds() : - * All parameters must belong to an interval with lower and upper bounds, - * otherwise they will either trigger an error or be automatically clamped. - * @return : a structure, ZSTD_bounds, which contains - * - an error status field, which must be tested using ZSTD_isError() - * - lower and upper bounds, both inclusive - */ -ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam); -/*! ZSTD_CCtx_setParameter() : - * Set one compression parameter, selected by enum ZSTD_cParameter. - * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds(). - * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). - * Setting a parameter is generally only possible during frame initialization (before starting compression). - * Exception : when using multi-threading mode (nbWorkers >= 1), - * the following parameters can be updated _during_ compression (within same frame): - * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. - * new parameters will be active for next job only (after a flush()). - * @return : an error code (which can be tested using ZSTD_isError()). - */ -ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value); +/******************************************************************************* + * Advanced dictionary and prefix API (Requires v1.4.0+) + * + * This API allows dictionaries to be used with ZSTD_compress2(), + * ZSTD_compressStream2(), and ZSTD_decompressDCtx(). + * Dictionaries are sticky, they remain valid when same context is re-used, + * they only reset when the context is reset + * with ZSTD_reset_parameters or ZSTD_reset_session_and_parameters. + * In contrast, Prefixes are single-use. + ******************************************************************************/ -/*! ZSTD_CCtx_setPledgedSrcSize() : - * Total input data size to be compressed as a single frame. - * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag. - * This value will also be controlled at end of frame, and trigger an error if not respected. - * @result : 0, or an error code (which can be tested with ZSTD_isError()). - * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame. - * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. - * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame. - * Note 2 : pledgedSrcSize is only valid once, for the next frame. - * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN. - * Note 3 : Whenever all input data is provided and consumed in a single round, - * for example with ZSTD_compress2(), - * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end), - * this value is automatically overriden by srcSize instead. - */ -ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); -/*! ZSTD_CCtx_loadDictionary() : +/*! ZSTD_CCtx_loadDictionary() : Requires v1.4.0+ * Create an internal CDict from `dict` buffer. * Decompression will have to use same dictionary. * @result : 0, or an error code (which can be tested with ZSTD_isError()). * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, * meaning "return to no-dictionary mode". - * Note 1 : Dictionary is sticky, it will be used for all future compressed frames. - * To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters). + * Note 1 : Dictionary is sticky, it will be used for all future compressed frames, + * until parameters are reset, a new dictionary is loaded, or the dictionary + * is explicitly invalidated by loading a NULL dictionary. * Note 2 : Loading a dictionary involves building tables. * It's also a CPU consuming operation, with non-negligible impact on latency. * Tables are dependent on compression parameters, and for this reason, @@ -692,13 +1045,19 @@ ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long lo * Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead. * In such a case, dictionary buffer must outlive its users. * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced() - * to precisely select how dictionary content must be interpreted. */ + * to precisely select how dictionary content must be interpreted. + * Note 5 : This method does not benefit from LDM (long distance mode). + * If you want to employ LDM on some large dictionary content, + * prefer employing ZSTD_CCtx_refPrefix() described below. + */ ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); -/*! ZSTD_CCtx_refCDict() : - * Reference a prepared dictionary, to be used for all next compressed frames. +/*! ZSTD_CCtx_refCDict() : Requires v1.4.0+ + * Reference a prepared dictionary, to be used for all future compressed frames. * Note that compression parameters are enforced from within CDict, - * and supercede any compression parameter previously set within CCtx. + * and supersede any compression parameter previously set within CCtx. + * The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. + * The ignored parameters will be used again if the CCtx is returned to no-dictionary mode. * The dictionary will remain valid for future compressed frames using same CCtx. * @result : 0, or an error code (which can be tested with ZSTD_isError()). * Special : Referencing a NULL CDict means "return to no-dictionary mode". @@ -707,12 +1066,13 @@ ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, s * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */ ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); -/*! ZSTD_CCtx_refPrefix() : +/*! ZSTD_CCtx_refPrefix() : Requires v1.4.0+ * Reference a prefix (single-usage dictionary) for next compressed frame. * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end). * Decompression will need same prefix to properly regenerate data. * Compressing with a prefix is similar in outcome as performing a diff and compressing it, * but performs much faster, especially during decompression (compression speed is tunable with compression level). + * This method is compatible with LDM (long distance mode). * @result : 0, or an error code (which can be tested with ZSTD_isError()). * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary * Note 1 : Prefix buffer is referenced. It **must** outlive compression. @@ -723,145 +1083,15 @@ ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. * It's a CPU consuming operation, with non-negligible impact on latency. * If there is a need to use the same prefix multiple times, consider loadDictionary instead. - * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dm_rawContent). + * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent). * Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize); - -typedef enum { - ZSTD_reset_session_only = 1, - ZSTD_reset_parameters = 2, - ZSTD_reset_session_and_parameters = 3 -} ZSTD_ResetDirective; - -/*! ZSTD_CCtx_reset() : - * There are 2 different things that can be reset, independently or jointly : - * - The session : will stop compressing current frame, and make CCtx ready to start a new one. - * Useful after an error, or to interrupt any ongoing compression. - * Any internal data not yet flushed is cancelled. - * Compression parameters and dictionary remain unchanged. - * They will be used to compress next frame. - * Resetting session never fails. - * - The parameters : changes all parameters back to "default". - * This removes any reference to any dictionary too. - * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) - * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) - * - Both : similar to resetting the session, followed by resetting parameters. - */ -ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); - - - -/*! ZSTD_compress2() : - * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. - * ZSTD_compress2() always starts a new frame. - * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. - * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() - * - The function is always blocking, returns when compression is completed. - * Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`. - * @return : compressed size written into `dst` (<= `dstCapacity), - * or an error code if it fails (which can be tested using ZSTD_isError()). - */ -ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize); - -typedef enum { - ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ - ZSTD_e_flush=1, /* flush any data provided so far, - * it creates (at least) one new block, that can be decoded immediately on reception; - * frame will continue: any future data can still reference previously compressed data, improving compression. */ - ZSTD_e_end=2 /* flush any remaining data _and_ close current frame. - * note that frame is only closed after compressed data is fully flushed (return value == 0). - * After that point, any additional data starts a new frame. - * note : each frame is independent (does not reference any content from previous frame). */ -} ZSTD_EndDirective; - -/*! ZSTD_compressStream2() : - * Behaves about the same as ZSTD_compressStream, with additional control on end directive. - * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() - * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode) - * - outpot->pos must be <= dstCapacity, input->pos must be <= srcSize - * - outpot->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. - * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller. - * - When nbWorkers>=1, function is non-blocking : it just acquires a copy of input, and distributes jobs to internal worker threads, flush whatever is available, - * and then immediately returns, just indicating that there is some data remaining to be flushed. - * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. - * - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking. - * - @return provides a minimum amount of data remaining to be flushed from internal buffers - * or an error code, which can be tested using ZSTD_isError(). - * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. - * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. - * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. - * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), - * only ZSTD_e_end or ZSTD_e_flush operations are allowed. - * Before starting a new compression job, or changing compression parameters, - * it is required to fully flush internal buffers. - */ -ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, - ZSTD_outBuffer* output, - ZSTD_inBuffer* input, - ZSTD_EndDirective endOp); - - - -/* ============================== */ -/* Advanced decompression API */ -/* ============================== */ - -/* The advanced API pushes parameters one by one into an existing DCtx context. - * Parameters are sticky, and remain valid for all following frames - * using the same DCtx context. - * It's possible to reset parameters to default values using ZSTD_DCtx_reset(). - * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream(). - * Therefore, no new decompression function is necessary. - */ - - -typedef enum { - - ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which - * the streaming API will refuse to allocate memory buffer - * in order to protect the host from unreasonable memory requirements. - * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. - * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) */ - - /* note : additional experimental parameters are also available - * within the experimental section of the API. - * At the time of this writing, they include : - * ZSTD_c_format - * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. - * note : never ever use experimentalParam? names directly - */ - ZSTD_d_experimentalParam1=1000 - -} ZSTD_dParameter; - - -/*! ZSTD_dParam_getBounds() : - * All parameters must belong to an interval with lower and upper bounds, - * otherwise they will either trigger an error or be automatically clamped. - * @return : a structure, ZSTD_bounds, which contains - * - an error status field, which must be tested using ZSTD_isError() - * - both lower and upper bounds, inclusive - */ -ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam); - -/*! ZSTD_DCtx_setParameter() : - * Set one compression parameter, selected by enum ZSTD_dParameter. - * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds(). - * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). - * Setting a parameter is only possible during frame initialization (before starting decompression). - * @return : 0, or an error code (which can be tested using ZSTD_isError()). - */ -ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value); - - -/*! ZSTD_DCtx_loadDictionary() : - * Create an internal DDict from dict buffer, - * to be used to decompress next frames. - * The dictionary remains valid for all future frames, until explicitly invalidated. +/*! ZSTD_DCtx_loadDictionary() : Requires v1.4.0+ + * Create an internal DDict from dict buffer, to be used to decompress all future frames. + * The dictionary remains valid for all future frames, until explicitly invalidated, or + * a new dictionary is loaded. * @result : 0, or an error code (which can be tested with ZSTD_isError()). * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, * meaning "return to no-dictionary mode". @@ -875,18 +1105,26 @@ ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param */ ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); -/*! ZSTD_DCtx_refDDict() : +/*! ZSTD_DCtx_refDDict() : Requires v1.4.0+ * Reference a prepared dictionary, to be used to decompress next frames. * The dictionary remains active for decompression of future frames using same DCtx. + * + * If called with ZSTD_d_refMultipleDDicts enabled, repeated calls of this function + * will store the DDict references in a table, and the DDict used for decompression + * will be determined at decompression time, as per the dict ID in the frame. + * The memory for the table is allocated on the first call to refDDict, and can be + * freed with ZSTD_freeDCtx(). + * + * If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary + * will be managed, and referencing a dictionary effectively "discards" any previous one. + * * @result : 0, or an error code (which can be tested with ZSTD_isError()). - * Note 1 : Currently, only one dictionary can be managed. - * Referencing a new dictionary effectively "discards" any previous one. * Special: referencing a NULL DDict means "return to no-dictionary mode". * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. */ ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); -/*! ZSTD_DCtx_refPrefix() : +/*! ZSTD_DCtx_refPrefix() : Requires v1.4.0+ * Reference a prefix (single-usage dictionary) to decompress next frame. * This is the reverse operation of ZSTD_CCtx_refPrefix(), * and must use the same prefix as the one used during compression. @@ -897,7 +1135,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); * Note 2 : Prefix buffer is referenced. It **must** outlive decompression. * Prefix buffer must remain unmodified up to the end of frame, * reached when ZSTD_decompressStream() returns 0. - * Note 3 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent). + * Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent). * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section) * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost. * A full dictionary is more costly, as it requires building tables. @@ -905,15 +1143,43 @@ ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize); -/*! ZSTD_DCtx_reset() : - * Return a DCtx to clean state. - * Session and parameters can be reset jointly or separately. - * Parameters can only be reset when no active frame is being decompressed. - * @return : 0, or an error code, which can be tested with ZSTD_isError() - */ -ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); +/* === Memory management === */ + +/*! ZSTD_sizeof_*() : Requires v1.4.0+ + * These functions give the _current_ memory usage of selected object. + * Note that object memory usage can evolve (increase or decrease) over time. */ +ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); +ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); +ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); +ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); +ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); +ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); + +#endif /* ZSTD_H_235446 */ + + +/* ************************************************************************************** + * ADVANCED AND EXPERIMENTAL FUNCTIONS + **************************************************************************************** + * The definitions in the following section are considered experimental. + * They are provided for advanced scenarios. + * They should never be used with a dynamic library, as prototypes may change in the future. + * Use them only in association with static linking. + * ***************************************************************************************/ +#if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) +#define ZSTD_H_ZSTD_STATIC_LINKING_ONLY +/* This can be overridden externally to hide static symbols. */ +#ifndef ZSTDLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllexport) ZSTDLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllimport) ZSTDLIB_VISIBLE +# else +# define ZSTDLIB_STATIC_API ZSTDLIB_VISIBLE +# endif +#endif /**************************************************************************************** * experimental API (static linking only) @@ -925,8 +1191,8 @@ ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); * Some of them might be removed in the future (especially when redundant with existing stable functions) * ***************************************************************************************/ -#define ZSTD_FRAMEHEADERSIZE_PREFIX 5 /* minimum input size required to query frame header size */ -#define ZSTD_FRAMEHEADERSIZE_MIN 6 +#define ZSTD_FRAMEHEADERSIZE_PREFIX(format) ((format) == ZSTD_f_zstd1 ? 5 : 1) /* minimum input size required to query frame header size */ +#define ZSTD_FRAMEHEADERSIZE_MIN(format) ((format) == ZSTD_f_zstd1 ? 6 : 2) #define ZSTD_FRAMEHEADERSIZE_MAX 18 /* can be useful for static allocation */ #define ZSTD_SKIPPABLEHEADERSIZE 8 @@ -949,6 +1215,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); #define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ #define ZSTD_STRATEGY_MIN ZSTD_fast #define ZSTD_STRATEGY_MAX ZSTD_btultra2 +#define ZSTD_BLOCKSIZE_MAX_MIN (1 << 10) /* The minimum valid max blocksize. Maximum blocksizes smaller than this make compressBound() inaccurate. */ #define ZSTD_OVERLAPLOG_MIN 0 @@ -957,7 +1224,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); #define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27 /* by default, the streaming decoder will refuse any frame * requiring larger than (1< 0: + * If litLength != 0: + * rep == 1 --> offset == repeat_offset_1 + * rep == 2 --> offset == repeat_offset_2 + * rep == 3 --> offset == repeat_offset_3 + * If litLength == 0: + * rep == 1 --> offset == repeat_offset_2 + * rep == 2 --> offset == repeat_offset_3 + * rep == 3 --> offset == repeat_offset_1 - 1 + * + * Note: This field is optional. ZSTD_generateSequences() will calculate the value of + * 'rep', but repeat offsets do not necessarily need to be calculated from an external + * sequence provider's perspective. For example, ZSTD_compressSequences() does not + * use this 'rep' field at all (as of now). + */ +} ZSTD_Sequence; + typedef struct { unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ @@ -1008,32 +1315,35 @@ typedef enum { typedef enum { ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */ - ZSTD_dlm_byRef = 1, /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ + ZSTD_dlm_byRef = 1 /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ } ZSTD_dictLoadMethod_e; typedef enum { - /* Opened question : should we have a format ZSTD_f_auto ? - * Today, it would mean exactly the same as ZSTD_f_zstd1. - * But, in the future, should several formats become supported, - * on the compression side, it would mean "default format". - * On the decompression side, it would mean "automatic format detection", - * so that ZSTD_f_zstd1 would mean "accept *only* zstd frames". - * Since meaning is a little different, another option could be to define different enums for compression and decompression. - * This question could be kept for later, when there are actually multiple formats to support, - * but there is also the question of pinning enum values, and pinning value `0` is especially important */ ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */ - ZSTD_f_zstd1_magicless = 1, /* Variant of zstd frame format, without initial 4-bytes magic number. + ZSTD_f_zstd1_magicless = 1 /* Variant of zstd frame format, without initial 4-bytes magic number. * Useful to save 4 bytes per generated frame. * Decoder cannot recognise automatically this format, requiring this instruction. */ } ZSTD_format_e; +typedef enum { + /* Note: this enum controls ZSTD_d_forceIgnoreChecksum */ + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1 +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + /* Note: this enum controls ZSTD_d_refMultipleDDicts */ + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1 +} ZSTD_refMultipleDDicts_e; + typedef enum { /* Note: this enum and the behavior it controls are effectively internal * implementation details of the compressor. They are expected to continue * to evolve and should be considered only in the context of extremely * advanced performance tuning. * - * Zstd currently supports the use of a CDict in two ways: + * Zstd currently supports the use of a CDict in three ways: * * - The contents of the CDict can be copied into the working context. This * means that the compression can search both the dictionary and input @@ -1049,6 +1359,12 @@ typedef enum { * working context's tables can be reused). For small inputs, this can be * faster than copying the CDict's tables. * + * - The CDict's tables are not used at all, and instead we use the working + * context alone to reload the dictionary and use params based on the source + * size. See ZSTD_compress_insertDictionary() and ZSTD_compress_usingDict(). + * This method is effective when the dictionary sizes are very small relative + * to the input size, and the input size is fairly large to begin with. + * * Zstd has a simple internal heuristic that selects which strategy to use * at the beginning of a compression. However, if experimentation shows that * Zstd is making poor choices, it is possible to override that choice with @@ -1057,41 +1373,264 @@ typedef enum { ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */ ZSTD_dictForceAttach = 1, /* Never copy the dictionary. */ ZSTD_dictForceCopy = 2, /* Always copy the dictionary. */ + ZSTD_dictForceLoad = 3 /* Always reload the dictionary */ } ZSTD_dictAttachPref_e; +typedef enum { + ZSTD_lcm_auto = 0, /**< Automatically determine the compression mode based on the compression level. + * Negative compression levels will be uncompressed, and positive compression + * levels will be compressed. */ + ZSTD_lcm_huffman = 1, /**< Always attempt Huffman compression. Uncompressed literals will still be + * emitted if Huffman compression is not profitable. */ + ZSTD_lcm_uncompressed = 2 /**< Always emit uncompressed literals. */ +} ZSTD_literalCompressionMode_e; + +typedef enum { + /* Note: This enum controls features which are conditionally beneficial. Zstd typically will make a final + * decision on whether or not to enable the feature (ZSTD_ps_auto), but setting the switch to ZSTD_ps_enable + * or ZSTD_ps_disable allow for a force enable/disable the feature. + */ + ZSTD_ps_auto = 0, /* Let the library automatically determine whether the feature shall be enabled */ + ZSTD_ps_enable = 1, /* Force-enable the feature */ + ZSTD_ps_disable = 2 /* Do not use the feature */ +} ZSTD_paramSwitch_e; + +/*************************************** +* Frame header and size functions +***************************************/ + +/*! ZSTD_findDecompressedSize() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - decompressed size of all data in all successive frames + * - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. + * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + * In which case, it's necessary to use streaming mode to decompress data. + * note 2 : decompressed size is always present when compression is done with ZSTD_compress() + * note 3 : decompressed size can be very large (64-bits value), + * potentially larger than what local system can handle as a single memory segment. + * In which case, it's necessary to use streaming mode to decompress data. + * note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. + * Always ensure result fits within application's authorized limits. + * Each application can set its own limits. + * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to + * read each contained frame header. This is fast as most of the data is skipped, + * however it does mean that all frame data must be present and valid. */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_decompressBound() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - upper-bound for the decompressed size of all data in all successive frames + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : an error can occur if `src` contains an invalid or incorrectly formatted frame. + * note 2 : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`. + * in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value. + * note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: + * upper-bound = # blocks * min(128 KB, Window_Size) + */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); + +/*! ZSTD_frameHeaderSize() : + * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. + * @return : size of the Frame Header, + * or an error code (if srcSize is too small) */ +ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); + +typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e; +typedef struct { + unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */ + unsigned long long windowSize; /* can be very large, up to <= frameContentSize */ + unsigned blockSizeMax; + ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */ + unsigned headerSize; + unsigned dictID; + unsigned checksumFlag; + unsigned _reserved1; + unsigned _reserved2; +} ZSTD_frameHeader; + +/*! ZSTD_getFrameHeader() : + * decode Frame Header, or requires larger `srcSize`. + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, + * or an error code, which can be tested using ZSTD_isError() */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +/*! ZSTD_getFrameHeader_advanced() : + * same as ZSTD_getFrameHeader(), + * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); + +/*! ZSTD_decompressionMargin() : + * Zstd supports in-place decompression, where the input and output buffers overlap. + * In this case, the output buffer must be at least (Margin + Output_Size) bytes large, + * and the input buffer must be at the end of the output buffer. + * + * _______________________ Output Buffer ________________________ + * | | + * | ____ Input Buffer ____| + * | | | + * v v v + * |---------------------------------------|-----------|----------| + * ^ ^ ^ + * |___________________ Output_Size ___________________|_ Margin _| + * + * NOTE: See also ZSTD_DECOMPRESSION_MARGIN(). + * NOTE: This applies only to single-pass decompression through ZSTD_decompress() or + * ZSTD_decompressDCtx(). + * NOTE: This function supports multi-frame input. + * + * @param src The compressed frame(s) + * @param srcSize The size of the compressed frame(s) + * @returns The decompression margin or an error that can be checked with ZSTD_isError(). + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize); + +/*! ZSTD_DECOMPRESS_MARGIN() : + * Similar to ZSTD_decompressionMargin(), but instead of computing the margin from + * the compressed frame, compute it from the original size and the blockSizeLog. + * See ZSTD_decompressionMargin() for details. + * + * WARNING: This macro does not support multi-frame input, the input must be a single + * zstd frame. If you need that support use the function, or implement it yourself. + * + * @param originalSize The original uncompressed size of the data. + * @param blockSize The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX). + * Unless you explicitly set the windowLog smaller than + * ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX. + */ +#define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)( \ + ZSTD_FRAMEHEADERSIZE_MAX /* Frame header */ + \ + 4 /* checksum */ + \ + ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \ + (blockSize) /* One block of margin */ \ + )) + +typedef enum { + ZSTD_sf_noBlockDelimiters = 0, /* Representation of ZSTD_Sequence has no block delimiters, sequences only */ + ZSTD_sf_explicitBlockDelimiters = 1 /* Representation of ZSTD_Sequence contains explicit block delimiters */ +} ZSTD_sequenceFormat_e; + +/*! ZSTD_sequenceBound() : + * `srcSize` : size of the input buffer + * @return : upper-bound for the number of sequences that can be generated + * from a buffer of srcSize bytes + * + * note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence). + */ +ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize); + +/*! ZSTD_generateSequences() : + * Generate sequences using ZSTD_compress2(), given a source buffer. + * + * Each block will end with a dummy sequence + * with offset == 0, matchLength == 0, and litLength == length of last literals. + * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) + * simply acts as a block delimiter. + * + * @zc can be used to insert custom compression params. + * This function invokes ZSTD_compress2(). + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters + * @return : number of sequences generated + */ + +ZSTDLIB_STATIC_API size_t +ZSTD_generateSequences( ZSTD_CCtx* zc, + ZSTD_Sequence* outSeqs, size_t outSeqsSize, + const void* src, size_t srcSize); + +/*! ZSTD_mergeBlockDelimiters() : + * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals + * by merging them into the literals of the next sequence. + * + * As such, the final generated result has no explicit representation of block boundaries, + * and the final last literals segment is not represented in the sequences. + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters + * @return : number of sequences left after merging + */ +ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); + +/*! ZSTD_compressSequences() : + * Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. + * @src contains the entire input (not just the literals). + * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals + * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) + * The entire source is compressed into a single frame. + * + * The compression behavior changes based on cctx params. In particular: + * If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on + * the block size derived from the cctx, and sequences may be split. This is the default setting. + * + * If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided. + * + * If ZSTD_c_validateSequences == 0, this function will blindly accept the sequences provided. Invalid sequences cause undefined + * behavior. If ZSTD_c_validateSequences == 1, then if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and return an error. + * + * In addition to the two adjustable experimental params, there are other important cctx params. + * - ZSTD_c_minMatch MUST be set as less than or equal to the smallest match generated by the match finder. It has a minimum value of ZSTD_MINMATCH_MIN. + * - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression. + * - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset + * is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md + * + * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. + * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, + * and cannot emit an RLE block that disagrees with the repcode history + * @return : final compressed size, or a ZSTD error code. + */ +ZSTDLIB_STATIC_API size_t +ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize); + -/*************************************** -* Frame size functions -***************************************/ +/*! ZSTD_writeSkippableFrame() : + * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, + * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. + * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so + * the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. + * + * Returns an error if destination buffer is not large enough, if the source size is not representable + * with a 4-byte unsigned int, or if the parameter magicVariant is greater than 15 (and therefore invalid). + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, + const void* src, size_t srcSize, unsigned magicVariant); -/*! ZSTD_findDecompressedSize() : - * `src` should point the start of a series of ZSTD encoded and/or skippable frames - * `srcSize` must be the _exact_ size of this series - * (i.e. there should be a frame boundary exactly at `srcSize` bytes after `src`) - * @return : - decompressed size of all data in all successive frames - * - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN - * - if an error occurred: ZSTD_CONTENTSIZE_ERROR +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. * - * note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. - * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. - * In which case, it's necessary to use streaming mode to decompress data. - * note 2 : decompressed size is always present when compression is done with ZSTD_compress() - * note 3 : decompressed size can be very large (64-bits value), - * potentially larger than what local system can handle as a single memory segment. - * In which case, it's necessary to use streaming mode to decompress data. - * note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. - * Always ensure result fits within application's authorized limits. - * Each application can set its own limits. - * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to - * read each contained frame header. This is fast as most of the data is skipped, - * however it does mean that all frame data must be present and valid. */ -ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize); + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + */ +ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size); -/*! ZSTD_frameHeaderSize() : - * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. - * @return : size of the Frame Header, - * or an error code (if srcSize is too small) */ -ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); /*************************************** @@ -1101,44 +1640,66 @@ ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); /*! ZSTD_estimate*() : * These functions make it possible to estimate memory usage * of a future {D,C}Ctx, before its creation. - * ZSTD_estimateCCtxSize() will provide a budget large enough for any compression level up to selected one. - * It will also consider src size to be arbitrarily "large", which is worst case. - * If srcSize is known to always be small, ZSTD_estimateCCtxSize_usingCParams() can provide a tighter estimation. - * ZSTD_estimateCCtxSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. - * ZSTD_estimateCCtxSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1. - * Note : CCtx size estimation is only correct for single-threaded compression. */ -ZSTDLIB_API size_t ZSTD_estimateCCtxSize(int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); -ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); -ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void); + * + * ZSTD_estimateCCtxSize() will provide a memory budget large enough + * for any compression level up to selected one. + * Note : Unlike ZSTD_estimateCStreamSize*(), this estimate + * does not include space for a window buffer. + * Therefore, the estimation is only guaranteed for single-shot compressions, not streaming. + * The estimate will assume the input may be arbitrarily large, + * which is the worst case. + * + * When srcSize can be bound by a known and rather "small" value, + * this fact can be used to provide a tighter estimation + * because the CCtx compression context will need less memory. + * This tighter estimation can be provided by more advanced functions + * ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(), + * and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). + * Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. + * + * Note : only single-threaded compression is supported. + * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * + * Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); /*! ZSTD_estimateCStreamSize() : * ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. * It will also consider src size to be arbitrarily "large", which is worst case. * If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. * ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. - * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1. + * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1. * Note : CStream size estimation is only correct for single-threaded compression. * ZSTD_DStream memory budget depends on window Size. * This information can be passed manually, using ZSTD_estimateDStreamSize, * or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), * an internal ?Dict will be created, which additional size is not estimated here. - * In this case, get total size by adding ZSTD_estimate?DictSize */ -ZSTDLIB_API size_t ZSTD_estimateCStreamSize(int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); -ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); -ZSTDLIB_API size_t ZSTD_estimateDStreamSize(size_t windowSize); -ZSTDLIB_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); + * In this case, get total size by adding ZSTD_estimate?DictSize + * Note 2 : only single-threaded compression is supported. + * ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t windowSize); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); /*! ZSTD_estimate?DictSize() : * ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). * ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). * Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. */ -ZSTDLIB_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); -ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); /*! ZSTD_initStatic*() : * Initialize an object using a pre-allocated fixed-size buffer. @@ -1161,20 +1722,20 @@ ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e * Limitation 2 : static cctx currently not compatible with multi-threading. * Limitation 3 : static dctx is incompatible with legacy support. */ -ZSTDLIB_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); -ZSTDLIB_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ -ZSTDLIB_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); -ZSTDLIB_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ -ZSTDLIB_API const ZSTD_CDict* ZSTD_initStaticCDict( +ZSTDLIB_STATIC_API const ZSTD_CDict* ZSTD_initStaticCDict( void* workspace, size_t workspaceSize, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams); -ZSTDLIB_API const ZSTD_DDict* ZSTD_initStaticDDict( +ZSTDLIB_STATIC_API const ZSTD_DDict* ZSTD_initStaticDDict( void* workspace, size_t workspaceSize, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, @@ -1189,24 +1750,54 @@ ZSTDLIB_API const ZSTD_DDict* ZSTD_initStaticDDict( typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size); typedef void (*ZSTD_freeFunction) (void* opaque, void* address); typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem; -static ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ +static +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif +ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ -ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams, ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize, - ZSTD_dictLoadMethod_e dictLoadMethod, - ZSTD_dictContentType_e dictContentType, - ZSTD_customMem customMem); +/*! Thread pool : + * These prototypes make it possible to share a thread pool among multiple compression contexts. + * This can limit resources for applications with multiple threads where each one uses + * a threaded compression mode (via ZSTD_c_nbWorkers parameter). + * ZSTD_createThreadPool creates a new thread pool with a given number of threads. + * Note that the lifetime of such pool must exist while being used. + * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value + * to use an internal thread pool). + * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. + */ +typedef struct POOL_ctx_s ZSTD_threadPool; +ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); +ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); + + +/* + * This API is temporary and is expected to change or disappear in the future! + */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced2( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + const ZSTD_CCtx_params* cctxParams, + ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_advanced( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_customMem customMem); /*************************************** @@ -1217,39 +1808,73 @@ ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictS * Create a digested dictionary for compression * Dictionary content is just referenced, not duplicated. * As a consequence, `dictBuffer` **must** outlive CDict, - * and its content must remain unmodified throughout the lifetime of CDict. */ -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); + * and its content must remain unmodified throughout the lifetime of CDict. + * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); /*! ZSTD_getCParams() : -* @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. -* `estimatedSrcSize` value is optional, select 0 if not known */ -ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. + * `estimatedSrcSize` value is optional, select 0 if not known */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); /*! ZSTD_getParams() : -* same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. -* All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ -ZSTDLIB_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. + * All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ +ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); /*! ZSTD_checkCParams() : -* Ensure param values remain within authorized range */ -ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); + * Ensure param values remain within authorized range. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ +ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); /*! ZSTD_adjustCParams() : * optimize params for a given `srcSize` and `dictSize`. - * both values are optional, select `0` if unknown. */ -ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); + * `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN. + * `dictSize` must be `0` when there is no dictionary. + * cPar can be invalid : all parameters will be clamped within valid range in the @return struct. + * This function never fails (wide contract) */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); + +/*! ZSTD_CCtx_setCParams() : + * Set all parameters provided within @p cparams into the working @p cctx. + * Note : if modifying parameters during compression (MT mode only), + * note that changes to the .windowLog parameter will be ignored. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + * On failure, no parameters are updated. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams); + +/*! ZSTD_CCtx_setFParams() : + * Set all parameters provided within @p fparams into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setFParams(ZSTD_CCtx* cctx, ZSTD_frameParameters fparams); + +/*! ZSTD_CCtx_setParams() : + * Set all parameters provided within @p params into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParams(ZSTD_CCtx* cctx, ZSTD_parameters params); /*! ZSTD_compress_advanced() : - * Same as ZSTD_compress_usingDict(), with fine-tune control over compression parameters (by structure) */ -ZSTDLIB_API size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - const void* dict,size_t dictSize, - ZSTD_parameters params); + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + ZSTD_parameters params); /*! ZSTD_compress_usingCDict_advanced() : - * Same as ZSTD_compress_usingCDict(), with fine-tune control over frame parameters */ -ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, const ZSTD_CDict* cdict, @@ -1259,18 +1884,18 @@ ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, /*! ZSTD_CCtx_loadDictionary_byReference() : * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); /*! ZSTD_CCtx_loadDictionary_advanced() : * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over * how to load the dictionary (by copy ? by reference ?) * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); /*! ZSTD_CCtx_refPrefix_advanced() : * Same as ZSTD_CCtx_refPrefix(), but gives finer control over * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); /* === experimental parameters === */ /* these parameters can be used with ZSTD_setParameter() @@ -1309,65 +1934,343 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * See the comments on that enum for an explanation of the feature. */ #define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 +/* Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never compress literals. + * Set to ZSTD_ps_enable to always compress literals. (Note: uncompressed literals + * may still be emitted if huffman is not beneficial to use.) + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * literals compression based on the compression parameters - specifically, + * negative compression levels do not use literal compression. + */ +#define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 + +/* Tries to fit compressed block size to be around targetCBlockSize. + * No target when targetCBlockSize == 0. + * There is no guarantee on compressed block size (default:0) */ +#define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6 + +/* User's best guess of source size. + * Hint is not valid when srcSizeHint == 0. + * There is no guarantee that hint is close to actual source size, + * but compression ratio may regress significantly if guess considerably underestimates */ +#define ZSTD_c_srcSizeHint ZSTD_c_experimentalParam7 + +/* Controls whether the new and experimental "dedicated dictionary search + * structure" can be used. This feature is still rough around the edges, be + * prepared for surprising behavior! + * + * How to use it: + * + * When using a CDict, whether to use this feature or not is controlled at + * CDict creation, and it must be set in a CCtxParams set passed into that + * construction (via ZSTD_createCDict_advanced2()). A compression will then + * use the feature or not based on how the CDict was constructed; the value of + * this param, set in the CCtx, will have no effect. + * + * However, when a dictionary buffer is passed into a CCtx, such as via + * ZSTD_CCtx_loadDictionary(), this param can be set on the CCtx to control + * whether the CDict that is created internally can use the feature or not. + * + * What it does: + * + * Normally, the internal data structures of the CDict are analogous to what + * would be stored in a CCtx after compressing the contents of a dictionary. + * To an approximation, a compression using a dictionary can then use those + * data structures to simply continue what is effectively a streaming + * compression where the simulated compression of the dictionary left off. + * Which is to say, the search structures in the CDict are normally the same + * format as in the CCtx. + * + * It is possible to do better, since the CDict is not like a CCtx: the search + * structures are written once during CDict creation, and then are only read + * after that, while the search structures in the CCtx are both read and + * written as the compression goes along. This means we can choose a search + * structure for the dictionary that is read-optimized. + * + * This feature enables the use of that different structure. + * + * Note that some of the members of the ZSTD_compressionParameters struct have + * different semantics and constraints in the dedicated search structure. It is + * highly recommended that you simply set a compression level in the CCtxParams + * you pass into the CDict creation call, and avoid messing with the cParams + * directly. + * + * Effects: + * + * This will only have any effect when the selected ZSTD_strategy + * implementation supports this feature. Currently, that's limited to + * ZSTD_greedy, ZSTD_lazy, and ZSTD_lazy2. + * + * Note that this means that the CDict tables can no longer be copied into the + * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be + * usable. The dictionary can only be attached or reloaded. + * + * In general, you should expect compression to be faster--sometimes very much + * so--and CDict creation to be slightly slower. Eventually, we will probably + * make this mode the default. + */ +#define ZSTD_c_enableDedicatedDictSearch ZSTD_c_experimentalParam8 + +/* ZSTD_c_stableInBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the compressor that input data presented with ZSTD_inBuffer + * will ALWAYS be the same between calls. + * Technically, the @src pointer must never be changed, + * and the @pos field can only be updated by zstd. + * However, it's possible to increase the @size field, + * allowing scenarios where more data can be appended after compressions starts. + * These conditions are checked by the compressor, + * and compression will fail if they are not respected. + * Also, data in the ZSTD_inBuffer within the range [src, src + pos) + * MUST not be modified during compression or it will result in data corruption. + * + * When this flag is enabled zstd won't allocate an input window buffer, + * because the user guarantees it can reference the ZSTD_inBuffer until + * the frame is complete. But, it will still allocate an output buffer + * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also + * avoid the memcpy() from the input buffer to the input window buffer. + * + * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, compression WILL fail if conditions are not respected. + * + * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST + * not be modified during compression or it will result in data corruption. + * This is because zstd needs to reference data in the ZSTD_inBuffer to find + * matches. Normally zstd maintains its own window buffer for this purpose, + * but passing this flag tells zstd to rely on user provided buffer instead. + */ +#define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9 + +/* ZSTD_c_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells he compressor that the ZSTD_outBuffer will not be resized between + * calls. Specifically: (out.size - out.pos) will never grow. This gives the + * compressor the freedom to say: If the compressed data doesn't fit in the + * output buffer then return ZSTD_error_dstSizeTooSmall. This allows us to + * always decompress directly into the output buffer, instead of decompressing + * into an internal buffer and copying to the output buffer. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer. It will still allocate the + * input window buffer (see ZSTD_c_stableInBuffer). + * + * Zstd will check that (out.size - out.pos) never grows and return an error + * if it does. While not strictly necessary, this should prevent surprises. + */ +#define ZSTD_c_stableOutBuffer ZSTD_c_experimentalParam10 + +/* ZSTD_c_blockDelimiters + * Default is 0 == ZSTD_sf_noBlockDelimiters. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * + * Designates whether or not the given array of ZSTD_Sequence contains block delimiters + * and last literals, which are defined as sequences with offset == 0 and matchLength == 0. + * See the definition of ZSTD_Sequence for more specifics. + */ +#define ZSTD_c_blockDelimiters ZSTD_c_experimentalParam11 + +/* ZSTD_c_validateSequences + * Default is 0 == disabled. Set to 1 to enable sequence validation. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * Designates whether or not we validate sequences provided to ZSTD_compressSequences() + * during function execution. + * + * Without validation, providing a sequence that does not conform to the zstd spec will cause + * undefined behavior, and may produce a corrupted block. + * + * With validation enabled, if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and + * return an error. + * + */ +#define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 + +/* ZSTD_c_useBlockSplitter + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use block splitter. + * Set to ZSTD_ps_enable to always use block splitter. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * block splitting based on the compression parameters. + */ +#define ZSTD_c_useBlockSplitter ZSTD_c_experimentalParam13 + +/* ZSTD_c_useRowMatchFinder + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use row-based matchfinder. + * Set to ZSTD_ps_enable to force usage of row-based matchfinder. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * the row-based matchfinder based on support for SIMD instructions and the window log. + * Note that this only pertains to compression strategies: greedy, lazy, and lazy2 + */ +#define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14 + +/* ZSTD_c_deterministicRefPrefix + * Default is 0 == disabled. Set to 1 to enable. + * + * Zstd produces different results for prefix compression when the prefix is + * directly adjacent to the data about to be compressed vs. when it isn't. + * This is because zstd detects that the two buffers are contiguous and it can + * use a more efficient match finding algorithm. However, this produces different + * results than when the two buffers are non-contiguous. This flag forces zstd + * to always load the prefix in non-contiguous mode, even if it happens to be + * adjacent to the data, to guarantee determinism. + * + * If you really care about determinism when using a dictionary or prefix, + * like when doing delta compression, you should select this option. It comes + * at a speed penalty of about ~2.5% if the dictionary and data happened to be + * contiguous, and is free if they weren't contiguous. We don't expect that + * intentionally making the dictionary and data contiguous will be worth the + * cost to memcpy() the data. + */ +#define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15 + +/* ZSTD_c_prefetchCDictTables + * Controlled with ZSTD_paramSwitch_e enum. Default is ZSTD_ps_auto. + * + * In some situations, zstd uses CDict tables in-place rather than copying them + * into the working context. (See docs on ZSTD_dictAttachPref_e above for details). + * In such situations, compression speed is seriously impacted when CDict tables are + * "cold" (outside CPU cache). This parameter instructs zstd to prefetch CDict tables + * when they are used in-place. + * + * For sufficiently small inputs, the cost of the prefetch will outweigh the benefit. + * For sufficiently large inputs, zstd will by default memcpy() CDict tables + * into the working context, so there is no need to prefetch. This parameter is + * targeted at a middle range of input sizes, where a prefetch is cheap enough to be + * useful but memcpy() is too expensive. The exact range of input sizes where this + * makes sense is best determined by careful experimentation. + * + * Note: for this parameter, ZSTD_ps_auto is currently equivalent to ZSTD_ps_disable, + * but in the future zstd may conditionally enable this feature via an auto-detection + * heuristic for cold CDicts. + * Use ZSTD_ps_disable to opt out of prefetching under any circumstances. + */ +#define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 + +/* ZSTD_c_enableSeqProducerFallback + * Allowed values are 0 (disable) and 1 (enable). The default setting is 0. + * + * Controls whether zstd will fall back to an internal sequence producer if an + * external sequence producer is registered and returns an error code. This fallback + * is block-by-block: the internal sequence producer will only be called for blocks + * where the external sequence producer returns an error code. Fallback parsing will + * follow any other cParam settings, such as compression level, the same as in a + * normal (fully-internal) compression operation. + * + * The user is strongly encouraged to read the full Block-Level Sequence Producer API + * documentation (below) before setting this parameter. */ +#define ZSTD_c_enableSeqProducerFallback ZSTD_c_experimentalParam17 + +/* ZSTD_c_maxBlockSize + * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). + * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default. + * + * This parameter can be used to set an upper bound on the blocksize + * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper + * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make + * compressBound() inaccurate). Only currently meant to be used for testing. + * + */ +#define ZSTD_c_maxBlockSize ZSTD_c_experimentalParam18 + +/* ZSTD_c_searchForExternalRepcodes + * This parameter affects how zstd parses external sequences, such as sequences + * provided through the compressSequences() API or from an external block-level + * sequence producer. + * + * If set to ZSTD_ps_enable, the library will check for repeated offsets in + * external sequences, even if those repcodes are not explicitly indicated in + * the "rep" field. Note that this is the only way to exploit repcode matches + * while using compressSequences() or an external sequence producer, since zstd + * currently ignores the "rep" field of external sequences. + * + * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in + * external sequences, regardless of whether the "rep" field has been set. This + * reduces sequence compression overhead by about 25% while sacrificing some + * compression ratio. + * + * The default value is ZSTD_ps_auto, for which the library will enable/disable + * based on compression level. + * + * Note: for now, this param only has an effect if ZSTD_c_blockDelimiters is + * set to ZSTD_sf_explicitBlockDelimiters. That may change in the future. + */ +#define ZSTD_c_searchForExternalRepcodes ZSTD_c_experimentalParam19 + /*! ZSTD_CCtx_getParameter() : * Get the requested compression parameter value, selected by enum ZSTD_cParameter, * and store it into int* value. * @return : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); /*! ZSTD_CCtx_params : * Quick howto : * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure - * - ZSTD_CCtxParam_setParameter() : Push parameters one by one into - * an existing ZSTD_CCtx_params structure. - * This is similar to - * ZSTD_CCtx_setParameter(). + * - ZSTD_CCtxParams_setParameter() : Push parameters one by one into + * an existing ZSTD_CCtx_params structure. + * This is similar to + * ZSTD_CCtx_setParameter(). * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to * an existing CCtx. * These parameters will be applied to * all subsequent frames. * - ZSTD_compressStream2() : Do compression using the CCtx. - * - ZSTD_freeCCtxParams() : Free the memory. + * - ZSTD_freeCCtxParams() : Free the memory, accept NULL pointer. * * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() * for static allocation of CCtx for single-threaded compression. */ -ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); -ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); +ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ /*! ZSTD_CCtxParams_reset() : * Reset params to default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); /*! ZSTD_CCtxParams_init() : * Initializes the compression parameters of cctxParams according to * compression level. All other parameters are reset to their default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); /*! ZSTD_CCtxParams_init_advanced() : * Initializes the compression and frame parameters of cctxParams according to * params. All other parameters are reset to their default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); -/*! ZSTD_CCtxParam_setParameter() : +/*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+ * Similar to ZSTD_CCtx_setParameter. * Set one compression parameter, selected by enum ZSTD_cParameter. - * Parameters must be applied to a ZSTD_CCtx using ZSTD_CCtx_setParametersUsingCCtxParams(). - * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Parameters must be applied to a ZSTD_CCtx using + * ZSTD_CCtx_setParametersUsingCCtxParams(). + * @result : a code representing success or failure (which can be tested with + * ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtxParam_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); -/*! ZSTD_CCtxParam_getParameter() : +/*! ZSTD_CCtxParams_getParameter() : * Similar to ZSTD_CCtx_getParameter. * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. * @result : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtxParam_getParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); /*! ZSTD_CCtx_setParametersUsingCCtxParams() : * Apply a set of ZSTD_CCtx_params to the compression context. @@ -1376,7 +2279,7 @@ ZSTDLIB_API size_t ZSTD_CCtxParam_getParameter(ZSTD_CCtx_params* params, ZSTD_cP * if nbWorkers>=1, new parameters will be picked up at next job, * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). */ -ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); /*! ZSTD_compressStream2_simpleArgs() : @@ -1385,7 +2288,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( * This variant might be helpful for binders from dynamic languages * which have troubles handling structures containing memory pointers. */ -ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( +ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs ( ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, size_t* dstPos, const void* src, size_t srcSize, size_t* srcPos, @@ -1401,58 +2304,33 @@ ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. * Note 3 : Skippable Frame Identifiers are considered valid. */ -ZSTDLIB_API unsigned ZSTD_isFrame(const void* buffer, size_t size); +ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size); /*! ZSTD_createDDict_byReference() : * Create a digested dictionary, ready to start decompression operation without startup delay. * Dictionary content is referenced, and therefore stays in dictBuffer. * It is important that dictBuffer outlives DDict, * it must remain read accessible throughout the lifetime of DDict */ -ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); - - -/*! ZSTD_getDictID_fromDict() : - * Provides the dictID stored within dictionary. - * if @return == 0, the dictionary is not conformant with Zstandard specification. - * It can still be loaded, but as a content-only dictionary. */ -ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize); - -/*! ZSTD_getDictID_fromDDict() : - * Provides the dictID of the dictionary loaded into `ddict`. - * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. - * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ -ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); - -/*! ZSTD_getDictID_fromFrame() : - * Provides the dictID required to decompressed the frame stored within `src`. - * If @return == 0, the dictID could not be decoded. - * This could for one of the following reasons : - * - The frame does not require a dictionary to be decoded (most common case). - * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. - * Note : this use case also happens when using a non-conformant dictionary. - * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). - * - This is not a Zstandard frame. - * When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */ -ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); /*! ZSTD_DCtx_loadDictionary_byReference() : * Same as ZSTD_DCtx_loadDictionary(), * but references `dict` content instead of copying it into `dctx`. * This saves memory if `dict` remains around., * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */ -ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); /*! ZSTD_DCtx_loadDictionary_advanced() : * Same as ZSTD_DCtx_loadDictionary(), * but gives direct control over * how to load the dictionary (by copy ? by reference ?) * and how to interpret it (automatic ? force raw mode ? full mode only ?). */ -ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); /*! ZSTD_DCtx_refPrefix_advanced() : * Same as ZSTD_DCtx_refPrefix(), but gives finer control over * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); /*! ZSTD_DCtx_setMaxWindowSize() : * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. @@ -1461,20 +2339,107 @@ ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* pre * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); + +/*! ZSTD_DCtx_getParameter() : + * Get the requested decompression parameter value, selected by enum ZSTD_dParameter, + * and store it into int* value. + * @return : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); /* ZSTD_d_format * experimental parameter, * allowing selection between ZSTD_format_e input compression formats */ #define ZSTD_d_format ZSTD_d_experimentalParam1 +/* ZSTD_d_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the decompressor that the ZSTD_outBuffer will ALWAYS be the same + * between calls, except for the modifications that zstd makes to pos (the + * caller must not modify pos). This is checked by the decompressor, and + * decompression will fail if it ever changes. Therefore the ZSTD_outBuffer + * MUST be large enough to fit the entire decompressed frame. This will be + * checked when the frame content size is known. The data in the ZSTD_outBuffer + * in the range [dst, dst + pos) MUST not be modified during decompression + * or you will get data corruption. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer, but it will still allocate + * an input buffer large enough to fit any compressed block. This will also + * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer. + * If you need to avoid the input buffer allocation use the buffer-less + * streaming API. + * + * NOTE: So long as the ZSTD_outBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, decompression WILL fail if you violate the preconditions. + * + * WARNING: The data in the ZSTD_outBuffer in the range [dst, dst + pos) MUST + * not be modified during decompression or you will get data corruption. This + * is because zstd needs to reference data in the ZSTD_outBuffer to regenerate + * matches. Normally zstd maintains its own buffer for this purpose, but passing + * this flag tells zstd to use the user provided buffer. + */ +#define ZSTD_d_stableOutBuffer ZSTD_d_experimentalParam2 + +/* ZSTD_d_forceIgnoreChecksum + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * Tells the decompressor to skip checksum validation during decompression, regardless + * of whether checksumming was specified during compression. This offers some + * slight performance benefits, and may be useful for debugging. + * Param has values of type ZSTD_forceIgnoreChecksum_e + */ +#define ZSTD_d_forceIgnoreChecksum ZSTD_d_experimentalParam3 + +/* ZSTD_d_refMultipleDDicts + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * If enabled and dctx is allocated on the heap, then additional memory will be allocated + * to store references to multiple ZSTD_DDict. That is, multiple calls of ZSTD_refDDict() + * using a given ZSTD_DCtx, rather than overwriting the previous DDict reference, will instead + * store all references. At decompression time, the appropriate dictID is selected + * from the set of DDicts based on the dictID in the frame. + * + * Usage is simply calling ZSTD_refDDict() on multiple dict buffers. + * + * Param has values of byte ZSTD_refMultipleDDicts_e + * + * WARNING: Enabling this parameter and calling ZSTD_DCtx_refDDict(), will trigger memory + * allocation for the hash table. ZSTD_freeDCtx() also frees this memory. + * Memory is allocated as per ZSTD_DCtx::customMem. + * + * Although this function allocates memory for the table, the user is still responsible for + * memory management of the underlying ZSTD_DDict* themselves. + */ +#define ZSTD_d_refMultipleDDicts ZSTD_d_experimentalParam4 + +/* ZSTD_d_disableHuffmanAssembly + * Set to 1 to disable the Huffman assembly implementation. + * The default value is 0, which allows zstd to use the Huffman assembly + * implementation if available. + * + * This parameter can be used to disable Huffman assembly at runtime. + * If you want to disable it at compile time you can define the macro + * ZSTD_DISABLE_ASM. + */ +#define ZSTD_d_disableHuffmanAssembly ZSTD_d_experimentalParam5 + /*! ZSTD_DCtx_setFormat() : + * This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). * Instruct the decoder context about what kind of data to decode next. * This instruction is mandatory to decode data without a fully-formed header, * such ZSTD_f_zstd1_magicless for example. * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); +ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead") +ZSTDLIB_STATIC_API +size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); /*! ZSTD_decompressStream_simpleArgs() : * Same as ZSTD_decompressStream(), @@ -1482,7 +2447,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); * This can be helpful for binders from dynamic languages * which have troubles handling structures containing memory pointers. */ -ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs ( +ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs ( ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, size_t* dstPos, const void* src, size_t srcSize, size_t* srcPos); @@ -1496,14 +2461,101 @@ ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs ( ********************************************************************/ /*===== Advanced Streaming compression functions =====*/ -ZSTDLIB_API size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pledgedSrcSize); /**< pledgedSrcSize must be correct. If it is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, "0" also disables frame content size field. It may be enabled in the future. */ -ZSTDLIB_API size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel); /**< creates of an internal CDict (incompatible with static CCtx), except if dict == NULL or dictSize < 8, in which case no dict is used. Note: dict is loaded with ZSTD_dm_auto (treated as a full zstd dictionary if it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy.*/ -ZSTDLIB_API size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, const void* dict, size_t dictSize, - ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize must be correct. If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. dict is loaded with ZSTD_dm_auto and ZSTD_dlm_byCopy. */ -ZSTDLIB_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); /**< note : cdict will just be referenced, and must outlive compression session */ -ZSTDLIB_API size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const ZSTD_CDict* cdict, ZSTD_frameParameters fParams, unsigned long long pledgedSrcSize); /**< same as ZSTD_initCStream_usingCDict(), with control over frame parameters. pledgedSrcSize must be correct. If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. */ + +/*! ZSTD_initCStream_srcSize() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * + * pledgedSrcSize must be correct. If it is not known at init time, use + * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, + * "0" also disables frame content size field. It may be enabled in the future. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, + int compressionLevel, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingDict() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * Creates of an internal CDict (incompatible with static CCtx), except if + * dict == NULL or dictSize < 8, in which case no dict is used. + * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if + * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + int compressionLevel); + +/*! ZSTD_initCStream_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParams(zcs, params); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy. + * pledgedSrcSize must be correct. + * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + ZSTD_parameters params, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingCDict() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * note : cdict will just be referenced, and must outlive compression session + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); + +/*! ZSTD_initCStream_usingCDict_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setFParams(zcs, fParams); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * same as ZSTD_initCStream_usingCDict(), with control over frame parameters. + * pledgedSrcSize must be correct. If srcSize is not known at init time, use + * value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams, + unsigned long long pledgedSrcSize); /*! ZSTD_resetCStream() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but + * ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be + * explicitly specified. + * * start a new frame, using same parameters from previous frame. * This is typically useful to skip dictionary loading stage, since it will re-use it in-place. * Note that zcs must be init at least once before using ZSTD_resetCStream(). @@ -1512,8 +2564,11 @@ ZSTDLIB_API size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const * For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs, * but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead. * @return : 0, or an error code (which can be tested using ZSTD_isError()) + * This prototype will generate compilation warnings. */ -ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); typedef struct { @@ -1531,7 +2586,7 @@ typedef struct { * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed. * Aggregates progression inside active worker threads. */ -ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); /*! ZSTD_toFlushNow() : * Tell how many bytes are ready to be flushed immediately. @@ -1546,21 +2601,218 @@ ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx * therefore flush speed is limited by production speed of oldest job * irrespective of the speed of concurrent (and newer) jobs. */ -ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); /*===== Advanced Streaming decompression functions =====*/ -ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); /**< note: no dictionary will be used if dict == NULL or dictSize < 8 */ -ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); /**< note : ddict is referenced, it must outlive decompression session */ -ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); /**< re-use decompression parameters from previous init; saves dictionary loading */ + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_loadDictionary(zds, dict, dictSize); + * + * note: no dictionary will be used if dict == NULL or dictSize < 8 + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, ddict); + * + * note : ddict is referenced, it must outlive decompression session + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * + * re-use decompression parameters from previous init; saves dictionary loading + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); + + +/* ********************* BLOCK-LEVEL SEQUENCE PRODUCER API ********************* + * + * *** OVERVIEW *** + * The Block-Level Sequence Producer API allows users to provide their own custom + * sequence producer which libzstd invokes to process each block. The produced list + * of sequences (literals and matches) is then post-processed by libzstd to produce + * valid compressed blocks. + * + * This block-level offload API is a more granular complement of the existing + * frame-level offload API compressSequences() (introduced in v1.5.1). It offers + * an easier migration story for applications already integrated with libzstd: the + * user application continues to invoke the same compression functions + * ZSTD_compress2() or ZSTD_compressStream2() as usual, and transparently benefits + * from the specific advantages of the external sequence producer. For example, + * the sequence producer could be tuned to take advantage of known characteristics + * of the input, to offer better speed / ratio, or could leverage hardware + * acceleration not available within libzstd itself. + * + * See contrib/externalSequenceProducer for an example program employing the + * Block-Level Sequence Producer API. + * + * *** USAGE *** + * The user is responsible for implementing a function of type + * ZSTD_sequenceProducer_F. For each block, zstd will pass the following + * arguments to the user-provided function: + * + * - sequenceProducerState: a pointer to a user-managed state for the sequence + * producer. + * + * - outSeqs, outSeqsCapacity: an output buffer for the sequence producer. + * outSeqsCapacity is guaranteed >= ZSTD_sequenceBound(srcSize). The memory + * backing outSeqs is managed by the CCtx. + * + * - src, srcSize: an input buffer for the sequence producer to parse. + * srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX. + * + * - dict, dictSize: a history buffer, which may be empty, which the sequence + * producer may reference as it parses the src buffer. Currently, zstd will + * always pass dictSize == 0 into external sequence producers, but this will + * change in the future. + * + * - compressionLevel: a signed integer representing the zstd compression level + * set by the user for the current operation. The sequence producer may choose + * to use this information to change its compression strategy and speed/ratio + * tradeoff. Note: the compression level does not reflect zstd parameters set + * through the advanced API. + * + * - windowSize: a size_t representing the maximum allowed offset for external + * sequences. Note that sequence offsets are sometimes allowed to exceed the + * windowSize if a dictionary is present, see doc/zstd_compression_format.md + * for details. + * + * The user-provided function shall return a size_t representing the number of + * sequences written to outSeqs. This return value will be treated as an error + * code if it is greater than outSeqsCapacity. The return value must be non-zero + * if srcSize is non-zero. The ZSTD_SEQUENCE_PRODUCER_ERROR macro is provided + * for convenience, but any value greater than outSeqsCapacity will be treated as + * an error code. + * + * If the user-provided function does not return an error code, the sequences + * written to outSeqs must be a valid parse of the src buffer. Data corruption may + * occur if the parse is not valid. A parse is defined to be valid if the + * following conditions hold: + * - The sum of matchLengths and literalLengths must equal srcSize. + * - All sequences in the parse, except for the final sequence, must have + * matchLength >= ZSTD_MINMATCH_MIN. The final sequence must have + * matchLength >= ZSTD_MINMATCH_MIN or matchLength == 0. + * - All offsets must respect the windowSize parameter as specified in + * doc/zstd_compression_format.md. + * - If the final sequence has matchLength == 0, it must also have offset == 0. + * + * zstd will only validate these conditions (and fail compression if they do not + * hold) if the ZSTD_c_validateSequences cParam is enabled. Note that sequence + * validation has a performance cost. + * + * If the user-provided function returns an error, zstd will either fall back + * to an internal sequence producer or fail the compression operation. The user can + * choose between the two behaviors by setting the ZSTD_c_enableSeqProducerFallback + * cParam. Fallback compression will follow any other cParam settings, such as + * compression level, the same as in a normal compression operation. + * + * The user shall instruct zstd to use a particular ZSTD_sequenceProducer_F + * function by calling + * ZSTD_registerSequenceProducer(cctx, + * sequenceProducerState, + * sequenceProducer) + * This setting will persist until the next parameter reset of the CCtx. + * + * The sequenceProducerState must be initialized by the user before calling + * ZSTD_registerSequenceProducer(). The user is responsible for destroying the + * sequenceProducerState. + * + * *** LIMITATIONS *** + * This API is compatible with all zstd compression APIs which respect advanced parameters. + * However, there are three limitations: + * + * First, the ZSTD_c_enableLongDistanceMatching cParam is not currently supported. + * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with a block-level + * external sequence producer. + * - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in some + * cases (see its documentation for details). Users must explicitly set + * ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an external + * sequence producer is registered. + * - As of this writing, ZSTD_c_enableLongDistanceMatching is disabled by default + * whenever ZSTD_c_windowLog < 128MB, but that's subject to change. Users should + * check the docs on ZSTD_c_enableLongDistanceMatching whenever the Block-Level Sequence + * Producer API is used in conjunction with advanced settings (like ZSTD_c_windowLog). + * + * Second, history buffers are not currently supported. Concretely, zstd will always pass + * dictSize == 0 to the external sequence producer (for now). This has two implications: + * - Dictionaries are not currently supported. Compression will *not* fail if the user + * references a dictionary, but the dictionary won't have any effect. + * - Stream history is not currently supported. All advanced compression APIs, including + * streaming APIs, work with external sequence producers, but each block is treated as + * an independent chunk without history from previous blocks. + * + * Third, multi-threading within a single compression is not currently supported. In other words, + * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external sequence producer is registered. + * Multi-threading across compressions is fine: simply create one CCtx per thread. + * + * Long-term, we plan to overcome all three limitations. There is no technical blocker to + * overcoming them. It is purely a question of engineering effort. + */ + +#define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1)) + +typedef size_t ZSTD_sequenceProducer_F ( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +); + +/*! ZSTD_registerSequenceProducer() : + * Instruct zstd to use a block-level external sequence producer function. + * + * The sequenceProducerState must be initialized by the caller, and the caller is + * responsible for managing its lifetime. This parameter is sticky across + * compressions. It will remain set until the user explicitly resets compression + * parameters. + * + * Sequence producer registration is considered to be an "advanced parameter", + * part of the "advanced API". This means it will only have an effect on compression + * APIs which respect advanced parameters, such as compress2() and compressStream2(). + * Older compression APIs such as compressCCtx(), which predate the introduction of + * "advanced parameters", will ignore any external sequence producer setting. + * + * The sequence producer can be "cleared" by registering a NULL function pointer. This + * removes all limitations described above in the "LIMITATIONS" section of the API docs. + * + * The user is strongly encouraged to read the full API documentation (above) before + * calling this function. */ +ZSTDLIB_STATIC_API void +ZSTD_registerSequenceProducer( + ZSTD_CCtx* cctx, + void* sequenceProducerState, + ZSTD_sequenceProducer_F* sequenceProducer +); /********************************************************************* -* Buffer-less and synchronous inner streaming functions +* Buffer-less and synchronous inner streaming functions (DEPRECATED) * -* This is an advanced API, giving full control over buffer management, for users which need direct control over memory. -* But it's also a complex one, with several restrictions, documented below. -* Prefer normal streaming API for an easier experience. +* This API is deprecated, and will be removed in a future version. +* It allows streaming (de)compression with user allocated buffers. +* However, it is hard to use, and not as well tested as the rest of +* our API. +* +* Please use the normal streaming API instead: ZSTD_compressStream2, +* and ZSTD_decompressStream. +* If there is functionality that you need, but it doesn't provide, +* please open an issue on our GitHub. ********************************************************************* */ /** @@ -1571,9 +2823,7 @@ ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); /**< re-use decompress ZSTD_CCtx object can be re-used multiple times within successive compression operations. Start by initializing a context. - Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression, - or ZSTD_compressBegin_advanced(), for finer parameter control. - It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() + Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -1595,18 +2845,30 @@ ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); /**< re-use decompress */ /*===== Buffer-less streaming compression functions =====*/ -ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); -ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); -ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ -ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ -ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ -ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ - -ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); - - -/*- +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ + +ZSTD_DEPRECATED("This function will likely be removed in a future release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API +size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ +/** Buffer-less streaming decompression (synchronous mode) A ZSTD_DCtx object is required to track streaming operations. @@ -1617,8 +2879,8 @@ ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapaci Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough. Data fragment must be large enough to ensure successful decoding. `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough. - @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. - >0 : `srcSize` is too small, please provide at least @result bytes on next attempt. + result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. + >0 : `srcSize` is too small, please provide at least result bytes on next attempt. errorCode, which can be tested using ZSTD_isError(). It fills a ZSTD_frameHeader structure with important information to correctly decode the frame, @@ -1637,7 +2899,7 @@ ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapaci The most memory efficient way is to use a round buffer of sufficient size. Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(), - which can @return an error code if required value is too large for current system (in 32-bits mode). + which can return an error code if required value is too large for current system (in 32-bits mode). In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one, up to the moment there is not enough room left in the buffer to guarantee decoding another full block, which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`. @@ -1657,7 +2919,7 @@ ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapaci ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue(). ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail. - @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). + result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item. It can also be an error code, which can be tested with ZSTD_isError(). @@ -1680,52 +2942,45 @@ ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapaci */ /*===== Buffer-less streaming decompression functions =====*/ -typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e; -typedef struct { - unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */ - unsigned long long windowSize; /* can be very large, up to <= frameContentSize */ - unsigned blockSizeMax; - ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */ - unsigned headerSize; - unsigned dictID; - unsigned checksumFlag; -} ZSTD_frameHeader; -/** ZSTD_getFrameHeader() : - * decode Frame Header, or requires larger `srcSize`. - * @return : 0, `zfhPtr` is correctly filled, - * >0, `srcSize` is too small, value is wanted `srcSize` amount, - * or an error code, which can be tested using ZSTD_isError() */ -ZSTDLIB_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ -/*! ZSTD_getFrameHeader_advanced() : - * same as ZSTD_getFrameHeader(), - * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ -ZSTDLIB_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); -ZSTDLIB_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ -ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); -ZSTDLIB_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); -ZSTDLIB_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); -ZSTDLIB_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); -ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* misc */ -ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); +ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; -ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); -/* ============================ */ -/** Block level API */ -/* ============================ */ +/* ========================================= */ +/** Block level API (DEPRECATED) */ +/* ========================================= */ /*! + + This API is deprecated in favor of the regular compression API. + You can get the frame header down to 2 bytes by setting: + - ZSTD_c_format = ZSTD_f_zstd1_magicless + - ZSTD_c_contentSizeFlag = 0 + - ZSTD_c_checksumFlag = 0 + - ZSTD_c_dictIDFlag = 0 + + This API is not as well tested as our normal API, so we recommend not using it. + We will be removing it in a future version. If the normal API doesn't provide + the functionality you need, please open a GitHub issue. + Block functions produce and decode raw zstd blocks, without frame metadata. - Frame metadata cost is typically ~18 bytes, which can be non-negligible for very small blocks (< 100 bytes). - User will have to take in charge required information to regenerate data, such as compressed and content sizes. + Frame metadata cost is typically ~12 bytes, which can be non-negligible for very small blocks (< 100 bytes). + But users will have to take in charge needed metadata to regenerate data, such as compressed and content sizes. A few rules to respect : - Compressing and decompressing require a context structure @@ -1733,26 +2988,30 @@ ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); - It is necessary to init context before starting + compression : any ZSTD_compressBegin*() variant, including with dictionary + decompression : any ZSTD_decompressBegin*() variant, including with dictionary - + copyCCtx() and copyDCtx() can be used too - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + If input is larger than a block size, it's necessary to split input data into multiple blocks - + For inputs larger than a single block, really consider using regular ZSTD_compress() instead. - Frame metadata is not that costly, and quickly becomes negligible as source size grows larger. - - When a block is considered not compressible enough, ZSTD_compressBlock() result will be zero. - In which case, nothing is produced into `dst` ! - + User must test for such outcome and deal directly with uncompressed data - + ZSTD_decompressBlock() doesn't accept uncompressed data as input !!! + + For inputs larger than a single block, consider using regular ZSTD_compress() instead. + Frame metadata is not that costly, and quickly becomes negligible as source size grows larger than a block. + - When a block is considered not compressible enough, ZSTD_compressBlock() result will be 0 (zero) ! + ===> In which case, nothing is produced into `dst` ! + + User __must__ test for such outcome and deal directly with uncompressed data + + A block cannot be declared incompressible if ZSTD_compressBlock() return value was != 0. + Doing so would mess up with statistics history, leading to potential data corruption. + + ZSTD_decompressBlock() _doesn't accept uncompressed data as input_ !! + In case of multiple successive blocks, should some of them be uncompressed, decoder must be informed of their existence in order to follow proper history. Use ZSTD_insertBlock() for such a case. */ /*===== Raw zstd block functions =====*/ -ZSTDLIB_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); -ZSTDLIB_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ - +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ #endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ diff --git a/lib/windows/libzstd_static.lib b/lib/windows/libzstd_static.lib index e8ec8a8fc1..ea5b9a0bd0 100755 Binary files a/lib/windows/libzstd_static.lib and b/lib/windows/libzstd_static.lib differ diff --git a/lib/windows/libzstd_static_VS.lib b/lib/windows/libzstd_static_VS.lib index 07b189d8f9..ddeb05c500 100644 Binary files a/lib/windows/libzstd_static_VS.lib and b/lib/windows/libzstd_static_VS.lib differ diff --git a/lib/windows/libzstdd_static_VS.lib b/lib/windows/libzstdd_static_VS.lib index 5a1192a787..4e39cddfba 100644 Binary files a/lib/windows/libzstdd_static_VS.lib and b/lib/windows/libzstdd_static_VS.lib differ diff --git a/lib/windows64/libwebp.lib b/lib/windows64/libwebp.lib new file mode 100644 index 0000000000..466ea99304 Binary files /dev/null and b/lib/windows64/libwebp.lib differ diff --git a/lib/windows64/libwebpdecoder.lib b/lib/windows64/libwebpdecoder.lib new file mode 100644 index 0000000000..8c8c4f39ba Binary files /dev/null and b/lib/windows64/libwebpdecoder.lib differ diff --git a/lib/windows64/libwebpdemux.lib b/lib/windows64/libwebpdemux.lib new file mode 100644 index 0000000000..684987edca Binary files /dev/null and b/lib/windows64/libwebpdemux.lib differ diff --git a/lib/windows64/libzstd_static.lib b/lib/windows64/libzstd_static.lib index 545b7de107..3308c117d4 100755 Binary files a/lib/windows64/libzstd_static.lib and b/lib/windows64/libzstd_static.lib differ diff --git a/lib/windows64/libzstd_static_VS.lib b/lib/windows64/libzstd_static_VS.lib index ed26567906..acf05498cb 100644 Binary files a/lib/windows64/libzstd_static_VS.lib and b/lib/windows64/libzstd_static_VS.lib differ diff --git a/lib/windows64/libzstdd_static_VS.lib b/lib/windows64/libzstdd_static_VS.lib index 0274f2c03e..ac839fdabb 100644 Binary files a/lib/windows64/libzstdd_static_VS.lib and b/lib/windows64/libzstdd_static_VS.lib differ diff --git a/macOS b/macOS index 01b6edda3a..0b35e0e386 160000 --- a/macOS +++ b/macOS @@ -1 +1 @@ -Subproject commit 01b6edda3ab35602dea5fafeb91bd8e08df9a3f1 +Subproject commit 0b35e0e386bae1d3901c36f8ac2d0a24ee9c274d diff --git a/xLights/BatchRenderDialog.cpp b/xLights/BatchRenderDialog.cpp index 8859eea06d..dbb4055b94 100644 --- a/xLights/BatchRenderDialog.cpp +++ b/xLights/BatchRenderDialog.cpp @@ -164,7 +164,7 @@ void BatchRenderDialog::OnPopupCommand(wxCommandEvent &event) CheckListBox_Sequences->UncheckItem(item); } else if (id == ID_MNU_SELECTHIGH && !isChecked && isSelected) { CheckListBox_Sequences->CheckItem(item); - } else if (id == ID_MNU_SELECTHIGH && isChecked && isSelected) { + } else if (id == ID_MNU_DESELECTHIGH && isChecked && isSelected) { CheckListBox_Sequences->UncheckItem(item); } item = CheckListBox_Sequences->GetNextItem(item); diff --git a/xLights/BitmapCache.cpp b/xLights/BitmapCache.cpp index 567128793e..f891b6ec1f 100644 --- a/xLights/BitmapCache.cpp +++ b/xLights/BitmapCache.cpp @@ -110,7 +110,9 @@ #include "../include/cc_radialout.xpm" #include "../include/save.xpm" #include "../include/delete.xpm" -#include "../include/switch.xpm" +#include "../include/reverse.xpm" +#include "../include/left_shift.xpm" +#include "../include/right_shift.xpm" #include "../include/valuecurvenotselected.xpm" @@ -509,8 +511,12 @@ wxBitmapBundle xlArtProvider::CreateBitmapBundle(const wxArtID& id, return CreateBitmapBundleFromXPMs(sz, "cc_radialin_xpm", {cc_radialin_xpm, cc_radialin_xpm}); } else if ("xlART_cc_radialout_xpm" == id) { return CreateBitmapBundleFromXPMs(sz, "cc_radialout_xpm", {cc_radialout_xpm, cc_radialout_xpm}); - } else if ("xlART_colorpanel_switch_xpm" == id) { - return CreateBitmapBundleFromXPMs(sz, "colorpanel_switch_xpm", {switch_xpm, switch_xpm}); + } else if ("xlART_colorpanel_reverse_xpm" == id) { + return CreateBitmapBundleFromXPMs(sz, "colorpanel_switch_xpm", {reverse_xpm, reverse_xpm}); + } else if ("xlART_colorpanel_left_shift_xpm" == id) { + return CreateBitmapBundleFromXPMs(sz, "colorpanel_left_shift_xpm", { left_shift_xpm, left_shift_xpm }); + } else if ("xlART_colorpanel_right_shift_xpm" == id) { + return CreateBitmapBundleFromXPMs(sz, "colorpanel_right_shift_xpm", { right_shift_xpm, right_shift_xpm }); } else if ("xlART_colorpanel_delete_xpm" == id) { return CreateBitmapBundleFromXPMs(sz, "colorpanel_delete_xpm", {delete_xpm, delete_xpm}); } else if ("xlART_colorpanel_save_xpm" == id) { diff --git a/xLights/CachedFileDownloader.cpp b/xLights/CachedFileDownloader.cpp index 7210b5e9bb..fc5b9821f4 100644 --- a/xLights/CachedFileDownloader.cpp +++ b/xLights/CachedFileDownloader.cpp @@ -144,6 +144,7 @@ void CachedFileDownloader::SaveCache() { static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); + std::lock_guard lock(_cacheItemsLock); if (!Initialize()) { return; @@ -184,6 +185,7 @@ void CachedFileDownloader::LoadCache() { static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); + std::lock_guard lock(_cacheItemsLock); _cacheItems.clear(); if (!Initialize()) @@ -224,6 +226,7 @@ void CachedFileDownloader::LoadCache() FileCacheItem* CachedFileDownloader::Find(wxURI url) { + std::lock_guard lock(_cacheItemsLock); for (const auto& it : _cacheItems) { if (*it == url) @@ -236,7 +239,9 @@ FileCacheItem* CachedFileDownloader::Find(wxURI url) } static std::unique_ptr _defaultCache(nullptr); +static std::mutex _defaultCacheLock; CachedFileDownloader& CachedFileDownloader::GetDefaultCache() { + std::unique_lock lock(_defaultCacheLock); if (_defaultCache.get() == nullptr) { std::unique_ptr tmp(new CachedFileDownloader()); _defaultCache = std::move(tmp); @@ -244,11 +249,12 @@ CachedFileDownloader& CachedFileDownloader::GetDefaultCache() { return *_defaultCache.get(); } -CachedFileDownloader::CachedFileDownloader(const std::string cacheDir) : _cacheDir(cacheDir) +CachedFileDownloader::CachedFileDownloader() : _cacheDir("") { _initialised = false; } bool CachedFileDownloader::Initialize() { + std::lock_guard lock(_cacheItemsLock); if (_initialised) { return _enabled; } @@ -293,6 +299,7 @@ void CachedFileDownloader::ClearCache() static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); logger_base.debug("File Cache cleared."); + std::lock_guard lock(_cacheItemsLock); for (const auto& it : _cacheItems) { it->Delete(); @@ -304,6 +311,7 @@ void CachedFileDownloader::PurgeAgedItems() static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); logger_base.debug("File Cache purging aged items."); + std::lock_guard lock(_cacheItemsLock); for (const auto& it : _cacheItems) { it->PurgeIfAged(); @@ -311,6 +319,7 @@ void CachedFileDownloader::PurgeAgedItems() } int CachedFileDownloader::size() { + std::lock_guard lock(_cacheItemsLock); if (!Initialize()) { return 0; } @@ -320,7 +329,7 @@ int CachedFileDownloader::size() { std::string CachedFileDownloader::GetFile(wxURI url, CACHEFOR cacheFor, const wxString& forceType, wxProgressDialog* prog, int low, int high, bool keepProgress) { static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); - + std::lock_guard lock(_cacheItemsLock); if (!Initialize()) { // because we dont have a valid place to save the cache we cant cache anything beyond this session diff --git a/xLights/CachedFileDownloader.h b/xLights/CachedFileDownloader.h index 4b4745c5de..2b7adcf28f 100644 --- a/xLights/CachedFileDownloader.h +++ b/xLights/CachedFileDownloader.h @@ -14,6 +14,7 @@ #include #include #include +#include class wxProgressDialog; class wxXmlNode; @@ -53,6 +54,7 @@ class CachedFileDownloader { std::string _cacheDir; std::list _cacheItems; + std::recursive_mutex _cacheItemsLock; std::string _cacheFile; bool _initialised; bool _enabled; @@ -63,9 +65,9 @@ class CachedFileDownloader bool Initialize(); FileCacheItem* Find(wxURI url); + CachedFileDownloader(); public: - CachedFileDownloader(const std::string cacheDir = ""); virtual ~CachedFileDownloader(); // erase everything from cache void ClearCache(); diff --git a/xLights/ColorPanel.cpp b/xLights/ColorPanel.cpp index 1b1488df26..a40c98c412 100644 --- a/xLights/ColorPanel.cpp +++ b/xLights/ColorPanel.cpp @@ -44,10 +44,12 @@ #define PALETTE_SIZE 8 //(*IdInit(ColorPanel) -const long ColorPanel::ID_BITMAPBUTTON4 = wxNewId(); +const long ColorPanel::ID_BITMAPBUTTON_ReverseColours = wxNewId(); +const long ColorPanel::ID_BITMAPBUTTON_LeftShiftColours = wxNewId(); +const long ColorPanel::ID_BITMAPBUTTON_RightShiftColours = wxNewId(); const long ColorPanel::ID_CUSTOM1 = wxNewId(); -const long ColorPanel::ID_BITMAPBUTTON3 = wxNewId(); const long ColorPanel::ID_BUTTON1 = wxNewId(); +const long ColorPanel::ID_BITMAPBUTTON3 = wxNewId(); const long ColorPanel::ID_BITMAPBUTTON2 = wxNewId(); const long ColorPanel::ID_CHECKBOX_ResetColorPanel = wxNewId(); const long ColorPanel::ID_STATICTEXT1 = wxNewId(); @@ -251,6 +253,9 @@ ColorPanel::ColorPanel(wxWindow* parent, wxWindowID id,const wxPoint& pos,const _supportsradial = false; //(*Initialize(ColorPanel) + wxBoxSizer* BoxSizer1; + wxBoxSizer* BoxSizer2; + wxBoxSizer* BoxSizer3; wxButton* ButtonColor1; wxFlexGridSizer* FlexGridSizer10; wxFlexGridSizer* FlexGridSizer11; @@ -290,17 +295,26 @@ ColorPanel::ColorPanel(wxWindow* parent, wxWindowID id,const wxPoint& pos,const FlexGridSizer9->Add(FlexGridSizer10, 1, wxALL|wxALIGN_RIGHT, 2); FlexGridSizer11 = new wxFlexGridSizer(0, 3, 0, 0); FlexGridSizer11->AddGrowableCol(1); - BitmapButton_ShuffleColours = new xlSizedBitmapButton(ColorScrollWindow, ID_BITMAPBUTTON4, wxArtProvider::GetBitmapBundle("xlART_colorpanel_switch_xpm", wxART_BUTTON), wxDefaultPosition, wxSize(24,24), wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_BITMAPBUTTON4")); - FlexGridSizer11->Add(BitmapButton_ShuffleColours, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BoxSizer1 = new wxBoxSizer(wxVERTICAL); + BitmapButton_ReverseColours = new xlSizedBitmapButton(ColorScrollWindow, ID_BITMAPBUTTON_ReverseColours, wxArtProvider::GetBitmapBundle("xlART_colorpanel_reverse_xpm", wxART_BUTTON), wxDefaultPosition, wxSize(26,16), wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_BITMAPBUTTON_ReverseColours")); + BoxSizer1->Add(BitmapButton_ReverseColours, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2); + BitmapButton_LeftShiftColours = new xlSizedBitmapButton(ColorScrollWindow, ID_BITMAPBUTTON_LeftShiftColours, wxArtProvider::GetBitmapBundle("xlART_colorpanel_left_shift_xpm", wxART_BUTTON), wxDefaultPosition, wxSize(26,16), wxBU_AUTODRAW, wxDefaultValidator, _T("ID_BITMAPBUTTON_LeftShiftColours")); + BoxSizer1->Add(BitmapButton_LeftShiftColours, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2); + BitmapButton_RightShiftColours = new xlSizedBitmapButton(ColorScrollWindow, ID_BITMAPBUTTON_RightShiftColours, wxArtProvider::GetBitmapBundle("xlART_colorpanel_right_shift_xpm", wxART_BUTTON), wxDefaultPosition, wxSize(26,16), wxBU_AUTODRAW, wxDefaultValidator, _T("ID_BITMAPBUTTON_RightShiftColours")); + BoxSizer1->Add(BitmapButton_RightShiftColours, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2); + FlexGridSizer11->Add(BoxSizer1, 1, wxALL|wxALIGN_TOP|wxALIGN_CENTER_HORIZONTAL, 5); + BoxSizer2 = new wxBoxSizer(wxVERTICAL); BitmapButton_ColourChoice = new ColourList(ColorScrollWindow,ID_CUSTOM1,wxDefaultPosition,wxDefaultSize,ZERO,wxDefaultValidator,_T("ID_CUSTOM1")); - FlexGridSizer11->Add(BitmapButton_ColourChoice, 1, wxALL|wxEXPAND, 2); - BitmapButton_SavePalette = new xlSizedBitmapButton(ColorScrollWindow, ID_BITMAPBUTTON3, wxArtProvider::GetBitmapBundle("xlART_colorpanel_save_xpm", wxART_BUTTON), wxDefaultPosition, wxSize(24,24), wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_BITMAPBUTTON3")); - FlexGridSizer11->Add(BitmapButton_SavePalette, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); - FlexGridSizer11->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BoxSizer2->Add(BitmapButton_ColourChoice, 1, wxALL|wxEXPAND, 2); ButtonColor1 = new wxButton(ColorScrollWindow, ID_BUTTON1, _("Update"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1")); - FlexGridSizer11->Add(ButtonColor1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BoxSizer2->Add(ButtonColor1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer11->Add(BoxSizer2, 1, wxALL|wxALIGN_TOP|wxALIGN_CENTER_HORIZONTAL, 5); + BoxSizer3 = new wxBoxSizer(wxVERTICAL); + BitmapButton_SavePalette = new xlSizedBitmapButton(ColorScrollWindow, ID_BITMAPBUTTON3, wxArtProvider::GetBitmapBundle("xlART_colorpanel_save_xpm", wxART_BUTTON), wxDefaultPosition, wxSize(24,24), wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_BITMAPBUTTON3")); + BoxSizer3->Add(BitmapButton_SavePalette, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); BitmapButton_DeletePalette = new xlSizedBitmapButton(ColorScrollWindow, ID_BITMAPBUTTON2, wxArtProvider::GetBitmapBundle("xlART_colorpanel_delete_xpm", wxART_BUTTON), wxDefaultPosition, wxSize(24,24), wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_BITMAPBUTTON2")); - FlexGridSizer11->Add(BitmapButton_DeletePalette, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BoxSizer3->Add(BitmapButton_DeletePalette, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer11->Add(BoxSizer3, 1, wxALL|wxALIGN_TOP|wxALIGN_CENTER_HORIZONTAL, 5); FlexGridSizer9->Add(FlexGridSizer11, 1, wxALL|wxALIGN_LEFT, 2); FlexGridSizer9->Add(-1,-1,1, wxALL|wxEXPAND, 5); FlexGridSizer5->Add(FlexGridSizer9, 1, wxALL|wxEXPAND, 0); @@ -412,14 +426,22 @@ ColorPanel::ColorPanel(wxWindow* parent, wxWindowID id,const wxPoint& pos,const FlexGridSizer12->Add(TextCtrl_Color_ValueAdjust, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2); FlexGridSizer4->Add(FlexGridSizer12, 1, wxALL|wxEXPAND, 2); ColorScrollWindow->SetSizer(FlexGridSizer4); + FlexGridSizer4->Fit(ColorScrollWindow); + FlexGridSizer4->SetSizeHints(ColorScrollWindow); FlexGridSizer3->Add(ColorScrollWindow, 1, wxALL|wxEXPAND, 0); Panel_Sizer->SetSizer(FlexGridSizer3); + FlexGridSizer3->Fit(Panel_Sizer); + FlexGridSizer3->SetSizeHints(Panel_Sizer); FlexGridSizer1->Add(Panel_Sizer, 1, wxALL|wxEXPAND, 0); SetSizer(FlexGridSizer1); + FlexGridSizer1->Fit(this); + FlexGridSizer1->SetSizeHints(this); - Connect(ID_BITMAPBUTTON4,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ColorPanel::OnBitmapButton_ShuffleColoursClick); - Connect(ID_BITMAPBUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ColorPanel::OnBitmapButton_SavePaletteClick); + Connect(ID_BITMAPBUTTON_ReverseColours, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&ColorPanel::OnBitmapButton_ReverseColoursClick); + Connect(ID_BITMAPBUTTON_LeftShiftColours, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&ColorPanel::OnBitmapButton_ShiftColoursLeftClick); + Connect(ID_BITMAPBUTTON_RightShiftColours,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ColorPanel::OnBitmapButton_ShiftColoursRightClick); Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ColorPanel::OnUpdateColorClick); + Connect(ID_BITMAPBUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ColorPanel::OnBitmapButton_SavePaletteClick); Connect(ID_BITMAPBUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ColorPanel::OnBitmapButton_DeletePaletteClick); Connect(ID_CHECKBOX_ResetColorPanel,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&ColorPanel::OnCheckBox_ResetColorPanelClick); Connect(ID_CHECKBOX_Chroma,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&ColorPanel::OnCheckBox_EnableChromakeyClick); @@ -1374,7 +1396,7 @@ void ColorPanel::OnBitmapButton_DeletePaletteClick(wxCommandEvent& event) ValidateWindow(); } -void ColorPanel::OnBitmapButton_ShuffleColoursClick(wxCommandEvent& event) +void ColorPanel::OnBitmapButton_ReverseColoursClick(wxCommandEvent& event) { std::string pal = GetCurrentPalette(); @@ -1398,6 +1420,82 @@ void ColorPanel::OnBitmapButton_ShuffleColoursClick(wxCommandEvent& event) ValidateWindow(); } +void ColorPanel::OnBitmapButton_ShiftColoursLeftClick(wxCommandEvent& event) +{ + std::string pal = GetCurrentPalette(); + + wxArrayString as = wxSplit(pal, ','); + + bool zeroActive = as[0].Contains("Active"); + std::string zeroItem = as[0].ToStdString(); + + for (size_t i = 0; i < PALETTE_SIZE - 1; ++i) + { + if (as[i + 1].Contains("Active")) + { + buttons[i]->GetValue()->Deserialise(as[i + 1].ToStdString()); + buttons[i]->SetActive(true); + buttons[i]->Refresh(); + } + else + { + buttons[i]->SetColor(as[i + 1].ToStdString()); + buttons[i]->Refresh(); + } + } + if (zeroActive) + { + buttons[PALETTE_SIZE - 1]->GetValue()->Deserialise(zeroItem); + buttons[PALETTE_SIZE - 1]->SetActive(true); + buttons[PALETTE_SIZE - 1]->Refresh(); + } + else + { + buttons[PALETTE_SIZE - 1]->SetColor(zeroItem); + buttons[PALETTE_SIZE - 1]->Refresh(); + } + FireChangeEvent(); + ValidateWindow(); +} + +void ColorPanel::OnBitmapButton_ShiftColoursRightClick(wxCommandEvent& event) +{ + std::string pal = GetCurrentPalette(); + + wxArrayString as = wxSplit(pal, ','); + + bool lastActive = as[PALETTE_SIZE - 1].Contains("Active"); + std::string lastItem = as[PALETTE_SIZE - 1].ToStdString(); + + for (size_t i = PALETTE_SIZE - 1; i > 0; --i) + { + if (as[i - 1].Contains("Active")) + { + buttons[i]->GetValue()->Deserialise(as[i - 1].ToStdString()); + buttons[i]->SetActive(true); + buttons[i]->Refresh(); + } + else + { + buttons[i]->SetColor(as[i - 1].ToStdString()); + buttons[i]->Refresh(); + } + } + if (lastActive) + { + buttons[0]->GetValue()->Deserialise(lastItem); + buttons[0]->SetActive(true); + buttons[0]->Refresh(); + } + else + { + buttons[0]->SetColor(lastItem); + buttons[0]->Refresh(); + } + FireChangeEvent(); + ValidateWindow(); +} + void ColorPanel::OnCCButtonClick(wxCommandEvent& event) { wxBitmapButton* bb = static_cast(event.GetEventObject()); diff --git a/xLights/ColorPanel.h b/xLights/ColorPanel.h index e86b8c1940..df951f79ac 100644 --- a/xLights/ColorPanel.h +++ b/xLights/ColorPanel.h @@ -77,9 +77,9 @@ class ColorPanel: public xlEffectPanel bool PaletteChanged; bool EffectChanged; - + void SetDefaultPalette(); - + static double GetSettingVCMin(const std::string& name) { if (name == "C_VALUECURVE_Brightness") @@ -175,17 +175,21 @@ class ColorPanel: public xlEffectPanel xlLockButton* BitmapButton_MusicSparkles; xlLockButton* BitmapButton_SparkleFrequency; xlSizedBitmapButton* BitmapButton_DeletePalette; + xlSizedBitmapButton* BitmapButton_LeftShiftColours; + xlSizedBitmapButton* BitmapButton_ReverseColours; + xlSizedBitmapButton* BitmapButton_RightShiftColours; xlSizedBitmapButton* BitmapButton_SavePalette; - xlSizedBitmapButton* BitmapButton_ShuffleColours; //*) protected: //(*Identifiers(ColorPanel) - static const long ID_BITMAPBUTTON4; + static const long ID_BITMAPBUTTON_ReverseColours; + static const long ID_BITMAPBUTTON_LeftShiftColours; + static const long ID_BITMAPBUTTON_RightShiftColours; static const long ID_CUSTOM1; - static const long ID_BITMAPBUTTON3; static const long ID_BUTTON1; + static const long ID_BITMAPBUTTON3; static const long ID_BITMAPBUTTON2; static const long ID_CHECKBOX_ResetColorPanel; static const long ID_STATICTEXT1; @@ -235,10 +239,12 @@ class ColorPanel: public xlEffectPanel void OnCheckBox_MusicSparklesClick(wxCommandEvent& event); void OnBitmapButton_SavePaletteClick(wxCommandEvent& event); void OnBitmapButton_DeletePaletteClick(wxCommandEvent& event); - void OnBitmapButton_ShuffleColoursClick(wxCommandEvent& event); + void OnBitmapButton_ReverseColoursClick(wxCommandEvent& event); void UpdateTouchBarSlider(wxScrollEvent& event); void OnCheckBox_ResetColorPanelClick(wxCommandEvent& event); void OnCheckBox_EnableChromakeyClick(wxCommandEvent& event); + void OnBitmapButton_ShiftColoursLeftClick(wxCommandEvent& event); + void OnBitmapButton_ShiftColoursRightClick(wxCommandEvent& event); //*) void OnCCButtonClick(wxCommandEvent& event); @@ -247,7 +253,7 @@ class ColorPanel: public xlEffectPanel void OnColourChoiceDropDown(wxCommandEvent& event); void OnColourChoiceSelect(wxCommandEvent& event); wxColourData colorData; - + std::vector buttons; std::vector checkBoxes; std::map lastColors; diff --git a/xLights/ControllerModelDialog.cpp b/xLights/ControllerModelDialog.cpp index 1b8cfcb587..f24ff1fe15 100644 --- a/xLights/ControllerModelDialog.cpp +++ b/xLights/ControllerModelDialog.cpp @@ -40,6 +40,7 @@ #include "outputs/Output.h" #include +#include //(*IdInit(ControllerModelDialog) const long ControllerModelDialog::ID_PANEL1 = wxNewId(); @@ -70,7 +71,13 @@ const long ControllerModelDialog::CONTROLLER_BRIGHTNESS = wxNewId(); const long ControllerModelDialog::CONTROLLER_BRIGHTNESSCLEAR = wxNewId(); const long ControllerModelDialog::CONTROLLER_REMOVEALLMODELS = wxNewId(); const long ControllerModelDialog::CONTROLLER_SMARTREMOTETYPE = wxNewId(); +const long ControllerModelDialog::CONTROLLER_REMOVESMARTREMOTE = wxNewId(); +const long ControllerModelDialog::CONTROLLER_SETSMARTREMOTE = wxNewId(); const long ControllerModelDialog::CONTROLLER_MODEL_STRINGS = wxNewId(); +const long ControllerModelDialog::CONTROLLER_STARTNULLS = wxNewId(); +const long ControllerModelDialog::CONTROLLER_ENDNULLS = wxNewId(); +const long ControllerModelDialog::CONTROLLER_COLORORDER = wxNewId(); +const long ControllerModelDialog::CONTROLLER_GROUPCOUNT = wxNewId(); BEGIN_EVENT_TABLE(ControllerModelDialog, wxDialog) //(*EventTable(ControllerModelDialog) @@ -117,6 +124,8 @@ wxColour __darkYellow(60, 60, 0, wxALPHA_OPAQUE); wxColour __lightOrange(255, 201, 150, wxALPHA_OPAQUE); wxColour __darkOrange(150, 54, 3, wxALPHA_OPAQUE); wxColour __magenta(255, 0, 255, wxALPHA_OPAQUE); +wxColour __lightShadow(211, 211, 211); +wxColour __darkShadow(30, 24, 24); wxColour __textForeground; wxBrush __invalidBrush; wxBrush __dropTargetBrush; @@ -135,6 +144,7 @@ wxBrush __modelSRCBrush; wxBrush __modelSRDBrush; wxBrush __modelSREBrush; wxBrush __modelSRFBrush; +wxBrush __modelShadowBrush; wxColour __modelSRAText; wxColour __modelSRBText; wxColour __modelSRCText; @@ -189,6 +199,7 @@ void SetColours(bool printing) __modelSRDBrush.SetColour(__darkAqua); __modelSREBrush.SetColour(__darkPink); __modelSRFBrush.SetColour(__darkYellow); + __modelShadowBrush.SetColour(__darkShadow); __backgroundPen.SetColour(__charcoal); __backgroundBrush.SetColour(__charcoal); __modelSRAText = __lightGreen; @@ -212,6 +223,7 @@ void SetColours(bool printing) __modelSRDBrush.SetColour(__lightAqua); __modelSREBrush.SetColour(__lightPink); __modelSRFBrush.SetColour(__lightYellow); + __modelShadowBrush.SetColour(__lightShadow); __backgroundPen.SetColour(*wxWHITE); __backgroundBrush.SetColour(*wxWHITE); __modelSRAText = *wxBLACK; @@ -599,6 +611,12 @@ class PortCMObject : public BaseCMObject if (_caps != nullptr && (_type == PORTTYPE::PIXEL) && _caps->SupportsSmartRemotes() && (_caps->GetSmartRemoteTypes().size() > 1)) { mnu.Append(ControllerModelDialog::CONTROLLER_SMARTREMOTETYPE, "Set Smart Remote Type"); } + if (_caps != nullptr && (_type == PORTTYPE::PIXEL) && _caps->SupportsSmartRemotes()) { + mnu.Append(ControllerModelDialog::CONTROLLER_SETSMARTREMOTE, "Set Smart Remote ID and Increment"); + } + if (_caps != nullptr && (_type == PORTTYPE::PIXEL) && _caps->SupportsSmartRemotes() && GetSmartRemoteCount() > 0) { + mnu.Append(ControllerModelDialog::CONTROLLER_REMOVESMARTREMOTE, "Remove Smart Remote"); + } mnu.Append(ControllerModelDialog::CONTROLLER_REMOVEPORTMODELS, "Remove All Models From Port"); if (_caps != nullptr && ((_type == PORTTYPE::PIXEL && _caps->GetMaxPixelPort() > 1) || (_type == PORTTYPE::SERIAL && _caps->GetMaxSerialPort() > 1))) { mnu.Append(ControllerModelDialog::CONTROLLER_MOVEMODELSTOPORT, "Move All Models To Port"); @@ -740,6 +758,50 @@ class PortCMObject : public BaseCMObject } return true; } + } else if (id == ControllerModelDialog::CONTROLLER_REMOVESMARTREMOTE) { + int basePort = GetBasePort(); + for (uint8_t p = 0; p < 4; ++p) { + _cud->GetControllerPixelPort(basePort + p)->ClearSmartRemoteOnAllModels(); + } + return true; + } else if (id == ControllerModelDialog::CONTROLLER_SETSMARTREMOTE) { + wxArrayString choices; + int sr_count = _caps->GetSmartRemoteCount(); + if (_caps->GetVendor() == "HinksPix") { + for (int i = 0; i < sr_count; i++) { + choices.Add(wxString::Format("%d", i)); + } + } else { + for (int i = 0; i < sr_count; i++) { + choices.Add(wxString(char(65 + i))); + } + } + int selection{ -1 }; + if (GetUDPort()->GetModels().size() != 0 && nullptr != GetUDPort()->GetModels().front()) { + selection = GetUDPort()->GetModels().front()->GetSmartRemote() - 1;//0=none, 1=A,Falcon/FPP, 1=0,HinksPix + } + wxSingleChoiceDialog dlg(parent, "Port Smart Remote ID", "Smart Remote ID", choices); + if (selection >= 0 && selection < choices.size()) { + dlg.SetSelection(selection); + } + if (dlg.ShowModal() == wxID_OK) { + int startId = dlg.GetSelection(); + std::string lastName; + for (const auto& it : GetUDPort()->GetModels()) { + if (lastName == it->GetModel()->Name()) {//skip multistring models sequentuial ports + continue; + } + it->GetModel()->SetSmartRemote(startId + 1); + int max_cas = std::min(it->GetModel()->GetSRMaxCascade(), (int)std::ceil(it->GetModel()->GetNumStrings() / 4.0)); + max_cas = std::max(max_cas, 1); + startId += max_cas; + if (startId >= sr_count) { + startId = (sr_count - 1); + } + lastName = it->GetModel()->Name(); + } + } + return true; } return false; } @@ -1117,10 +1179,18 @@ class SRCMObject : public BaseCMObject auto mi = srMenu->AppendRadioItem(wxNewId(), "None"); if (_smartRemote == 0) mi->Check(); - for (int i = 0; i < srcount; i++) { - mi = srMenu->AppendRadioItem(wxNewId(), wxString(char(65 + i))); - if (_smartRemote == i + 1) - mi->Check(); + if (_caps->GetVendor() == "HinksPix") { + for (int i = 0; i < srcount; i++) { + mi = srMenu->AppendRadioItem(wxNewId(), wxString::Format("%d", i)); + if (_smartRemote == i + 1) + mi->Check(); + } + } else { + for (int i = 0; i < srcount; i++) { + mi = srMenu->AppendRadioItem(wxNewId(), wxString(char(65 + i))); + if (_smartRemote == i + 1) + mi->Check(); + } } srMenu->Connect(wxEVT_MENU, (wxObjectEventFunction)&ControllerModelDialog::OnPopupCommand, nullptr, cmd); @@ -1134,6 +1204,9 @@ class SRCMObject : public BaseCMObject if (label == "None") { SetAllModelsToReceiver(_port, _smartRemote, 0); return true; + } else if ((label >= "0" && label <= "9") || (label >= "10" && label <= "19")) { + SetAllModelsToReceiver(_port, _smartRemote, wxAtoi(label) + 1); + return true; } else if (label >= "A" && label <= "Z") { SetAllModelsToReceiver(_port, _smartRemote, int(label[0]) - 64); return true; @@ -1153,7 +1226,8 @@ class ModelCMObject : public BaseCMObject int _string = 0; UDControllerPort* _port = nullptr; int _virtualString; - bool _isShadow = false; + bool _isShadowed = false; + bool _isShadowFor = false; public: ModelCMObject(UDControllerPort* port, int virtualString, const std::string& name, const std::string displayName, ModelManager* mm, UDController* cud, ControllerCaps* caps, wxPoint location, wxSize size, int style, double scale) : @@ -1170,10 +1244,12 @@ class ModelCMObject : public BaseCMObject } auto cmn = displayName.substr(0, displayName.find("-str-")); if (GetModel() != nullptr) { - _isShadow = GetModel()->GetShadowModelFor() != "" || GetModel()->GetModelManager().IsModelShadowing(GetModel()); + _isShadowed = GetModel()->GetModelManager().IsModelShadowing(GetModel()); + _isShadowFor = GetModel()->GetShadowModelFor() != ""; } else if (cmn != "" && (*mm)[cmn] != nullptr) { auto m = (*mm)[cmn]; - _isShadow = m->GetShadowModelFor() != "" || mm->IsModelShadowing(m); + _isShadowed = mm->IsModelShadowing(m); + _isShadowFor = m->GetShadowModelFor() != ""; } } @@ -1295,7 +1371,11 @@ class ModelCMObject : public BaseCMObject wxSize sz = _size; sz = sz.Scale(scale, scale); - if (_isShadow) { + if (_isShadowed) { + dc.SetPen(wxPen(dc.GetPen().GetColour(), dc.GetPen().GetWidth(), wxPENSTYLE_LONG_DASH)); + dc.SetBrush(__modelShadowBrush); + } + if (_isShadowFor) { dc.SetPen(wxPen(dc.GetPen().GetColour(), dc.GetPen().GetWidth(), wxPENSTYLE_LONG_DASH)); } dc.DrawRectangle(location + offset, sz); @@ -1366,21 +1446,28 @@ class ModelCMObject : public BaseCMObject if (!GetModel()->HasSingleNode(GetModel()->GetStringType()) && GetModel()->SupportsChangingStringCount()) { mnu.AppendSeparator(); mnu.Append(ControllerModelDialog::CONTROLLER_MODEL_STRINGS, "Change String Count"); - mnu.AppendSeparator(); } if (_caps->SupportsSmartRemotes()) { wxMenu* srMenu = new wxMenu(); + mnu.AppendSeparator(); int srcount = _caps->GetSmartRemoteCount(); auto mi = srMenu->AppendRadioItem(wxNewId(), "None"); - if (GetModel()->GetSmartRemote() == 0) + if (GetModel()->GetSmartRemote() == 0){ mi->Check(); + } + for (int i = 0; i < srcount; i++) { - mi = srMenu->AppendRadioItem(wxNewId(), wxString(char(65 + i))); - if (GetModel()->GetSmartRemote() == i + 1) + if (_caps->GetVendor() == "HinksPix") { + mi = srMenu->AppendRadioItem(wxNewId(), wxString::Format("%d", i), "SR Port"); + } else { + mi = srMenu->AppendRadioItem(wxNewId(), wxString(char(65 + i)), "SR Port"); + } + if (GetModel()->GetSmartRemote() == i + 1) { mi->Check(); + } } if (_caps->GetSmartRemoteTypes().size() > 1) { @@ -1401,9 +1488,10 @@ class ModelCMObject : public BaseCMObject wxMenu* srMax = new wxMenu(); for (int i = 0; i < srcount; i++) { - mi = srMax->AppendRadioItem(wxNewId(), wxString::Format("%d", i + 1)); - if (GetModel()->GetSRMaxCascade() == i + 1) + mi = srMax->AppendRadioItem(wxNewId(), wxString::Format("%d", i + 1), "Cascade"); + if (GetModel()->GetSRMaxCascade() == i + 1) { mi->Check(); + } } srMenu->AppendSubMenu(srMax, "Cascaded Remotes"); @@ -1420,6 +1508,19 @@ class ModelCMObject : public BaseCMObject mnu.Append(ControllerModelDialog::CONTROLLER_BRIGHTNESSCLEAR, "Clear Brightness"); } } + if (_caps->SupportsPixelPortNullPixels()) { + mnu.Append(ControllerModelDialog::CONTROLLER_STARTNULLS, "Set Start Nulls"); + } + if (_caps->SupportsPixelPortEndNullPixels()) { + mnu.Append(ControllerModelDialog::CONTROLLER_ENDNULLS, "Set End Nulls"); + } + if (_caps->SupportsPixelPortColourOrder()) { + mnu.Append(ControllerModelDialog::CONTROLLER_COLORORDER, "Set Color Order"); + } + if (_caps->SupportsPixelPortGrouping()) { + mnu.Append(ControllerModelDialog::CONTROLLER_GROUPCOUNT, "Set Group Count"); + } + } else if (GetModel() != nullptr && GetModel()->IsSerialProtocol()) { mnu.AppendSeparator(); mnu.Append(ControllerModelDialog::CONTROLLER_DMXCHANNEL, "Set Channel"); @@ -1462,6 +1563,35 @@ class ModelCMObject : public BaseCMObject GetModel()->SetControllerBrightness(dlg.GetValue()); } return true; + } else if (id == ControllerModelDialog::CONTROLLER_STARTNULLS) { + wxNumberEntryDialog dlg(parent, "Enter the Model Start Nulls", "Start Nulls", "Start Nulls", GetModel()->GetControllerStartNulls(), 0, 100); + if (dlg.ShowModal() == wxID_OK) { + GetModel()->SetControllerStartNulls(dlg.GetValue()); + } + return true; + } else if (id == ControllerModelDialog::CONTROLLER_ENDNULLS) { + wxNumberEntryDialog dlg(parent, "Enter the End Nulls", "End Nulls", "Model End Nulls", GetModel()->GetControllerEndNulls(), 0, 100); + if (dlg.ShowModal() == wxID_OK) { + GetModel()->SetControllerEndNulls(dlg.GetValue()); + } + return true; + } else if (id == ControllerModelDialog::CONTROLLER_COLORORDER) { + auto choices = Model::CONTROLLER_COLORORDER; + int selection = choices.Index(GetModel()->GetControllerColorOrder()); + wxSingleChoiceDialog dlg(parent, "Model Color Order", "Color Order", choices); + if (selection >= 0 && selection < choices.size()) { + dlg.SetSelection(selection); + } + if (dlg.ShowModal() == wxID_OK) { + GetModel()->SetControllerColorOrder(choices[dlg.GetSelection()]); + } + return true; + } else if (id == ControllerModelDialog::CONTROLLER_GROUPCOUNT) { + wxNumberEntryDialog dlg(parent, "Enter the Group Count", "Group Count", "Model Group Count", GetModel()->GetControllerGroupCount(), 1, 500); + if (dlg.ShowModal() == wxID_OK) { + GetModel()->SetControllerGroupCount(dlg.GetValue()); + } + return true; } else if (id == ControllerModelDialog::CONTROLLER_BRIGHTNESSCLEAR) { GetModel()->ClearControllerBrightness(); return true; @@ -1476,6 +1606,7 @@ class ModelCMObject : public BaseCMObject return true; } else { wxString label = ((wxMenu*)event.GetEventObject())->GetLabelText(id); + wxString title = ((wxMenu*)event.GetEventObject())->GetHelpString(id); auto const types = GetModel()->GetSmartRemoteTypes(); if (std::find(types.begin(), types.end(), label.ToStdString()) != types.end()) { int const port = GetModel()->GetControllerPort(); @@ -1493,10 +1624,14 @@ class ModelCMObject : public BaseCMObject } else if (label == "None") { GetModel()->SetSmartRemote(0); return true; - } else if (label >= "A" && label <= "Z") { - GetModel()->SetSmartRemote(int(label[0]) - 64); + } else if (title == "SR Port") { + if (label >= "A" && label <= "Z") { + GetModel()->SetSmartRemote(int(label[0]) - 64); + return true; + } + GetModel()->SetSmartRemote(wxAtoi(label) + 1); return true; - } else { + } else if (title == "Cascade") { int max = wxAtoi(label); if (max >= 1) { GetModel()->SetSRMaxCascade(max); @@ -1978,7 +2113,6 @@ void ControllerModelDialog::ReloadModels() std::string check; if (_caps != nullptr) { _cud->Check(_caps, check); - TextCtrl_Check->SetValue(check); } while (_models.size() > 0) { @@ -1993,6 +2127,25 @@ void ControllerModelDialog::ReloadModels() FixDMXChannels(); + for (const auto& it : *_mm) { + if (it.second->GetDisplayAs() != "ModelGroup") { + if (_controller->ContainsChannels(it.second->GetFirstChannel(), it.second->GetLastChannel())) { + auto shadows = it.second->GetShadowedBy(); + if (shadows.size() > 0) { + std::string sh; + for (const auto& it : shadows) { + if (sh != "") + sh += ", "; + sh += it; + } + check += "WARN: " + it.second->Name() + " is shadowed by " + sh + ".\n "; + } + } + } + } + + TextCtrl_Check->SetValue(check); + for (const auto& it : *_mm) { if (it.second->GetDisplayAs() != "ModelGroup") { if (_cud->GetControllerPortModel(it.second->GetName(), 0) == nullptr && @@ -3666,9 +3819,7 @@ std::string ControllerModelDialog::GetModelTooltip(ModelCMObject* mob) if (!isSubsequentString) { sr += wxString::Format("\nSmart Remote Type: %s", m->GetSmartRemoteType()); sr += wxString::Format("\nSmart Remote Cascade Down Port: %s", toStr(m->GetSRCascadeOnPort())); - if (m->GetSRCascadeOnPort()) { - sr += wxString::Format("\nSmart Remote Cascade Length: %d", m->GetSRMaxCascade()); - } + sr += wxString::Format("\nSmart Remote Cascade Length: %d", m->GetSRMaxCascade()); } sr += "\n"; } diff --git a/xLights/ControllerModelDialog.h b/xLights/ControllerModelDialog.h index 5f0eb8860a..55a140f9f3 100644 --- a/xLights/ControllerModelDialog.h +++ b/xLights/ControllerModelDialog.h @@ -127,12 +127,18 @@ class ControllerModelDialog: public wxDialog static const long CONTROLLER_CASCADEDOWNPORT; static const long CONTROLLER_DMXCHANNELCHAIN; static const long CONTROLLER_PROTOCOL; + static const long CONTROLLER_SETSMARTREMOTE; static const long CONTROLLER_REMOVEPORTMODELS; static const long CONTROLLER_MOVEMODELSTOPORT; static const long CONTROLLER_BRIGHTNESS; static const long CONTROLLER_BRIGHTNESSCLEAR; static const long CONTROLLER_SMARTREMOTETYPE; + static const long CONTROLLER_REMOVESMARTREMOTE; static const long CONTROLLER_MODEL_STRINGS; + static const long CONTROLLER_STARTNULLS; + static const long CONTROLLER_ENDNULLS; + static const long CONTROLLER_COLORORDER; + static const long CONTROLLER_GROUPCOUNT; wxBitmap RenderPicture(int startY, int startX, int width, int height, wxString const& pageName); void DropFromModels(const wxPoint& location, const std::string& name, wxPanel* target); diff --git a/xLights/EditAliasesDialog.cpp b/xLights/EditAliasesDialog.cpp new file mode 100644 index 0000000000..dd482f0a9b --- /dev/null +++ b/xLights/EditAliasesDialog.cpp @@ -0,0 +1,135 @@ +#include "EditAliasesDialog.h" +#include "models/Model.h" + +//(*InternalHeaders(EditAliasesDialog) +#include +#include +//*) + +//(*IdInit(EditAliasesDialog) +const long EditAliasesDialog::ID_LISTBOX1 = wxNewId(); +const long EditAliasesDialog::ID_BUTTON1 = wxNewId(); +const long EditAliasesDialog::ID_BUTTON2 = wxNewId(); +const long EditAliasesDialog::ID_BUTTON3 = wxNewId(); +const long EditAliasesDialog::ID_BUTTON4 = wxNewId(); +//*) + +BEGIN_EVENT_TABLE(EditAliasesDialog,wxDialog) + //(*EventTable(EditAliasesDialog) + //*) +END_EVENT_TABLE() + +EditAliasesDialog::EditAliasesDialog(wxWindow* parent, Model* m, wxWindowID id, const wxPoint& pos, const wxSize& size) : + _m(m) +{ + //(*Initialize(EditAliasesDialog) + wxFlexGridSizer* FlexGridSizer1; + wxFlexGridSizer* FlexGridSizer2; + wxFlexGridSizer* FlexGridSizer3; + + Create(parent, wxID_ANY, _("Model Aliases"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxRESIZE_BORDER|wxMAXIMIZE_BOX, _T("wxID_ANY")); + FlexGridSizer1 = new wxFlexGridSizer(0, 2, 0, 0); + FlexGridSizer1->AddGrowableCol(0); + FlexGridSizer1->AddGrowableRow(0); + ListBoxAliases = new wxListBox(this, ID_LISTBOX1, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_SINGLE|wxLB_SORT, wxDefaultValidator, _T("ID_LISTBOX1")); + FlexGridSizer1->Add(ListBoxAliases, 1, wxALL|wxEXPAND, 5); + FlexGridSizer2 = new wxFlexGridSizer(0, 1, 0, 0); + ButtonAdd = new wxButton(this, ID_BUTTON1, _("Add"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1")); + FlexGridSizer2->Add(ButtonAdd, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + ButtonDelete = new wxButton(this, ID_BUTTON2, _("Delete"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2")); + FlexGridSizer2->Add(ButtonDelete, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer1->Add(FlexGridSizer2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer3 = new wxFlexGridSizer(0, 3, 0, 0); + ButtonOk = new wxButton(this, ID_BUTTON3, _("Ok"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3")); + ButtonOk->SetDefault(); + FlexGridSizer3->Add(ButtonOk, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + ButtonCancel = new wxButton(this, ID_BUTTON4, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON4")); + FlexGridSizer3->Add(ButtonCancel, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer1->Add(FlexGridSizer3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + SetSizer(FlexGridSizer1); + FlexGridSizer1->Fit(this); + FlexGridSizer1->SetSizeHints(this); + + Connect(ID_LISTBOX1,wxEVT_COMMAND_LISTBOX_SELECTED,(wxObjectEventFunction)&EditAliasesDialog::OnListBoxAliasesSelect); + Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EditAliasesDialog::OnButtonAddClick); + Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EditAliasesDialog::OnButtonDeleteClick); + Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EditAliasesDialog::OnButtonOkClick); + Connect(ID_BUTTON4,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EditAliasesDialog::OnButtonCancelClick); + //*) + + for (const auto& it : _m->GetAliases()) + { + ListBoxAliases->Append(it); + } + + SetEscapeId(ID_BUTTON4); + + ValidateWindow(); +} + +EditAliasesDialog::~EditAliasesDialog() +{ + //(*Destroy(EditAliasesDialog) + //*) +} + +void EditAliasesDialog::ValidateWindow() +{ + if (ListBoxAliases->GetSelection()>= 0) + { + ButtonDelete->Enable(); + } + else + { + ButtonDelete->Disable(); + } +} + +void EditAliasesDialog::OnButtonAddClick(wxCommandEvent& event) +{ + wxTextEntryDialog te(this, "Alias to add", "Add an alias"); + + if (te.ShowModal() == wxID_OK) { + auto add = te.GetValue().Lower(); + + bool found = false; + for (int i = 0; !found && i < ListBoxAliases->GetCount(); ++i) { + if (ListBoxAliases->GetString(i) == add) + found = true; + } + + if (!found) { + ListBoxAliases->Append(add); + } + } + ValidateWindow(); +} + +void EditAliasesDialog::OnButtonDeleteClick(wxCommandEvent& event) +{ + if (ListBoxAliases->GetSelection() >= 0) { + ListBoxAliases->Delete(ListBoxAliases->GetSelection()); + } + ValidateWindow(); +} + +void EditAliasesDialog::OnButtonOkClick(wxCommandEvent& event) +{ + std::list aliases; + for (int i = 0; i < ListBoxAliases->GetCount(); ++i) + { + aliases.push_back(ListBoxAliases->GetString(i)); + } + _m->SetAliases(aliases); + EndDialog(wxID_OK); +} + +void EditAliasesDialog::OnButtonCancelClick(wxCommandEvent& event) +{ + EndDialog(wxID_CANCEL); +} + +void EditAliasesDialog::OnListBoxAliasesSelect(wxCommandEvent& event) +{ + ValidateWindow(); +} diff --git a/xLights/EditAliasesDialog.h b/xLights/EditAliasesDialog.h new file mode 100644 index 0000000000..adce72c4f9 --- /dev/null +++ b/xLights/EditAliasesDialog.h @@ -0,0 +1,54 @@ +#ifndef EDITALIASESDIALOG_H +#define EDITALIASESDIALOG_H + +//(*Headers(EditAliasesDialog) +#include +#include +#include +#include +//*) + +class Model; + +class EditAliasesDialog: public wxDialog +{ + public: + + EditAliasesDialog(wxWindow* parent, Model* mg, wxWindowID id=wxID_ANY,const wxPoint& pos=wxDefaultPosition,const wxSize& size=wxDefaultSize); + virtual ~EditAliasesDialog(); + + //(*Declarations(EditAliasesDialog) + wxButton* ButtonAdd; + wxButton* ButtonCancel; + wxButton* ButtonDelete; + wxButton* ButtonOk; + wxListBox* ListBoxAliases; + //*) + + protected: + + Model* _m = nullptr; + void ValidateWindow(); + + //(*Identifiers(EditAliasesDialog) + static const long ID_LISTBOX1; + static const long ID_BUTTON1; + static const long ID_BUTTON2; + static const long ID_BUTTON3; + static const long ID_BUTTON4; + //*) + + private: + + //(*Handlers(EditAliasesDialog) + void OnButtonAddClick(wxCommandEvent& event); + void OnButtonDeleteClick(wxCommandEvent& event); + void OnButtonOkClick(wxCommandEvent& event); + void OnButtonCancelClick(wxCommandEvent& event); + void OnListBoxAliasesSelect(wxCommandEvent& event); + //*) + + DECLARE_EVENT_TABLE() +}; + +#endif diff --git a/xLights/FSEQFile.cpp b/xLights/FSEQFile.cpp index e33574fac9..e0cd7b3d0a 100644 --- a/xLights/FSEQFile.cpp +++ b/xLights/FSEQFile.cpp @@ -101,7 +101,35 @@ inline void AddSlowStorageWarning() { #endif #ifndef NO_ZSTD +#ifndef LINUX +//zstd on Debian 11 doesn't have the thread pool stuff +#define ZSTD_STATIC_LINKING_ONLY +#endif #include +#include + +#ifdef ZSTD_STATIC_LINKING_ONLY +class ZSTDThreadPoolHolder { + struct POOL_ctx_s* pool = nullptr; +public: + ZSTDThreadPoolHolder() {} + ~ZSTDThreadPoolHolder() { + if (pool) { + ZSTD_freeThreadPool(pool); + } + } + ZSTD_threadPool* getPool() { + if (pool == nullptr) { + pool = ZSTD_createThreadPool(std::thread::hardware_concurrency()); + } + return pool; + } + + static ZSTDThreadPoolHolder INSTANCE; +}; +ZSTDThreadPoolHolder ZSTDThreadPoolHolder::INSTANCE; +#endif + #endif #ifndef NO_ZLIB #include @@ -671,6 +699,14 @@ class UncompressedFrameData : public FSEQFile::FrameData { return true; } + [[nodiscard]] virtual size_t GetSize() const override { + return m_size; + } + + [[nodiscard]] virtual uint8_t* GetData() const override { + return m_data; + } + uint32_t m_size; uint8_t* m_data; std::vector> m_ranges; @@ -745,8 +781,8 @@ static const int V2FSEQ_HEADER_SIZE = 32; static const int V2FSEQ_SPARSE_RANGE_SIZE = 6; static const int V2FSEQ_COMPRESSION_BLOCK_SIZE = 8; #if !defined(NO_ZLIB) || !defined(NO_ZSTD) -static const int V2FSEQ_OUT_BUFFER_SIZE = 1024 * 1024; // 1MB output buffer -static const int V2FSEQ_OUT_BUFFER_FLUSH_SIZE = 900 * 1024; // 90% full, flush it +static const int V2FSEQ_OUT_BUFFER_SIZE = 32 * 1024 * 1024; // 32MB output buffer +static const int V2FSEQ_OUT_BUFFER_FLUSH_SIZE = 16 * 1024 * 1024; // 50% full, flush it static const int V2FSEQ_OUT_COMPRESSION_BLOCK_SIZE = 64 * 1024; // 64KB blocks #endif @@ -882,7 +918,9 @@ class V2CompressedHandler : public V2Handler { return m_maxBlocks; } //determine a good number of compression blocks - uint64_t datasize = m_file->getChannelCount() * m_file->getNumFrames(); + uint64_t datasize = m_file->getChannelCount(); + uint64_t numFrames = m_file->getNumFrames(); + datasize *= numFrames; uint64_t numBlocks = datasize / V2FSEQ_OUT_COMPRESSION_BLOCK_SIZE; if (numBlocks > maxNumBlocks) { //need a lot of blocks, use as many as we can @@ -890,7 +928,7 @@ class V2CompressedHandler : public V2Handler { } else if (numBlocks < 1) { numBlocks = 1; } - m_framesPerBlock = m_file->getNumFrames() / numBlocks; + m_framesPerBlock = numFrames / numBlocks; if (m_framesPerBlock < 10) m_framesPerBlock = 10; m_curFrameInBlock = 0; @@ -963,6 +1001,7 @@ class V2CompressedHandler : public V2Handler { #ifndef NO_ZSTD class V2ZSTDCompressionHandler : public V2CompressedHandler { public: + V2ZSTDCompressionHandler(V2FSEQFile* f) : V2CompressedHandler(f), m_cctx(nullptr), @@ -1011,7 +1050,8 @@ class V2ZSTDCompressionHandler : public V2CompressedHandler { uint64_t len = m_file->m_frameOffsets[m_curBlock + 1].second; len -= m_file->m_frameOffsets[m_curBlock].second; - uint64_t max = m_file->getNumFrames() * m_file->getChannelCount(); + uint64_t max = m_file->getNumFrames(); + max *= (uint64_t)m_file->getChannelCount(); if (len > max) { len = max; } @@ -1099,7 +1139,7 @@ class V2ZSTDCompressionHandler : public V2CompressedHandler { return data; } void compressData(ZSTD_CStream* m_cctx, ZSTD_inBuffer_s& input, ZSTD_outBuffer_s& output) { - ZSTD_compressStream(m_cctx, &output, &input); + ZSTD_compressStream2(m_cctx, &output, &input, ZSTD_e_continue); int count = input.pos; int total = input.size; uint8_t* curData = (uint8_t*)input.src; @@ -1113,7 +1153,7 @@ class V2ZSTDCompressionHandler : public V2CompressedHandler { write(output.dst, output.pos); output.pos = 0; } - ZSTD_compressStream(m_cctx, &output, &input); + ZSTD_compressStream2(m_cctx, &output, &input, ZSTD_e_continue); count += input.pos; } } @@ -1141,6 +1181,14 @@ class V2ZSTDCompressionHandler : public V2CompressedHandler { clevel = 0; } ZSTD_initCStream(m_cctx, clevel); + //ZSTD_CCtx_reset(m_cctx, ZSTD_reset_session_only); + //ZSTD_CCtx_refCDict(m_cctx, NULL); + //ZSTD_CCtx_setParameter(m_cctx, ZSTD_c_compressionLevel, clevel); + +#ifdef ZSTD_STATIC_LINKING_ONLY + ZSTD_CCtx_setParameter(m_cctx, ZSTD_c_nbWorkers, std::thread::hardware_concurrency()); + ZSTD_CCtx_refThreadPool(m_cctx, ZSTDThreadPoolHolder::INSTANCE.getPool()); +#endif } uint8_t* curData = (uint8_t*)data; @@ -1173,7 +1221,10 @@ class V2ZSTDCompressionHandler : public V2CompressedHandler { //we'll start a new block. We want the first block to be small so startup is //quicker and we can get the first few frames as fast as possible. if ((m_curBlock == 0 && m_curFrameInBlock == 10) || (m_curFrameInBlock >= m_framesPerBlock && m_file->m_frameOffsets.size() < m_maxBlocks)) { - while (ZSTD_endStream(m_cctx, &m_outBuffer) > 0) { + ZSTD_inBuffer_s input = { + 0, 0, 0 + }; + while(ZSTD_compressStream2(m_cctx, &m_outBuffer, &input, ZSTD_e_end) > 0) { write(m_outBuffer.dst, m_outBuffer.pos); m_outBuffer.pos = 0; } @@ -1186,7 +1237,10 @@ class V2ZSTDCompressionHandler : public V2CompressedHandler { } virtual void finalize() override { if (m_curFrameInBlock) { - while (ZSTD_endStream(m_cctx, &m_outBuffer) > 0) { + ZSTD_inBuffer_s input = { + 0, 0, 0 + }; + while(ZSTD_compressStream2(m_cctx, &m_outBuffer, &input, ZSTD_e_end) > 0) { write(m_outBuffer.dst, m_outBuffer.pos); m_outBuffer.pos = 0; } @@ -1199,7 +1253,7 @@ class V2ZSTDCompressionHandler : public V2CompressedHandler { V2CompressedHandler::finalize(); } - ZSTD_CStream* m_cctx = nullptr; + ZSTD_CCtx* m_cctx = nullptr; ZSTD_DStream* m_dctx = nullptr; ZSTD_outBuffer_s m_outBuffer; ZSTD_inBuffer_s m_inBuffer; diff --git a/xLights/FSEQFile.h b/xLights/FSEQFile.h index fd12b21644..13d60a16de 100644 --- a/xLights/FSEQFile.h +++ b/xLights/FSEQFile.h @@ -28,7 +28,8 @@ class FSEQFile { virtual ~FrameData() {}; virtual bool readFrame(uint8_t *data, uint32_t maxChannels) = 0; - + [[nodiscard]] virtual uint8_t* GetData() const = 0; + [[nodiscard]] virtual size_t GetSize() const = 0; uint32_t frame; }; @@ -83,9 +84,9 @@ class FSEQFile { virtual void dumpInfo(bool indent = false); - uint32_t getNumFrames() const { return m_seqNumFrames; } + uint64_t getNumFrames() const { return m_seqNumFrames; } int getStepTime() const { return m_seqStepTime; } - uint32_t getChannelCount() const { return m_seqChannelCount; } + uint64_t getChannelCount() const { return m_seqChannelCount; } int getVersionMajor() const { return m_seqVersionMajor; } int getVersionMinor() const { return m_seqVersionMinor; } uint64_t getUniqueId() const { return m_uniqueId; } diff --git a/xLights/LayoutPanel.cpp b/xLights/LayoutPanel.cpp index 154f638c56..99bffdfeb5 100644 --- a/xLights/LayoutPanel.cpp +++ b/xLights/LayoutPanel.cpp @@ -157,6 +157,7 @@ const long LayoutPanel::ID_PREVIEW_BULKEDIT_PIXELSIZE = wxNewId(); const long LayoutPanel::ID_PREVIEW_BULKEDIT_PIXELSTYLE = wxNewId(); const long LayoutPanel::ID_PREVIEW_BULKEDIT_TRANSPARENCY = wxNewId(); const long LayoutPanel::ID_PREVIEW_BULKEDIT_BLACKTRANSPARENCY = wxNewId(); +const long LayoutPanel::ID_PREVIEW_BULKEDIT_SHADOWMODELFOR = wxNewId(); const long LayoutPanel::ID_PREVIEW_BULKEDIT_CONTROLLERGAMMA = wxNewId(); const long LayoutPanel::ID_PREVIEW_BULKEDIT_CONTROLLERCOLOURORDER = wxNewId(); const long LayoutPanel::ID_PREVIEW_BULKEDIT_CONTROLLERBRIGHTNESS = wxNewId(); @@ -474,11 +475,12 @@ LayoutPanel::LayoutPanel(wxWindow* parent, xLightsFrame *xl, wxPanel* sequencer) int msp = config->Read("LayoutModelSplitterSash", -1); int sp = config->Read("LayoutMainSplitterSash", -1); is_3d = config->ReadBool("LayoutMode3D", false); + bool allow_3d_previews = true; //false; //set to false for previous behavior CheckBox_3D->SetValue(is_3d); xlights->GetHousePreview()->Set3D(is_3d); - if (is_3d) + if (!allow_3d_previews && is_3d) { ChoiceLayoutGroups->Disable(); ChoiceLayoutGroups->SetToolTip("3D is only supported in the Default preview."); @@ -877,6 +879,7 @@ void LayoutPanel::OnPropertyGridChange(wxPropertyGridEvent& event) { } else { if (editing_models) { + xlights->AbortRender(); if (selectedBaseObject != nullptr) { Model* selectedModel = dynamic_cast(selectedBaseObject); //model property @@ -946,6 +949,7 @@ void LayoutPanel::OnPropertyGridChanging(wxPropertyGridEvent& event) { xlights->AddTraceMessage("LayoutPanel::OnPropertyGridChanging Property: " + name); if (selectedBaseObject != nullptr) { if( editing_models ) { + xlights->AbortRender(); Model* selectedModel = dynamic_cast(selectedBaseObject); if ("ModelName" == name) { std::string safename = Model::SafeModelName(event.GetValue().GetString().ToStdString()); @@ -1172,6 +1176,7 @@ std::string LayoutPanel::TreeModelName(const Model* model, bool fullname) return "<" + name + ">"; } } + void LayoutPanel::FreezeTreeListView() { TreeListViewModels->Freeze(); //turn off the column width auto-resize. Makes it REALLY slow to populate the tree @@ -1204,8 +1209,10 @@ void LayoutPanel::SetTreeListViewItemText(wxTreeListItem &item, int col, const w void LayoutPanel::refreshModelList() { + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); static log4cpp::Category& logger_work = log4cpp::Category::getInstance(std::string("log_work")); logger_work.debug(" refreshModelList."); + wxStopWatch sw; FreezeTreeListView(); @@ -1246,6 +1253,9 @@ void LayoutPanel::refreshModelList() { } } ThawTreeListView(); + + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::refreshModelList took %lums", sw.Time()); } void LayoutPanel::RenameModelInTree(Model *model, const std::string& new_name) @@ -1344,7 +1354,9 @@ void LayoutPanel::UpdateModelList(bool full_refresh) { void LayoutPanel::UpdateModelList(bool full_refresh, std::vector &models) { - //static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + wxStopWatch sw; + FreezeTreeListView(); unsigned sortcol; bool ascending; @@ -1453,11 +1465,15 @@ void LayoutPanel::UpdateModelList(bool full_refresh, std::vector &models xlights->GetOutputModelManager()->AddASAPWork(OutputModelManager::WORK_REDRAW_LAYOUTPREVIEW, "LayoutPanel::UpdateModelList"); ThawTreeListView(); + + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::UpdateModelList took %lums", sw.Time()); } void LayoutPanel::UpdateModelsForPreview(const std::string &group, LayoutGroup* layout_grp, std::vector &prev_models, bool filtering) { - //static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + wxStopWatch sw; //logger_base.debug("Updated models for preview: %s.", (const char*)group.c_str()); std::set modelsAdded; @@ -1584,6 +1600,9 @@ void LayoutPanel::UpdateModelsForPreview(const std::string &group, LayoutGroup* } } } + + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::UpdateModelsForPreview took %lums", sw.Time()); } void LayoutPanel::BulkEditDimmingCurves() @@ -1867,6 +1886,7 @@ void LayoutPanel::BulkEditControllerName() ReselectTreeModels(selectedModelPaths); } } + void LayoutPanel::BulkEditPixelSize() { std::vector modelsToEdit = GetSelectedModelsForEdit(); // remember the selected models @@ -1893,6 +1913,7 @@ void LayoutPanel::BulkEditPixelSize() { ReselectTreeModels(selectedModelPaths); } } + void LayoutPanel::BulkEditPixelStyle() { std::vector modelsToEdit = GetSelectedModelsForEdit(); // remember the selected models @@ -1923,6 +1944,7 @@ void LayoutPanel::BulkEditPixelStyle() { ReselectTreeModels(selectedModelPaths); } } + void LayoutPanel::BulkEditTransparency() { std::vector modelsToEdit = GetSelectedModelsForEdit(); // remember the selected models @@ -1949,6 +1971,7 @@ void LayoutPanel::BulkEditTransparency() { ReselectTreeModels(selectedModelPaths); } } + void LayoutPanel::BulkEditBlackTranparency() { std::vector modelsToEdit = GetSelectedModelsForEdit(); // remember the selected models @@ -1975,6 +1998,39 @@ void LayoutPanel::BulkEditBlackTranparency() { ReselectTreeModels(selectedModelPaths); } } + +void LayoutPanel::BulkEditShadowModelFor() +{ + std::vector modelsToEdit = GetSelectedModelsForEdit(); + // remember the selected models + std::vector> selectedModelPaths = GetSelectedTreeModelPaths(); + + wxArrayString choices; + choices.Add(""); + + for (size_t i = 0; i < modelPreview->GetModels().size(); i++) { + if (modelPreview->GetModels()[i]->GetName() != selectedBaseObject->GetName()) { + choices.Add(modelPreview->GetModels()[i]->GetName()); + } + } + + wxSingleChoiceDialog dlg(this, "", "Select the model to shadow.", choices); + dlg.SetSelection(0); + OptimiseDialogPosition(&dlg); + + if (dlg.ShowModal() == wxID_OK) { + for (Model* model : modelsToEdit) { + model->SetShadowModelFor(dlg.GetStringSelection()); + } + + // see comment in BulkEditActive() + xlights->GetOutputModelManager()->ClearSelectedModel(); + xlights->GetOutputModelManager()->AddImmediateWork(OutputModelManager::WORK_RELOAD_ALLMODELS, "BulkEditBlackShadowModelFor"); + // reselect all the models + ReselectTreeModels(selectedModelPaths); + } +} + void LayoutPanel::BulkEditTagColour() { std::vector modelsToEdit = GetSelectedModelsForEdit(); @@ -2219,10 +2275,12 @@ class xlImageProperty : public wxImageFileProperty { xlImageProperty(const wxString& label, const wxString& name, const wxString& value, - const wxImage *img) - : wxImageFileProperty(label, name, ""), lastFileName(value) + const wxImage* img) : + wxImageFileProperty(label, name, ""), lastFileName(value) { - SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"); + SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"); SetValueFromString(value); if (img != nullptr) { setImage(*img); @@ -2264,6 +2322,8 @@ class xlImageProperty : public wxImageFileProperty { void LayoutPanel::UnSelectAllModels(bool addBkgProps) { static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + wxStopWatch sw; + highlightedBaseObject = nullptr; selectedBaseObject = nullptr; selectionLatched = false; @@ -2319,6 +2379,9 @@ void LayoutPanel::UnSelectAllModels(bool addBkgProps) if (!updatingProperty && addBkgProps) { showBackgroundProperties(); } + + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::UnSelectAllModels took %lums", sw.Time()); } void LayoutPanel::showBackgroundProperties() @@ -2422,6 +2485,8 @@ void LayoutPanel::SelectAllModels() void LayoutPanel::SetupPropGrid(BaseObject *base_object) { + // static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + if (base_object == nullptr || propertyEditor == nullptr) return; if (dynamic_cast(base_object) != nullptr) { //groups don't use the property grid @@ -2502,6 +2567,7 @@ void LayoutPanel::SetupPropGrid(BaseObject *base_object) { } } } + if (!frozen) propertyEditor->Thaw(); if (_lastSelProp != "") { @@ -4411,12 +4477,30 @@ void LayoutPanel::AddSingleModelOptionsToBaseMenu(wxMenu &menu) { } if (editing_models) { + bool anySelectedModelLocked = false; + bool anySelectedModelUnlocked = false; + bool allSelectedModelsFromBase = true; + bool anySelectedModelFromBase = false; + + std::vector selectedModels = GetSelectedModelsForEdit(); + for (const auto& it : selectedModels) { + if (it->IsLocked()) + anySelectedModelLocked = true; + else + anySelectedModelUnlocked = true; + + if (!it->IsFromBase()) + allSelectedModelsFromBase = false; + else + anySelectedModelFromBase = true; + } + auto lm = menu.Append(ID_PREVIEW_MODEL_LOCK, "Lock"); - lm->Enable(!selectedBaseObject->IsLocked() && !selectedBaseObject->IsFromBase()); + lm->Enable(anySelectedModelUnlocked && !allSelectedModelsFromBase); auto um = menu.Append(ID_PREVIEW_MODEL_UNLOCK, "Unlock"); - um->Enable(selectedBaseObject->IsLocked() && !selectedBaseObject->IsFromBase()); + um->Enable(anySelectedModelLocked && !allSelectedModelsFromBase); auto ul = menu.Append(ID_PREVIEW_MODEL_UNLINKFROMBASE, "Unlink from base show folder"); - ul->Enable(selectedBaseObject->IsFromBase()); + ul->Enable(anySelectedModelFromBase); Model* model = dynamic_cast(selectedBaseObject); if (model != nullptr && model->GetDisplayAs() != "ModelGroup" && model->GetDisplayAs() != "SubModel") { @@ -4470,6 +4554,7 @@ void LayoutPanel::AddBulkEditOptionsToMenu(wxMenu* mnuBulkEdit) { mnuBulkEdit->Append(ID_PREVIEW_BULKEDIT_PIXELSTYLE, "Pixel Style"); mnuBulkEdit->Append(ID_PREVIEW_BULKEDIT_TRANSPARENCY, "Transparency"); mnuBulkEdit->Append(ID_PREVIEW_BULKEDIT_BLACKTRANSPARENCY, "Black Transparency"); + mnuBulkEdit->Append(ID_PREVIEW_BULKEDIT_SHADOWMODELFOR, "Shadow Model For"); mnuBulkEdit->AppendSeparator(); mnuBulkEdit->Append(ID_PREVIEW_BULKEDIT_CONTROLLERCONNECTION, "Controller Port"); @@ -4690,6 +4775,8 @@ void LayoutPanel::OnPreviewModelPopup(wxCommandEvent& event) BulkEditTransparency(); } else if (event.GetId() == ID_PREVIEW_BULKEDIT_BLACKTRANSPARENCY) { BulkEditBlackTranparency(); + } else if (event.GetId() == ID_PREVIEW_BULKEDIT_SHADOWMODELFOR) { + BulkEditShadowModelFor(); } else if (event.GetId() == ID_PREVIEW_BULKEDIT_PREVIEW) { BulkEditControllerPreview(); } else if (event.GetId() == ID_PREVIEW_BULKEDIT_DIMMINGCURVES) { @@ -6582,7 +6669,7 @@ void LayoutPanel::RemoveSelectedModelsFromGroup() { void LayoutPanel::DeleteSelectedModels() { // I deliberately allow objects that come from base to be deleted. - if (selectedBaseObject != nullptr && !selectedBaseObject->GetBaseObjectScreenLocation().IsLocked()) { + if (selectedBaseObject != nullptr) { xlights->AddTraceMessage("LayoutPanel::Delete Selected Model"); wxArrayString modelsToDelete; @@ -6608,13 +6695,9 @@ void LayoutPanel::DeleteSelectedModels() for (const auto& it : modelsToDelete) { auto model = xlights->AllModels[it]; if (model != nullptr) { - if (!model->IsLocked()) { - xlights->GetDisplayElementsPanel()->RemoveModelFromLists(it); - allDeleted = xlights->AllModels.Delete(it) && allDeleted; - xlights->AddTraceMessage(wxString::Format("LayoutPanel::Delete Selected Model : %s", it)); - } else { - allDeleted = false; - } + xlights->GetDisplayElementsPanel()->RemoveModelFromLists(it); + allDeleted = xlights->AllModels.Delete(it) && allDeleted; + xlights->AddTraceMessage(wxString::Format("LayoutPanel::Delete Selected Model : %s", it)); } else { allDeleted = false; @@ -6623,7 +6706,7 @@ void LayoutPanel::DeleteSelectedModels() if (!allDeleted) { wxBell(); - wxMessageBox("One or models unable to be deleted. They may be locked or have effects on them.", "Delete failed", 5L, this); + wxMessageBox("One or more models cannot be deleted. They may have effects on them.", "Delete failed", 5L, this); } selectedBaseObject = nullptr; @@ -6713,6 +6796,8 @@ void LayoutPanel::ReplaceModel() if (replaceModel == nullptr) return; + CreateUndoPoint("All", "", ""); + // Prompt user to copy the target models start channel ...but only if // they are not already the same and the new model uses a chaining start // channel ... the theory being if you took time to set the start channel @@ -6749,7 +6834,10 @@ void LayoutPanel::ReplaceModel() } } - if (wxMessageBox("Use original size and position", "Use original size and position", wxYES_NO) == wxYES) { + auto rmn = replaceModel->GetName(); + auto riw = modelToReplaceItWith->GetName(); + + if (wxMessageBox("Use original size and position of " + rmn, "Use original size and position", wxYES_NO) == wxYES) { modelToReplaceItWith->GetModelScreenLocation().SetRotation(replaceModel->GetModelScreenLocation().GetRotation()); modelToReplaceItWith->SetHcenterPos(replaceModel->GetHcenterPos()); modelToReplaceItWith->SetVcenterPos(replaceModel->GetVcenterPos()); @@ -6759,8 +6847,6 @@ void LayoutPanel::ReplaceModel() modelToReplaceItWith->SetDepth(replaceModel->GetDepth()); } - auto rmn = replaceModel->GetName(); - auto riw = modelToReplaceItWith->GetName(); xlights->AllModels.RenameInListOnly(dlg.GetStringSelection().ToStdString(), "Iamgoingtodeletethismodel"); replaceModel->Rename("Iamgoingtodeletethismodel"); xlights->AllModels.RenameInListOnly(modelToReplaceItWith->GetName(), dlg.GetStringSelection().ToStdString()); @@ -7418,6 +7504,8 @@ void LayoutPanel::OnModelsPopup(wxCommandEvent& event) { BulkEditTransparency(); } else if (event.GetId() == ID_PREVIEW_BULKEDIT_BLACKTRANSPARENCY) { BulkEditBlackTranparency(); + } else if (event.GetId() == ID_PREVIEW_BULKEDIT_SHADOWMODELFOR) { + BulkEditShadowModelFor(); } else if (event.GetId() == ID_PREVIEW_BULKEDIT_PREVIEW) { BulkEditControllerPreview(); } else if (event.GetId() == ID_PREVIEW_BULKEDIT_DIMMINGCURVES) { @@ -8423,6 +8511,8 @@ void LayoutPanel::HandleSelectionChanged() { return; } + wxStopWatch sw; + BaseObject* lastSelectedBaseObject = selectedBaseObject; Model* lastSelectedModel = dynamic_cast(lastSelectedBaseObject); wxTreeListItems selectedItems; @@ -8431,6 +8521,9 @@ void LayoutPanel::HandleSelectionChanged() { UnSelectAllModels(false); resetPropertyGrid(); + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::HandleSelectionChanged after reset of property grid %lums", sw.Time()); + if (selectedItems.size() > 0) { bool isPrimary = false; if (selectedItems.size() == 1) { @@ -8473,6 +8566,8 @@ void LayoutPanel::HandleSelectionChanged() { } } } + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::HandleSelectionChanged after select in tree %lums", sw.Time()); // if we still don't have a primary model selected then force one if we can if (selectedPrimaryTreeItem == nullptr) { @@ -8489,6 +8584,9 @@ void LayoutPanel::HandleSelectionChanged() { } } + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::HandleSelectionChanged after force select %lums", sw.Time()); + // determine which panel and tooltip to show if any int mSize = selectedTreeModels.size(); int gSize = selectedTreeGroups.size(); @@ -8533,6 +8631,9 @@ void LayoutPanel::HandleSelectionChanged() { SetToolTipForTreeList(TreeListViewModels, tooltip); + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::HandleSelectionChanged after tooltip %lums", sw.Time()); + // removing below or Keyboard Cut/Copy/Paste/etc will not fire when making selections in preview // #ifndef LINUX // TreeListViewModels->SetFocus(); @@ -8547,6 +8648,7 @@ void LayoutPanel::HandleSelectionChanged() { } xlights->GetOutputModelManager()->AddASAPWork(OutputModelManager::WORK_REDRAW_LAYOUTPREVIEW, "LayoutPanel::HandleSelectionChanged"); + } else { selectedBaseObject = nullptr; UnSelectAllModels(true); @@ -8554,6 +8656,9 @@ void LayoutPanel::HandleSelectionChanged() { SetToolTipForTreeList(TreeListViewModels, ""); xlights->SetStatusText(""); } + + if (sw.Time() > 500) + logger_base.debug(" LayoutPanel::HandleSelectionChanged took %lums", sw.Time()); } void LayoutPanel::ModelGroupUpdated(ModelGroup *grp, bool full_refresh) { @@ -8732,8 +8837,9 @@ std::string CopyPasteBaseObject::Serialise() const void LayoutPanel::OnCheckBox_3DClick(wxCommandEvent& event) { is_3d = CheckBox_3D->GetValue(); + bool allow_3d_previews = true; //false; //set to false for previous behavior - if (is_3d) { + if (!allow_3d_previews && is_3d) { if (ChoiceLayoutGroups->GetStringSelection() != "Default") { ChoiceLayoutGroups->SetStringSelection("Default"); wxCommandEvent e; diff --git a/xLights/LayoutPanel.h b/xLights/LayoutPanel.h index 7def4902ce..ab564a65ac 100644 --- a/xLights/LayoutPanel.h +++ b/xLights/LayoutPanel.h @@ -165,6 +165,7 @@ class LayoutPanel: public wxPanel static const long ID_PREVIEW_BULKEDIT_PIXELSTYLE; static const long ID_PREVIEW_BULKEDIT_TRANSPARENCY; static const long ID_PREVIEW_BULKEDIT_BLACKTRANSPARENCY; + static const long ID_PREVIEW_BULKEDIT_SHADOWMODELFOR; static const long ID_PREVIEW_BULKEDIT_CONTROLLERDIRECTION; static const long ID_PREVIEW_BULKEDIT_CONTROLLERSTARTNULLNODES; static const long ID_PREVIEW_BULKEDIT_CONTROLLERENDNULLNODES; @@ -345,6 +346,7 @@ class LayoutPanel: public wxPanel void BulkEditPixelStyle(); void BulkEditTransparency(); void BulkEditBlackTranparency(); + void BulkEditShadowModelFor(); void BulkEditControllerConnection(int type); void BulkEditControllerPreview(); void BulkEditDimmingCurves(); diff --git a/xLights/ModelChainDialog.cpp b/xLights/ModelChainDialog.cpp index abf26b5968..c7d8c0a347 100644 --- a/xLights/ModelChainDialog.cpp +++ b/xLights/ModelChainDialog.cpp @@ -39,18 +39,19 @@ ModelChainDialog::ModelChainDialog(wxWindow* parent,wxWindowID id,const wxPoint& wxFlexGridSizer* FlexGridSizer2; wxStdDialogButtonSizer* StdDialogButtonSizer1; - Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T("id")); + Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER, _T("id")); SetClientSize(wxDefaultSize); Move(wxDefaultPosition); FlexGridSizer1 = new wxFlexGridSizer(0, 1, 0, 0); FlexGridSizer1->AddGrowableCol(0); - FlexGridSizer2 = new wxFlexGridSizer(0, 3, 0, 0); + FlexGridSizer2 = new wxFlexGridSizer(1, 2, 0, 0); + FlexGridSizer2->AddGrowableCol(1); StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("Chain after model:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1")); FlexGridSizer2->Add(StaticText1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); ModelChoice = new wxChoice(this, ID_CHOICE1, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1")); ModelChoice->SetMinSize(wxDLG_UNIT(this,wxSize(100,-1))); - FlexGridSizer2->Add(ModelChoice, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); - FlexGridSizer1->Add(FlexGridSizer2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer2->Add(ModelChoice, 1, wxALL|wxEXPAND, 5); + FlexGridSizer1->Add(FlexGridSizer2, 1, wxALL|wxEXPAND, 5); StdDialogButtonSizer1 = new wxStdDialogButtonSizer(); StdDialogButtonSizer1->AddButton(new wxButton(this, wxID_OK, wxEmptyString)); StdDialogButtonSizer1->AddButton(new wxButton(this, wxID_CANCEL, wxEmptyString)); diff --git a/xLights/ModelChainDialog.h b/xLights/ModelChainDialog.h index 1cdd429bc6..80c3cf79e8 100644 --- a/xLights/ModelChainDialog.h +++ b/xLights/ModelChainDialog.h @@ -11,11 +11,11 @@ **************************************************************/ //(*Headers(ModelChainDialog) -#include -#include -#include -#include -//*) + #include + #include + #include + #include + //*) #include diff --git a/xLights/ModelFaceDialog.cpp b/xLights/ModelFaceDialog.cpp index 1cb96d64c0..b9c275340b 100644 --- a/xLights/ModelFaceDialog.cpp +++ b/xLights/ModelFaceDialog.cpp @@ -655,7 +655,9 @@ void ModelFaceDialog::OnMatrixModelsGridLabelLeftDClick(wxGridEvent& event) SelectMatrixImage(event.GetRow(), 0);// update eyes open column } -static const wxString strSupportedImageTypes = "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"; +static const wxString strSupportedImageTypes = "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"; void ModelFaceDialog::SelectMatrixImage(int r, int c) { std::string const name = NameChoice->GetString(NameChoice->GetSelection()).ToStdString(); diff --git a/xLights/ModelFaceDialog.h b/xLights/ModelFaceDialog.h index 882ed1bd70..b66ac6e41c 100644 --- a/xLights/ModelFaceDialog.h +++ b/xLights/ModelFaceDialog.h @@ -12,6 +12,7 @@ #include #include +#include //(*Headers(ModelFaceDialog) #include diff --git a/xLights/ModelGroupPanel.cpp b/xLights/ModelGroupPanel.cpp index 5601a56727..653d486509 100644 --- a/xLights/ModelGroupPanel.cpp +++ b/xLights/ModelGroupPanel.cpp @@ -26,6 +26,7 @@ #include "OutputModelManager.h" #include "xLightsMain.h" #include "UtilFunctions.h" +#include "EditAliasesDialog.h" #include @@ -99,6 +100,7 @@ const long ModelGroupPanel::ID_STATICTEXT11 = wxNewId(); const long ModelGroupPanel::ID_SPINCTRL3 = wxNewId(); const long ModelGroupPanel::ID_STATICTEXT8 = wxNewId(); const long ModelGroupPanel::ID_COLOURPICKERCTRL_MG_TAGCOLOUR = wxNewId(); +const long ModelGroupPanel::ID_BUTTON2 = wxNewId(); const long ModelGroupPanel::ID_CHECKBOX1 = wxNewId(); const long ModelGroupPanel::ID_CHECKBOX3 = wxNewId(); const long ModelGroupPanel::ID_CHECKBOX2 = wxNewId(); @@ -137,6 +139,7 @@ ModelGroupPanel::ModelGroupPanel(wxWindow* parent, ModelManager &Models, LayoutP wxFlexGridSizer* FlexGridSizer2; wxFlexGridSizer* FlexGridSizer3; wxFlexGridSizer* FlexGridSizer4; + wxFlexGridSizer* FlexGridSizer5; wxFlexGridSizer* FlexGridSizer6; wxStaticText* StaticText4; wxStaticText* StaticText6; @@ -202,8 +205,12 @@ ModelGroupPanel::ModelGroupPanel(wxWindow* parent, ModelManager &Models, LayoutP FlexGridSizer6->Add(FlexGridSizer4, 1, wxALL|wxEXPAND, 5); StaticText8 = new wxStaticText(this, ID_STATICTEXT8, _("Tag Color:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT8")); FlexGridSizer6->Add(StaticText8, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 2); + FlexGridSizer5 = new wxFlexGridSizer(0, 3, 0, 0); ColourPickerCtrl_ModelGroupTagColour = new wxColourPickerCtrl(this, ID_COLOURPICKERCTRL_MG_TAGCOLOUR, wxColour(0,0,0), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_COLOURPICKERCTRL_MG_TAGCOLOUR")); - FlexGridSizer6->Add(ColourPickerCtrl_ModelGroupTagColour, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer5->Add(ColourPickerCtrl_ModelGroupTagColour, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + ButtonAliases = new wxButton(this, ID_BUTTON2, _("Aliases"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2")); + FlexGridSizer5->Add(ButtonAliases, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer6->Add(FlexGridSizer5, 1, wxALL|wxEXPAND, 5); CheckBox_ShowSubmodels = new wxCheckBox(this, ID_CHECKBOX1, _("Show SubModels to Add"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX1")); CheckBox_ShowSubmodels->SetValue(true); FlexGridSizer6->Add(CheckBox_ShowSubmodels, 1, wxALL|wxEXPAND, 2); @@ -272,6 +279,7 @@ ModelGroupPanel::ModelGroupPanel(wxWindow* parent, ModelManager &Models, LayoutP Connect(ID_SPINCTRL2,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&ModelGroupPanel::OnSpinCtrl_XCentreOffsetChange); Connect(ID_SPINCTRL3,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&ModelGroupPanel::OnSpinCtrl_YCentreOffsetChange); Connect(ID_COLOURPICKERCTRL_MG_TAGCOLOUR,wxEVT_COMMAND_COLOURPICKER_CHANGED,(wxObjectEventFunction)&ModelGroupPanel::OnColourPickerCtrl_ModelGroupTagColourColourChanged); + Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ModelGroupPanel::OnButtonAliasesClick); Connect(ID_CHECKBOX1,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&ModelGroupPanel::OnCheckBox_ShowSubmodelsClick); Connect(ID_CHECKBOX3,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&ModelGroupPanel::OnCheckBox_ShowInactiveModelsClick); Connect(ID_CHECKBOX2,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&ModelGroupPanel::OnCheckBox_ShowModelGroupsClick); @@ -1366,3 +1374,13 @@ void ModelGroupPanel::OnChoice_DefaultCameraSelect(wxCommandEvent& event) { SaveGroupChanges(); } + +void ModelGroupPanel::OnButtonAliasesClick(wxCommandEvent& event) +{ + ModelGroup* g = (ModelGroup*)mModels[mGroup]; + if (g == nullptr) + return; + EditAliasesDialog dlg(this, g); + + dlg.ShowModal(); +} diff --git a/xLights/ModelGroupPanel.h b/xLights/ModelGroupPanel.h index 643755ca64..c75500aa68 100644 --- a/xLights/ModelGroupPanel.h +++ b/xLights/ModelGroupPanel.h @@ -65,6 +65,7 @@ class ModelGroupPanel : public wxPanel wxBitmapButton* ButtonMoveDown; wxBitmapButton* ButtonMoveUp; wxBitmapButton* ButtonRemoveModel; + wxButton* ButtonAliases; wxButton* ButtonClearFilter; wxCheckBox* CheckBox_ShowInactiveModels; wxCheckBox* CheckBox_ShowModelGroups; @@ -113,6 +114,7 @@ class ModelGroupPanel : public wxPanel static const long ID_SPINCTRL3; static const long ID_STATICTEXT8; static const long ID_COLOURPICKERCTRL_MG_TAGCOLOUR; + static const long ID_BUTTON2; static const long ID_CHECKBOX1; static const long ID_CHECKBOX3; static const long ID_CHECKBOX2; @@ -169,6 +171,7 @@ class ModelGroupPanel : public wxPanel void OnCheckBox_ShowOnlyModelsInCurrentViewClick(wxCommandEvent& event); void OnColourPickerCtrl_ModelGroupTagColourColourChanged(wxColourPickerEvent& event); void OnChoice_DefaultCameraSelect(wxCommandEvent& event); + void OnButtonAliasesClick(wxCommandEvent& event); //*) DECLARE_EVENT_TABLE() diff --git a/xLights/ModelRemap.cpp b/xLights/ModelRemap.cpp index 8d1d274505..9cb56832aa 100644 --- a/xLights/ModelRemap.cpp +++ b/xLights/ModelRemap.cpp @@ -423,7 +423,7 @@ void RemapModelProperties::Remap(RemapModelProperties& original) wxXmlNode* nn = new wxXmlNode(*n); RemapNodes(nn, "Eyes-Closed", mapping); - RemapNodes(nn, "Eyes-Closed", mapping); + RemapNodes(nn, "Eyes-Closed2", mapping); RemapNodes(nn, "Eyes-Closed3", mapping); RemapNodes(nn, "Eyes-Open", mapping); RemapNodes(nn, "Eyes-Open2", mapping); diff --git a/xLights/ModelStateDialog.cpp b/xLights/ModelStateDialog.cpp index 215bc8ad0a..0eaa4c7eb1 100644 --- a/xLights/ModelStateDialog.cpp +++ b/xLights/ModelStateDialog.cpp @@ -21,6 +21,7 @@ #include "xLightsMain.h" #include "support/VectorMath.h" #include "models/CustomModel.h" +#include "utils/string_utils.h" #include @@ -63,6 +64,7 @@ const long ModelStateDialog::ID_SPLITTERWINDOW1 = wxNewId(); const long ModelStateDialog::ID_TIMER1 = wxNewId(); const long ModelStateDialog::STATE_DIALOG_IMPORT_SUB = wxNewId(); +const long ModelStateDialog::STATE_DIALOG_IMPORT_ALL_SUB = wxNewId(); const long ModelStateDialog::STATE_DIALOG_COPY_STATES = wxNewId(); const long ModelStateDialog::STATE_DIALOG_IMPORT_MODEL = wxNewId(); const long ModelStateDialog::STATE_DIALOG_IMPORT_FILE = wxNewId(); @@ -854,6 +856,7 @@ void ModelStateDialog::OnButton_ImportClick(wxCommandEvent& event) } mnu.Append(STATE_DIALOG_IMPORT_MODEL, "Import From Model"); mnu.Append(STATE_DIALOG_IMPORT_FILE, "Import From File"); + mnu.Append(STATE_DIALOG_IMPORT_ALL_SUB, "Import From SubModels"); mnu.AppendSeparator(); mnu.Append(STATE_DIALOG_SHIFT, "Shift Nodes"); mnu.Append(STATE_DIALOG_REVERSE, "Reverse Nodes"); @@ -1074,32 +1077,22 @@ wxString ModelStateDialog::getSubmodelNodes(Model* sm) void ModelStateDialog::OnAddBtnPopup(wxCommandEvent& event) { - if (event.GetId() == STATE_DIALOG_IMPORT_MODEL) - { + if (event.GetId() == STATE_DIALOG_IMPORT_MODEL) { ImportStatesFromModel(); - } - else if (event.GetId() == STATE_DIALOG_IMPORT_FILE) - { + } else if (event.GetId() == STATE_DIALOG_IMPORT_FILE) { const wxString filename = wxFileSelector(_("Choose Model file"), wxEmptyString, wxEmptyString, wxEmptyString, "xModel Files (*.xmodel)|*.xmodel", wxFD_OPEN); if (filename.IsEmpty()) return; - ImportStates(filename); - } - else if (event.GetId() == STATE_DIALOG_COPY) - { + } else if (event.GetId() == STATE_DIALOG_COPY) { CopyStateData(); - } - else if (event.GetId() == STATE_DIALOG_RENAME) - { + } else if (event.GetId() == STATE_DIALOG_RENAME) { RenameState(); - } - else if(event.GetId() == STATE_DIALOG_SHIFT) - { + } else if(event.GetId() == STATE_DIALOG_SHIFT) { ShiftStateNodes(); - } - else if(event.GetId() == STATE_DIALOG_REVERSE) - { + } else if(event.GetId() == STATE_DIALOG_REVERSE) { ReverseStateNodes(); + } else if (event.GetId() == STATE_DIALOG_IMPORT_ALL_SUB) { + ImportStatesFromSubModels(); } } @@ -1180,6 +1173,58 @@ void ModelStateDialog::ImportStates(const wxString & filename) } } +void ModelStateDialog::ImportStatesFromSubModels() +{ + if (model->GetSubModels().size() == 0) { + wxMessageBox("No SubModels Found."); + return; + } + wxTextEntryDialog dlg(this, "New State Model", "Enter name for new state model definition"); + if (dlg.ShowModal() == wxID_OK) { + std::string name = dlg.GetValue().ToStdString(); + if (NameChoice->FindString(name) == wxNOT_FOUND) { + NameChoice->Append(name); + NameChoice->SetStringSelection(name); + NameChoice->Enable(); + DeleteButton->Enable(); + StateTypeChoice->ChangeSelection(NODE_RANGE_STATE); + UpdateStateType(); + + int idx { 0 }; + for (Model* sm : model->GetSubModels()) { + auto subname = cleanSubName(sm->Name()); + const auto nodes = getSubmodelNodes(sm); + auto newNodeArrray = wxSplit(ExpandNodes(nodes), ','); + + // sort + std::sort(newNodeArrray.begin(), newNodeArrray.end(), + [](const wxString& a, const wxString& b) { + return wxAtoi(a) < wxAtoi(b); + }); + + // make unique + newNodeArrray.erase(std::unique(newNodeArrray.begin(), newNodeArrray.end()), newNodeArrray.end()); + NodeRangeGrid->SetCellValue(idx, NAME_COL, subname); + NodeRangeGrid->SetCellValue(idx, CHANNEL_COL, CompressNodes(wxJoin(newNodeArrray, ','))); + GetValue(NodeRangeGrid, idx, NAME_COL, stateData[name]); + GetValue(NodeRangeGrid, idx, CHANNEL_COL, stateData[name]); + ++idx; + if (idx >= 200) {//state max out at 200 + break; + } + } + NodeRangeGrid->Refresh(); + } + } +} + +std::string ModelStateDialog::cleanSubName(std::string name) +{ + name = ::Lower(name); + Replace(name, " ", "_"); + return name; +} + void ModelStateDialog::AddStates(std::map > states) { bool overRide = false; diff --git a/xLights/ModelStateDialog.h b/xLights/ModelStateDialog.h index 25fb8f65d1..01b6832100 100644 --- a/xLights/ModelStateDialog.h +++ b/xLights/ModelStateDialog.h @@ -92,6 +92,7 @@ class ModelStateDialog : public wxDialog static const long ID_TIMER1; static const long STATE_DIALOG_IMPORT_SUB; + static const long STATE_DIALOG_IMPORT_ALL_SUB; static const long STATE_DIALOG_COPY_STATES; static const long STATE_DIALOG_IMPORT_MODEL; static const long STATE_DIALOG_IMPORT_FILE; @@ -165,6 +166,8 @@ class ModelStateDialog : public wxDialog wxString getSubmodelNodes(Model* sm); void ImportStates(const wxString& filename); void ImportStatesFromModel(); + void ImportStatesFromSubModels(); + std::string cleanSubName(std::string name); void AddStates(std::map> states); wxArrayString getModelList(ModelManager* modelManager); diff --git a/xLights/MultiControllerUploadDialog.cpp b/xLights/MultiControllerUploadDialog.cpp index 8e1eace3f3..2cb517f0b0 100644 --- a/xLights/MultiControllerUploadDialog.cpp +++ b/xLights/MultiControllerUploadDialog.cpp @@ -21,6 +21,8 @@ #include "controllers/ControllerCaps.h" #include "outputs/ControllerEthernet.h" +#include "utils/ip_utils.h" + //(*IdInit(MultiControllerUploadDialog) const long MultiControllerUploadDialog::ID_STATICTEXT1 = wxNewId(); const long MultiControllerUploadDialog::ID_CHECKLISTBOX1 = wxNewId(); @@ -31,6 +33,9 @@ const long MultiControllerUploadDialog::ID_TEXTCTRL1 = wxNewId(); const long MultiControllerUploadDialog::ID_MCU_SELECTALL = wxNewId(); const long MultiControllerUploadDialog::ID_MCU_SELECTNONE = wxNewId(); +const long MultiControllerUploadDialog::ID_MCU_SELECTACTIVE = wxNewId(); +const long MultiControllerUploadDialog::ID_MCU_DESELECTINACTIVE = wxNewId(); +const long MultiControllerUploadDialog::ID_MCU_SELECTAUTO = wxNewId(); BEGIN_EVENT_TABLE(MultiControllerUploadDialog, wxDialog) //(*EventTable(MultiControllerUploadDialog) @@ -92,9 +97,8 @@ MultiControllerUploadDialog::MultiControllerUploadDialog(wxWindow* parent, wxWin } } } - + LoadChecked(); Fit(); - ValidateWindow(); } @@ -130,6 +134,7 @@ void MultiControllerUploadDialog::OnButton_UploadClick(wxCommandEvent& event) TextCtrl_Log->AppendText(message); TextCtrl_Log->AppendText("\n"); TextCtrl_Log->AppendText(" Done."); + TextCtrl_Log->AppendText("\n"); } CheckListBox_Controllers->Enable(); @@ -140,6 +145,7 @@ void MultiControllerUploadDialog::OnButton_UploadClick(wxCommandEvent& event) void MultiControllerUploadDialog::OnButton_CancelClick(wxCommandEvent& event) { + SaveChecked(); EndDialog(wxID_CLOSE); } @@ -160,6 +166,28 @@ void MultiControllerUploadDialog::OnListRClick(wxContextMenuEvent& event) wxMenu mnu; mnu.Append(ID_MCU_SELECTALL, "Select All"); mnu.Append(ID_MCU_SELECTNONE, "Select None"); + mnu.Append(ID_MCU_SELECTACTIVE, "Select Active"); + mnu.Append(ID_MCU_SELECTAUTO, "Select Auto Config"); + mnu.Append(ID_MCU_DESELECTINACTIVE, "Deselect Inactive"); + + std::vector proxies; + for (auto* c : _controllers) { + auto controllerproxy = c->GetFPPProxy(); + if (!controllerproxy.empty()) { + if (std::find(proxies.begin(), proxies.end(), controllerproxy) == proxies.end()) { + proxies.push_back(controllerproxy); + } + } + } + if (!proxies.empty()) { + std::sort(proxies.begin(), proxies.end()); + wxMenu* srMenu = new wxMenu(); + for (auto p : proxies) { + srMenu->Append(wxNewId(), wxString(p)); + } + srMenu->Connect(wxEVT_MENU, (wxObjectEventFunction)&MultiControllerUploadDialog::OnProxyPopup, nullptr, this); + mnu.AppendSubMenu(srMenu, "Select with Proxy"); + } mnu.Connect(wxEVT_MENU, (wxObjectEventFunction)&MultiControllerUploadDialog::OnPopup, nullptr, this); PopupMenu(&mnu); @@ -172,11 +200,81 @@ void MultiControllerUploadDialog::OnPopup(wxCommandEvent& event) CheckListBox_Controllers->Check(i); } ValidateWindow(); - } - else if (event.GetId() == ID_MCU_SELECTNONE) { + } else if (event.GetId() == ID_MCU_SELECTNONE) { for (size_t i = 0; i < CheckListBox_Controllers->GetCount(); i++) { CheckListBox_Controllers->Check(i, false); } ValidateWindow(); + } else if (event.GetId() == ID_MCU_SELECTACTIVE) { + for (size_t i = 0; i < CheckListBox_Controllers->GetCount(); i++) { + if (_controllers[i]->IsActive()) { + CheckListBox_Controllers->Check(i); + } + + } + ValidateWindow(); + } else if (event.GetId() == ID_MCU_DESELECTINACTIVE) { + for (size_t i = 0; i < CheckListBox_Controllers->GetCount(); i++) { + if (!_controllers[i]->IsActive()) { + CheckListBox_Controllers->Check(i, false); + } + } + ValidateWindow(); + } else if (event.GetId() == ID_MCU_SELECTAUTO) { + for (size_t i = 0; i < CheckListBox_Controllers->GetCount(); i++) { + if (_controllers[i]->IsAutoLayout()) { + CheckListBox_Controllers->Check(i); + } + } + ValidateWindow(); + } +} + +void MultiControllerUploadDialog::OnProxyPopup(wxCommandEvent& event) +{ + auto id = event.GetId(); + wxString label = ((wxMenu*)event.GetEventObject())->GetLabelText(id); + for (size_t i = 0; i < CheckListBox_Controllers->GetCount(); i++) { + if (!_controllers[i] || _controllers[i]->GetFPPProxy().empty()) { + continue; + } + if (label.compare(_controllers[i]->GetFPPProxy()) == 0) { + CheckListBox_Controllers->Check(i); + } + } + ValidateWindow(); +} + +void MultiControllerUploadDialog::SaveChecked() +{ + wxArrayInt ch; + CheckListBox_Controllers->GetCheckedItems(ch); + std::list fake; + std::vector selected_controllers; + for (int i = 0; i < ch.Count() ; i++) { + auto c = _controllers[ch[i]]; + selected_controllers.push_back(c->GetIP()); + } + + wxConfigBase* config = wxConfigBase::Get(); + config->Write("MultiControllerUploadSelection", wxString(Join(selected_controllers, ","))); + config->Flush(); +} + +void MultiControllerUploadDialog::LoadChecked() +{ + wxConfigBase* config = wxConfigBase::Get(); + + if (config != nullptr) { + wxString controllerSelect = ""; + + config->Read("MultiControllerUploadSelection", &controllerSelect); + std::vector selected_controllers = Split(controllerSelect, ','); + for (size_t i = 0; i < CheckListBox_Controllers->GetCount(); i++) { + auto c = _controllers[i]; + if (std::find(selected_controllers.begin(), selected_controllers.end(), c->GetIP()) != selected_controllers.end()) { + CheckListBox_Controllers->Check(i); + } + } } } diff --git a/xLights/MultiControllerUploadDialog.h b/xLights/MultiControllerUploadDialog.h index cc8078e876..954222f46b 100644 --- a/xLights/MultiControllerUploadDialog.h +++ b/xLights/MultiControllerUploadDialog.h @@ -53,6 +53,9 @@ class MultiControllerUploadDialog : public wxDialog static const long ID_MCU_SELECTALL; static const long ID_MCU_SELECTNONE; + static const long ID_MCU_SELECTACTIVE; + static const long ID_MCU_DESELECTINACTIVE; + static const long ID_MCU_SELECTAUTO; private: @@ -64,6 +67,8 @@ class MultiControllerUploadDialog : public wxDialog void OnListRClick(wxContextMenuEvent& event); void OnPopup(wxCommandEvent& event); - + void OnProxyPopup(wxCommandEvent& event); + void SaveChecked(); + void LoadChecked(); DECLARE_EVENT_TABLE() }; diff --git a/xLights/PathGenerationDialog.cpp b/xLights/PathGenerationDialog.cpp index 94089e9b8e..debed1e214 100644 --- a/xLights/PathGenerationDialog.cpp +++ b/xLights/PathGenerationDialog.cpp @@ -64,7 +64,7 @@ PathGenerationDialog::PathGenerationDialog(wxWindow* parent, const std::string& FlexGridSizer1->Add(Panel1, 1, wxALL|wxEXPAND, 5); FlexGridSizer3 = new wxFlexGridSizer(0, 2, 0, 0); FlexGridSizer3->AddGrowableCol(0); - FilePickerCtrl1 = new wxFilePickerCtrl(this, ID_FILEPICKERCTRL1, wxEmptyString, _("Select an image file"), _T("*.jpg;*.gif;*.png;*.bmp;*.jpeg"), wxDefaultPosition, wxDefaultSize, wxFLP_FILE_MUST_EXIST|wxFLP_OPEN|wxFLP_USE_TEXTCTRL, wxDefaultValidator, _T("ID_FILEPICKERCTRL1")); + FilePickerCtrl1 = new wxFilePickerCtrl(this, ID_FILEPICKERCTRL1, wxEmptyString, _("Select an image file"), _T("*.jpg;*.gif;*.png;*.bmp;*.jpeg;*.webp"), wxDefaultPosition, wxDefaultSize, wxFLP_FILE_MUST_EXIST|wxFLP_OPEN|wxFLP_USE_TEXTCTRL, wxDefaultValidator, _T("ID_FILEPICKERCTRL1")); FlexGridSizer3->Add(FilePickerCtrl1, 1, wxALL|wxEXPAND, 5); Slider_Brightness = new wxSlider(this, ID_SLIDER1, 100, 0, 100, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER1")); FlexGridSizer3->Add(Slider_Brightness, 1, wxALL|wxEXPAND, 5); diff --git a/xLights/RenderBuffer.cpp b/xLights/RenderBuffer.cpp index 1c8baf87d9..90391c4973 100644 --- a/xLights/RenderBuffer.cpp +++ b/xLights/RenderBuffer.cpp @@ -226,6 +226,36 @@ void RenderBuffer::AlphaBlend(const RenderBuffer& src) inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } +// MoC - March 2023 +// The wx font map is not thread safe in some cases, effects using +// it from background threads need to mutex each other (and ideally +// the event loop thread but meh. This is not the best place (WX +// would be a better place), but this is better than no place. +// +// The first step here was centralizing the access methods, putting a +// lock around them then became possible. +// Per dkulp, we could, in the future, pre-populate the cache from the +// main thread, or we could use CallAfter or similar to do the font +// lookup on the main thread, which may be incrementally better than +// just a lock shared between background threads. +std::mutex FONT_MAP_LOCK; + +std::map FONT_MAP_TXT; +std::map FONT_MAP_SHP; + +class FontMapLock +{ + std::unique_lock lk; + +public: + FontMapLock() : + lk(FONT_MAP_LOCK) + {} + + ~FontMapLock() + {} +}; + DrawingContext::DrawingContext(int BufferWi, int BufferHt, bool allowShared, bool alpha) : nullBitmap(wxNullBitmap) { gc = nullptr; @@ -244,6 +274,7 @@ DrawingContext::DrawingContext(int BufferWi, int BufferHt, bool allowShared, boo dc = new wxMemoryDC(*bitmap); if (!allowShared) { + FontMapLock lk; //make sure we UnShare everything that is being held onto //also use "non-normal" defaults to avoid "==" issue that //would keep it from using the non-shared versions @@ -303,35 +334,6 @@ PathDrawingContext::PathDrawingContext(int BufferWi, int BufferHt, bool allowSha PathDrawingContext::~PathDrawingContext() {} -// MoC - March 2023 -// The wx font map is not thread safe in some cases, effects using -// it from background threads need to mutex each other (and ideally -// the event loop thread but meh. This is not the best place (WX -// would be a better place), but this is better than no place. -// -// The first step here was centralizing the access methods, putting a -// lock around them then became possible. -// Per dkulp, we could, in the future, pre-populate the cache from the -// main thread, or we could use CallAfter or similar to do the font -// lookup on the main thread, which may be incrementally better than -// just a lock shared between background threads. -std::mutex FONT_MAP_LOCK; - -std::map FONT_MAP_TXT; -std::map FONT_MAP_SHP; - -class FontMapLock -{ - std::unique_lock lk; - -public: - FontMapLock() : - lk(FONT_MAP_LOCK) - {} - - ~FontMapLock() - {} -}; TextDrawingContext::TextDrawingContext(int BufferWi, int BufferHt, bool allowShared) @@ -538,6 +540,7 @@ void PathDrawingContext::FillPath(wxGraphicsPath& path, wxPolygonFillMode fillSt void TextDrawingContext::SetFont(const wxFontInfo& font, const xlColor& color) { + FontMapLock lk; if (gc != nullptr) { int style = wxFONTFLAG_NOT_ANTIALIASED; if (font.GetWeight() == wxFONTWEIGHT_BOLD) { @@ -602,7 +605,6 @@ void TextDrawingContext::SetFont(const wxFontInfo& font, const xlColor& color) lf.lfPitchAndFamily, lf.lfFaceName);*/ { - FontMapLock lk; wxString s = f.GetNativeFontInfoDesc(); s.Replace(";2;", ";3;", false); f.SetNativeFontInfo(s); diff --git a/xLights/SeqSettingsDialog.cpp b/xLights/SeqSettingsDialog.cpp index 92a843c25f..7675f58fe4 100644 --- a/xLights/SeqSettingsDialog.cpp +++ b/xLights/SeqSettingsDialog.cpp @@ -1535,7 +1535,7 @@ void SeqSettingsDialog::MediaLoad(wxFileName name_and_path) void SeqSettingsDialog::MediaChooser() { - wxFileDialog OpenDialog(this, "Choose Audio file", wxEmptyString, wxEmptyString, "FPP 2.x+ Audio Files|*.mp3;*.ogg;*.m4p;*.mp4;*.m4a|FPP 1.x Audio Files|*.mp3;*.ogg;*.m4p;*.mp4|xLights Audio Files|*.mp3;*.ogg;*.m4p;*.mp4;*.avi;*.wma;*.au;*.wav;*.m4a;*.mid;*.mkv;*.mov;*.mpg;*.asf;*.flv;*.mpeg;*.wmv;*.flac", wxFD_OPEN | wxFD_FILE_MUST_EXIST, wxDefaultPosition); + wxFileDialog OpenDialog(this, "Choose Audio file", wxEmptyString, wxEmptyString, "FPP Audio Files|*.mp3;*.ogg;*.m4p;*.mp4;*.m4a;*.aac;*.wav;*.flac;*.wma;*.au;*.mkv;*.mov|xLights Audio Files|*.mp3;*.ogg;*.m4p;*.mp4;*.avi;*.wma;*.au;*.wav;*.m4a;*.mid;*.mkv;*.mov;*.mpg;*.asf;*.flv;*.mpeg;*.wmv;*.flac", wxFD_OPEN | wxFD_FILE_MUST_EXIST, wxDefaultPosition); std::string media_directory = media_directories.empty() ? "" : media_directories.front(); diff --git a/xLights/SequenceData.h b/xLights/SequenceData.h index e46ab42004..e0ddd49b49 100644 --- a/xLights/SequenceData.h +++ b/xLights/SequenceData.h @@ -46,19 +46,23 @@ class SequenceData { void Zero() { memset(_data, 0x00, _numChannels); } + void Zero(unsigned int start, unsigned int count) { + if (_data == nullptr) return; if (start < 0) return; if (count < 1) return; if (start + count > _numChannels) return; memset(&_data[start], 0x00, count); } - unsigned char &operator[](unsigned int channel) { + [[nodiscard]] unsigned char& operator[](unsigned int channel) + { wxASSERT(_zero == 0); return channel < _numChannels ? _data[channel] : _zero; } - const unsigned char *operator[](unsigned int channel) const { + [[nodiscard]] const unsigned char* operator[](unsigned int channel) const + { const unsigned char* cdata = _data; return channel < _numChannels ? &cdata[channel] : &_constzero; } @@ -106,24 +110,38 @@ class SequenceData { unsigned int TotalTime() const { return _numFrames * _frameTime; } bool OK(unsigned int frame, unsigned int channel) const { return frame < _numFrames && channel < _numChannels; } - FrameData &operator[](unsigned int frame) { + [[nodiscard]] FrameData& operator[](unsigned int frame) + { if (frame >= _numFrames) { return _invalidFrame; } return _frames[frame]; } - const FrameData &operator[](unsigned int frame) const { + [[nodiscard]] const FrameData& operator[](unsigned int frame) const + { if (frame >= _numFrames) { return _invalidFrame; } return _frames[frame]; } - unsigned int NumChannels() const { return _numChannels;} - unsigned int NumFrames() const { return _numFrames;} - unsigned int FrameTime() const { return _frameTime;} - bool IsValidData() const { return !_dataBlocks.empty(); } + [[nodiscard]] unsigned int NumChannels() const + { + return _numChannels; + } + [[nodiscard]] unsigned int NumFrames() const + { + return _numFrames; + } + [[nodiscard]] unsigned int FrameTime() const + { + return _frameTime; + } + [[nodiscard]] bool IsValidData() const + { + return !_dataBlocks.empty(); + } // encodes contents of SeqData in channel order - wxString base64_encode(); + [[nodiscard]] wxString base64_encode(); }; diff --git a/xLights/ShaderDownloadDialog.cpp b/xLights/ShaderDownloadDialog.cpp index bd839ca114..868f734638 100644 --- a/xLights/ShaderDownloadDialog.cpp +++ b/xLights/ShaderDownloadDialog.cpp @@ -35,7 +35,6 @@ #undef min #undef max -CachedFileDownloader ShaderDownloadDialog::_cache; class MShader { @@ -327,9 +326,6 @@ ShaderDownloadDialog::ShaderDownloadDialog(wxWindow* parent, wxWindowID id, cons SetSize(800, 600); - static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); - logger_base.debug("File cache size: %d", _cache.size()); - ListView_Sites->AppendColumn("", wxListColumnFormat::wxLIST_FORMAT_LEFT); ListView_Sites->InsertItem(0, "www.interactiveshaderformat.com/"); ListView_Sites->InsertItem(0, "www.shadertoy.com/"); @@ -426,7 +422,7 @@ ShaderDownloadDialog::~ShaderDownloadDialog() //(*Destroy(ShaderDownloadDialog) //*) - _cache.Save(); + GetCache().Save(); for (const auto& it : _shaders) { diff --git a/xLights/ShaderDownloadDialog.h b/xLights/ShaderDownloadDialog.h index 01e2a18b2d..d9bcd95018 100644 --- a/xLights/ShaderDownloadDialog.h +++ b/xLights/ShaderDownloadDialog.h @@ -40,7 +40,6 @@ class ShaderDownloadDialog: public wxDialog std::string _shaderFile; int _currImage = -1; wxImage _shaderImage; - static CachedFileDownloader _cache; wxXmlDocument* GetXMLFromURL(wxURI url, std::string& filename, wxProgressDialog* prog, int low, int high) const; bool LoadTree(wxProgressDialog* prog, int low = 0, int high = 100); @@ -57,7 +56,7 @@ class ShaderDownloadDialog: public wxDialog virtual ~ShaderDownloadDialog(); std::string GetShaderFile() const { return _shaderFile; } bool DlgInit(wxProgressDialog* prog, int low, int high); - static CachedFileDownloader& GetCache() { return _cache; } + static CachedFileDownloader& GetCache() { return CachedFileDownloader::GetDefaultCache(); } //(*Declarations(ShaderDownloadDialog) wxButton* Button_Download; diff --git a/xLights/SubModelsDialog.cpp b/xLights/SubModelsDialog.cpp index 0f0a9ef8a8..fde6fbbf22 100644 --- a/xLights/SubModelsDialog.cpp +++ b/xLights/SubModelsDialog.cpp @@ -32,6 +32,8 @@ #include #include +#include + #include "SubModelsDialog.h" #include "models/Model.h" #include "SubBufferPanel.h" @@ -122,6 +124,8 @@ const long SubModelsDialog::SUBMODEL_DIALOG_EXPAND_STRANDS_ALL = wxNewId(); const long SubModelsDialog::SUBMODEL_DIALOG_COMPRESS_STRANDS_ALL = wxNewId(); const long SubModelsDialog::SUBMODEL_DIALOG_BLANKS_AS_ZERO = wxNewId(); const long SubModelsDialog::SUBMODEL_DIALOG_BLANKS_AS_EMPTY = wxNewId(); +const long SubModelsDialog::SUBMODEL_DIALOG_REMOVE_BLANKS_ZEROS = wxNewId(); + BEGIN_EVENT_TABLE(SubModelsDialog,wxDialog) //(*EventTable(SubModelsDialog) @@ -1027,6 +1031,7 @@ void SubModelsDialog::OnNodesGridCellRightClick(wxGridEvent& event) mnu.Append(SUBMODEL_DIALOG_COMPRESS_STRANDS_ALL, "Compress All Strands"); mnu.Append(SUBMODEL_DIALOG_BLANKS_AS_ZERO, "Convert Blanks To Zeros"); mnu.Append(SUBMODEL_DIALOG_BLANKS_AS_EMPTY, "Convert Zeros To Empty"); + mnu.Append(SUBMODEL_DIALOG_REMOVE_BLANKS_ZEROS, "Remove Blanks/Zeros"); mnu.Connect(wxEVT_MENU, (wxObjectEventFunction)&SubModelsDialog::OnNodesGridPopup, nullptr, this); PopupMenu(&mnu); @@ -1037,46 +1042,46 @@ void SubModelsDialog::OnNodesGridPopup(wxCommandEvent& event) if (event.GetId() == SUBMODEL_DIALOG_REMOVE_DUPLICATE) { RemoveDuplicates(false); } - if (event.GetId() == SUBMODEL_DIALOG_SUPPRESS_DUPLICATE) { + else if (event.GetId() == SUBMODEL_DIALOG_SUPPRESS_DUPLICATE) { RemoveDuplicates(true); } - if (event.GetId() == SUBMODEL_DIALOG_REMOVE_ALL_DUPLICATE_LR) { + else if (event.GetId() == SUBMODEL_DIALOG_REMOVE_ALL_DUPLICATE_LR) { RemoveAllDuplicates(true, false); } - if (event.GetId() == SUBMODEL_DIALOG_REMOVE_ALL_DUPLICATE_TB) { + else if (event.GetId() == SUBMODEL_DIALOG_REMOVE_ALL_DUPLICATE_TB) { RemoveAllDuplicates(false, false); } - if (event.GetId() == SUBMODEL_DIALOG_SUPPRESS_ALL_DUPLICATE_LR) { + else if (event.GetId() == SUBMODEL_DIALOG_SUPPRESS_ALL_DUPLICATE_LR) { RemoveAllDuplicates(true, true); } - if (event.GetId() == SUBMODEL_DIALOG_SUPPRESS_ALL_DUPLICATE_TB) { + else if (event.GetId() == SUBMODEL_DIALOG_SUPPRESS_ALL_DUPLICATE_TB) { RemoveAllDuplicates(false, true); } - if (event.GetId() == SUBMODEL_DIALOG_EVEN_ROWS) { + else if (event.GetId() == SUBMODEL_DIALOG_EVEN_ROWS) { MakeRowsUniform(); } - if (event.GetId() == SUBMODEL_DIALOG_PIVOT_ROWS_COLUMNS) { + else if (event.GetId() == SUBMODEL_DIALOG_PIVOT_ROWS_COLUMNS) { PivotRowsColumns(); } - if (event.GetId() == SUBMODEL_DIALOG_SYMMETRIZE) { + else if (event.GetId() == SUBMODEL_DIALOG_SYMMETRIZE) { Symmetrize(); } - if (event.GetId() == SUBMODEL_DIALOG_SORT_POINTS) { + else if (event.GetId() == SUBMODEL_DIALOG_SORT_POINTS) { OrderPoints(false); } - if (event.GetId() == SUBMODEL_DIALOG_SORT_POINTS_ALL) { + else if (event.GetId() == SUBMODEL_DIALOG_SORT_POINTS_ALL) { OrderPoints(true); } - if (event.GetId() == SUBMODEL_DIALOG_COMBINE_STRANDS) { + else if (event.GetId() == SUBMODEL_DIALOG_COMBINE_STRANDS) { CombineStrands(); } - if (event.GetId() == SUBMODEL_DIALOG_EXPAND_STRANDS_ALL) { + else if (event.GetId() == SUBMODEL_DIALOG_EXPAND_STRANDS_ALL) { processAllStrands([](wxString str) { return ExpandNodes(str); }); } - if (event.GetId() == SUBMODEL_DIALOG_COMPRESS_STRANDS_ALL) { + else if (event.GetId() == SUBMODEL_DIALOG_COMPRESS_STRANDS_ALL) { processAllStrands([](wxString str) { return CompressNodes(str); }); } - if (event.GetId() == SUBMODEL_DIALOG_BLANKS_AS_ZERO) { + else if (event.GetId() == SUBMODEL_DIALOG_BLANKS_AS_ZERO) { processAllStrands([](wxString str) { auto ns = wxSplit(str, ','); for (auto i = ns.begin(); i != ns.end(); ++i) { @@ -1086,7 +1091,7 @@ void SubModelsDialog::OnNodesGridPopup(wxCommandEvent& event) return wxJoin(ns, ','); }); } - if (event.GetId() == SUBMODEL_DIALOG_BLANKS_AS_EMPTY) { + else if (event.GetId() == SUBMODEL_DIALOG_BLANKS_AS_EMPTY) { processAllStrands([](wxString str) { auto ns = wxSplit(str, ','); for (auto i = ns.begin(); i != ns.end(); ++i) { @@ -1095,6 +1100,16 @@ void SubModelsDialog::OnNodesGridPopup(wxCommandEvent& event) } return wxJoin(ns, ','); }); + } else if (event.GetId() == SUBMODEL_DIALOG_REMOVE_BLANKS_ZEROS) { + processAllStrands([](wxString str) { + auto ns = wxSplit(str, ','); + ns.erase(std::remove_if(ns.begin(), ns.end(), + [](wxString& v) { + return (v == "0" || v == ""); + }), + ns.end()); + return wxJoin(ns, ','); + }); } } diff --git a/xLights/SubModelsDialog.h b/xLights/SubModelsDialog.h index 6f0922d522..82cc141ad0 100644 --- a/xLights/SubModelsDialog.h +++ b/xLights/SubModelsDialog.h @@ -249,6 +249,7 @@ class SubModelsDialog : public wxDialog static const long SUBMODEL_DIALOG_COMPRESS_STRANDS_ALL; static const long SUBMODEL_DIALOG_BLANKS_AS_ZERO; static const long SUBMODEL_DIALOG_BLANKS_AS_EMPTY; + static const long SUBMODEL_DIALOG_REMOVE_BLANKS_ZEROS; void SaveXML(Model* m); wxString GetSelectedName() const; diff --git a/xLights/TabSequence.cpp b/xLights/TabSequence.cpp index a312dd6379..6274ab722e 100644 --- a/xLights/TabSequence.cpp +++ b/xLights/TabSequence.cpp @@ -1162,6 +1162,7 @@ void xLightsFrame::OpenRenderAndSaveSequences(const wxArrayString &origFilenames Destroy(); } else { CloseSequence(); + SetStatusText(_("Batch Render Done.")); } return; } @@ -1186,6 +1187,16 @@ void xLightsFrame::OpenRenderAndSaveSequences(const wxArrayString &origFilenames wxString seq = fileNames[0]; wxStopWatch sw; // start a stopwatch timer + auto b = _renderMode; + _renderMode = false; + if (fileNames.size() == 1) + { + SetStatusText(_("Batch Rendering " + seq + ". Last sequence.")); + } else { + SetStatusText(_("Batch Rendering " + seq + ". " + wxString::Format("%d", (int)fileNames.size() - 1) + " sequences left to render.")); + } + _renderMode = b; + printf("Processing file %s\n", (const char *)seq.c_str()); logger_base.debug("Batch Render Processing file %s\n", (const char *)seq.c_str()); OpenSequence(seq, nullptr); diff --git a/xLights/TabSetup.cpp b/xLights/TabSetup.cpp index e179dbebf3..0a0428b44d 100644 --- a/xLights/TabSetup.cpp +++ b/xLights/TabSetup.cpp @@ -529,16 +529,13 @@ void xLightsFrame::GetControllerDetailsForChannel(int32_t channel, std::string& } std::string xLightsFrame::GetChannelToControllerMapping(int32_t channel) { - int32_t stch; Controller* c = _outputManager.GetController(channel, stch); if (c != nullptr) { return c->GetChannelMapping(channel); } - else { - return wxString::Format("Channel %d could not be mapped to a controller.", channel).ToStdString(); - } + return wxString::Format("Channel %d could not be mapped to a controller.", channel).ToStdString(); } // reset test channel listbox @@ -2136,21 +2133,27 @@ void xLightsFrame::OnListControllersItemRClick(wxListEvent& event) { if (SpecialOptions::GetOption("xxx") == "true") { ethernet += "xxx"; } - int count = List_Controllers->GetSelectedItemCount(); - Controller *controller = nullptr; - if (count == 1) { - auto name = Controllers_PropertyEditor->GetProperty("ControllerName")->GetValue().GetString(); - controller = _outputManager.GetController(name); + + std::vector selectedControllers; + for (const auto& controllerName : GetSelectedControllerNames()) { + Controller* controller = _outputManager.GetController(controllerName); + if (controller) + selectedControllers.push_back(controller); } + bool anySelectedControllersFromBase = std::any_of(selectedControllers.begin(), selectedControllers.end(), [](const Controller* controller) { return controller->IsFromBase(); }); + bool allSelectedControllersFromBase = std::all_of(selectedControllers.begin(), selectedControllers.end(), [](const Controller* controller) { return controller->IsFromBase(); }); + bool enableActivateMenuItems = selectedControllers.size() > 0 && !anySelectedControllersFromBase; + bool enableUnlinkFromBaseMenuItem = selectedControllers.size() > 0 && allSelectedControllersFromBase; + mnu.Append(ID_NETWORK_ADDETHERNET, ethernet)->Enable(ButtonAddControllerSerial->IsEnabled()); mnu.Append(ID_NETWORK_ADDNULL, "Insert NULL")->Enable(ButtonAddControllerSerial->IsEnabled()); mnu.Append(ID_NETWORK_ADDSERIAL, "Insert DMX/LOR/DLight/Renard")->Enable(ButtonAddControllerSerial->IsEnabled()); - mnu.Append(ID_NETWORK_ACTIVE, "Activate")->Enable(ButtonAddControllerSerial->IsEnabled() && controller != nullptr && !controller->IsFromBase()); - mnu.Append(ID_NETWORK_ACTIVEXLIGHTS, "Activate in xLights Only")->Enable(ButtonAddControllerSerial->IsEnabled() && controller != nullptr && !controller->IsFromBase()); - mnu.Append(ID_NETWORK_INACTIVE, "Inactivate")->Enable(ButtonAddControllerSerial->IsEnabled() && controller != nullptr && !controller->IsFromBase()); + mnu.Append(ID_NETWORK_ACTIVE, "Activate")->Enable(ButtonAddControllerSerial->IsEnabled() && enableActivateMenuItems); + mnu.Append(ID_NETWORK_ACTIVEXLIGHTS, "Activate in xLights Only")->Enable(ButtonAddControllerSerial->IsEnabled() && enableActivateMenuItems); + mnu.Append(ID_NETWORK_INACTIVE, "Inactivate")->Enable(ButtonAddControllerSerial->IsEnabled() && enableActivateMenuItems); mnu.Append(ID_NETWORK_DELETE, "Delete")->Enable(ButtonAddControllerSerial->IsEnabled()); - mnu.Append(ID_NETWORK_UNLINKFROMBASE, "Unlink from Base Show Folder")->Enable(ButtonAddControllerSerial->IsEnabled() && controller != nullptr && controller->IsFromBase()); + mnu.Append(ID_NETWORK_UNLINKFROMBASE, "Unlink from Base Show Folder")->Enable(ButtonAddControllerSerial->IsEnabled() && enableUnlinkFromBaseMenuItem); mnu.Connect(wxEVT_MENU, (wxObjectEventFunction)&xLightsFrame::OnListControllerPopup, nullptr, this); PopupMenu(&mnu); @@ -2361,7 +2364,7 @@ bool xLightsFrame::UploadInputToController(Controller* controller, wxString &mes if (caps->SupportsInputOnlyUpload()) { auto vendor = controller->GetVendor(); auto model = controller->GetModel(); - auto ip = controller->GetResolvedIP(); + auto ip = controller->GetResolvedIP(true); if (ip == "MULTICAST" || ip == "") { wxTextEntryDialog dlg(this, "Controller IP Address", "IP Address", ip); if (dlg.ShowModal() != wxID_OK) { @@ -2426,7 +2429,7 @@ bool xLightsFrame::UploadOutputToController(Controller* controller, wxString& me if (caps->SupportsUpload()) { auto vendor = controller->GetVendor(); auto model = controller->GetModel(); - auto ip = controller->GetResolvedIP(); + auto ip = controller->GetResolvedIP(true); if (ip == "MULTICAST") { wxTextEntryDialog dlg(this, "Controller IP Address", "IP Address", ip); if (dlg.ShowModal() != wxID_OK) { diff --git a/xLights/TipOfTheDayDialog.cpp b/xLights/TipOfTheDayDialog.cpp index 6f60c4af91..baec01249d 100644 --- a/xLights/TipOfTheDayDialog.cpp +++ b/xLights/TipOfTheDayDialog.cpp @@ -86,8 +86,8 @@ class TipOfDayThread : public wxThread virtual void* Entry() override { // download Tip of day content here - CachedFileDownloader cache; - auto file = cache.GetFile(wxURI(TOD_BASE_URL + "tod.xml"), CACHEFOR::CACHETIME_DAY); + auto file = CachedFileDownloader::GetDefaultCache().GetFile(wxURI(TOD_BASE_URL + "tod.xml"), CACHEFOR::CACHETIME_DAY); + CachedFileDownloader::GetDefaultCache().Save(); wxCommandEvent e(EVT_TIPOFDAY_READY); e.SetString(file); @@ -121,8 +121,9 @@ class xlCachedHtmlWindow : public wxHtmlWindow { url = baseURL + url.substr(baseFileLocation.size()); } wxURI uri(url); - auto file = cache.GetFile(uri, CACHEFOR::CACHETIME_LONG); + auto file = CachedFileDownloader::GetDefaultCache().GetFile(uri, CACHEFOR::CACHETIME_LONG); if (file != "") { + CachedFileDownloader::GetDefaultCache().Save(); *redirect = file; if (baseFileLocation == "") { baseFileLocation = file.substr(0, file.find_last_of(wxFileName::GetPathSeparator())); @@ -131,7 +132,6 @@ class xlCachedHtmlWindow : public wxHtmlWindow { } return wxHtmlWindow::OnHTMLOpeningURL(type, url, redirect); } - mutable CachedFileDownloader cache; mutable std::string baseURL; mutable std::string baseFileLocation; }; diff --git a/xLights/UtilClasses.h b/xLights/UtilClasses.h index 171020434f..ee43b097f3 100644 --- a/xLights/UtilClasses.h +++ b/xLights/UtilClasses.h @@ -34,8 +34,7 @@ class MapStringString: public std::map { } int GetInt(const std::string &key, const int def = 0) const { std::map::const_iterator i(find(key)); - size_t l = i->second.length(); - if (i == end() || l == 0 || i->second.at(0) == ' ') { + if (i == end() || i->second.length() == 0 || i->second.at(0) == ' ') { return def; } try { @@ -47,8 +46,7 @@ class MapStringString: public std::map { float GetFloat(const std::string& key, const float def = 0.0) const { std::map::const_iterator i(find(key)); - size_t l = i->second.length(); - if (i == end() || l == 0 || i->second.at(0) == ' ') { + if (i == end() || i->second.length() == 0 || i->second.at(0) == ' ') { return def; } try { @@ -61,8 +59,7 @@ class MapStringString: public std::map { double GetDouble(const std::string& key, const double def = 0.0) const { std::map::const_iterator i(find(key)); - size_t l = i->second.length(); - if (i == end() || l == 0 || i->second.at(0) == ' ') { + if (i == end() || i->second.length() == 0 || i->second.at(0) == ' ') { return def; } try { @@ -249,7 +246,10 @@ class ImageFilePickerCtrl : public wxFilePickerCtrl { public: ImageFilePickerCtrl(wxWindow *parent, wxWindowID id, const wxString& path, const wxString& message, const wxString& wildcard, const wxPoint &pos, const wxSize &size, long style, const wxValidator &validator, const wxString &name) : - wxFilePickerCtrl(parent, id, path, message, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*", pos, size, style, validator, name) + wxFilePickerCtrl(parent, id, path, message, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*", + pos, size, style, validator, name) { } }; diff --git a/xLights/ValueCurve.cpp b/xLights/ValueCurve.cpp index a74e956da9..98104f3ae6 100644 --- a/xLights/ValueCurve.cpp +++ b/xLights/ValueCurve.cpp @@ -1679,6 +1679,16 @@ float ValueCurve::GetOutputValueAtDivided(float offset, long startMS, long endMS return (_min + (_max - _min) * GetValueAt(offset, startMS, endMS)) / _divisor; } +float ValueCurve::GetMaxValueDivided() +{ + float max = GetMin() / _divisor; + for (int i = 0; i < 100; ++i) + { + max = std::max(max, GetOutputValueAtDivided(i * 50, 0, 100 * 50)); + } + return max; +} + float ValueCurve::ApplyGain(float value, int gain) const { float v = (100.0 + gain) * value / 100.0; @@ -2186,16 +2196,47 @@ void ValueCurve::ScaleAndOffsetValues(float scale, int offset) return (val * scale ) + offset; }; - _parameter1 = ScaleVal(_parameter1); - _parameter2 = ScaleVal(_parameter2); - _parameter3 = ScaleVal(_parameter3); - _parameter4 = ScaleVal(_parameter4); + std::vector parametersToScale; - if (_type == "Custom") - { - for (auto& it : _values) - { + if (_type == "Custom") { + for (auto& it : _values) { it.y = ScaleVal(it.y); } - } + } else if (_type == "Flat") { + parametersToScale.push_back(1); + } else if (_type == "Ramp" || _type == "Ramp Up/Down Hold" || _type == "Saw Tooth" || _type == "Square" || _type == "Random" || _type == "Music" || _type == "Inverted Music" || + _type == "Music Trigger Fade" || _type == "Timing Track Toggle" || _type == "Timing Track Fade Fixed" || _type == "Timing Track Fade Proportional") { + parametersToScale.push_back(1); + parametersToScale.push_back(2); + } else if (_type == "Ramp Up/Down") { + parametersToScale.push_back(1); + parametersToScale.push_back(2); + parametersToScale.push_back(3); + } else if (_type == "Parabolic Down" || _type == "Parabolic Up" || _type == "Logarithmic Up" || _type == "Logarithmic Down" || _type == "Exponential Up" || _type == "Exponential Down") { + parametersToScale.push_back(2); + } else if (_type == "Sine" || _type == "Abs Sine" || _type == "Decaying Sine") { + parametersToScale.push_back(4); + } else { + parametersToScale.push_back(1); + parametersToScale.push_back(2); + parametersToScale.push_back(3); + parametersToScale.push_back(4); + } + + for (int param : parametersToScale) { + switch (param) { + case 1: + _parameter1 = ScaleVal(_parameter1); + break; + case 2: + _parameter2 = ScaleVal(_parameter2); + break; + case 3: + _parameter3 = ScaleVal(_parameter3); + break; + case 4: + _parameter4 = ScaleVal(_parameter4); + break; + } + } } diff --git a/xLights/ValueCurve.h b/xLights/ValueCurve.h index e60f33250e..13fe35ae3a 100644 --- a/xLights/ValueCurve.h +++ b/xLights/ValueCurve.h @@ -146,6 +146,7 @@ class ValueCurve float GetValueAt(float offset, long startMS, long endMS); float GetOutputValueAt(float offset, long startMS, long endMS); float GetOutputValueAtDivided(float offset, long startMS, long endMS); + float GetMaxValueDivided(); float GetScaledValue(float offset) const; void SetActive(bool a) { _active = a; RenderType(); } bool IsActive() const { return _active && IsOk(); } diff --git a/xLights/VendorModelDialog.cpp b/xLights/VendorModelDialog.cpp index 984236c2e3..cd9ef3a630 100644 --- a/xLights/VendorModelDialog.cpp +++ b/xLights/VendorModelDialog.cpp @@ -28,8 +28,6 @@ #include "UtilFunctions.h" #include "ExternalHooks.h" -CachedFileDownloader VendorModelDialog::_cache; - class MModel; class MModelWiring @@ -800,9 +798,6 @@ VendorModelDialog::VendorModelDialog(wxWindow* parent, const std::string& showFo SetSize(800, 600); - static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); - logger_base.debug("File cache size: %d", _cache.size()); - PopulateModelPanel((MModel*)nullptr); PopulateVendorPanel(nullptr); @@ -1038,10 +1033,9 @@ VendorModelDialog::~VendorModelDialog() //(*Destroy(VendorModelDialog) //*) - _cache.Save(); + GetCache().Save(); - for (const auto& it : _vendors) - { + for (const auto& it : _vendors) { delete it; } } diff --git a/xLights/VendorModelDialog.h b/xLights/VendorModelDialog.h index 6d88b3d040..8677d9c777 100644 --- a/xLights/VendorModelDialog.h +++ b/xLights/VendorModelDialog.h @@ -46,7 +46,6 @@ class VendorModelDialog: public wxDialog int _currImage = -1; wxImage _vendorImage; wxImage _modelImage; - static CachedFileDownloader _cache; wxXmlDocument* GetXMLFromURL(wxURI url, std::string& filename, wxProgressDialog* prog, int low, int high, bool keepProgress) const; bool LoadTree(wxProgressDialog* prog, int low = 0, int high = 100); @@ -70,7 +69,7 @@ class VendorModelDialog: public wxDialog std::string GetModelFile() const { return _modelFile; } bool DlgInit(wxProgressDialog* prog, int low, int high); bool FindModelFile(const std::string &vendor, const std::string &model); - static CachedFileDownloader& GetCache() { return _cache; } + static CachedFileDownloader& GetCache() { return CachedFileDownloader::GetDefaultCache(); } //(*Declarations(VendorModelDialog) wxButton* Button_InsertModel; diff --git a/xLights/Xlights.vcxproj b/xLights/Xlights.vcxproj index 2f2cda16c3..f6af9a964c 100644 --- a/xLights/Xlights.vcxproj +++ b/xLights/Xlights.vcxproj @@ -130,7 +130,7 @@ Level3 Disabled - _DEBUG;_WINDOWS;%(PreprocessorDefinitions);WXDEBUG;__WXDEBUG__;_CRT_SECURE_NO_WARNINGS;IGNORE_VENDORS;$(DefineConstants); + _DEBUG;_WINDOWS;%(PreprocessorDefinitions);WXDEBUG;__WXDEBUG__;_CRT_SECURE_NO_WARNINGS;IGNORE_VENDORS;$(DefineConstants);wxUSE_WEBP true stdcpp17 /D "NOMINMAX" @@ -292,6 +292,9 @@ xcopy "$(SolutionDir)..\bin64\Vamp\" "$(TargetDir)Vamp\" /e /y /i /r + + + @@ -707,6 +710,7 @@ xcopy "$(SolutionDir)..\bin64\Vamp\" "$(TargetDir)Vamp\" /e /y /i /r + @@ -779,6 +783,9 @@ xcopy "$(SolutionDir)..\bin64\Vamp\" "$(TargetDir)Vamp\" /e /y /i /r + + + @@ -1201,6 +1208,7 @@ xcopy "$(SolutionDir)..\bin64\Vamp\" "$(TargetDir)Vamp\" /e /y /i /r + diff --git a/xLights/Xlights.vcxproj.filters b/xLights/Xlights.vcxproj.filters index 7fe0d1a247..f27e0a7c5c 100644 --- a/xLights/Xlights.vcxproj.filters +++ b/xLights/Xlights.vcxproj.filters @@ -1035,6 +1035,16 @@ Effects + + + Effects + + + Effects + + + Models + @@ -2083,6 +2093,16 @@ Effects + + + Effects + + + Effects + + + Models + diff --git a/xLights/automation/xLightsAutomations.cpp b/xLights/automation/xLightsAutomations.cpp index 17cfa5e30e..26d5f048c0 100644 --- a/xLights/automation/xLightsAutomations.cpp +++ b/xLights/automation/xLightsAutomations.cpp @@ -456,7 +456,7 @@ bool xLightsFrame::ProcessAutomation(std::vector &paths, } fpp->FinalizeUploadSequence(); - if (fpp->fppType == FPP_TYPE::FALCONV4) { + if (fpp->fppType == FPP_TYPE::FALCONV4V5) { // a falcon std::string proxy = ""; auto c = _outputManager.GetControllers(fpp->ipAddress); diff --git a/xLights/controllers/AlphaPix.cpp b/xLights/controllers/AlphaPix.cpp index 2c973946ca..9355204a34 100644 --- a/xLights/controllers/AlphaPix.cpp +++ b/xLights/controllers/AlphaPix.cpp @@ -28,6 +28,8 @@ #include +#include + #pragma region Output Classes class AlphaPixOutput { @@ -107,7 +109,7 @@ AlphaPix::AlphaPix(const std::string& ip, const std::string &proxy) : BaseContro static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); - _page = GetURL("/"); + _page = APGetURL("/"); if (!_page.empty()) { if (_page.Contains("Existing user login")) { logger_base.error("AlphaPix Webpage locked out by another computer"); @@ -214,7 +216,7 @@ bool AlphaPix::ParseWebpage(const wxString& page, AlphaPixData& data) { } else { //Load advance color order page - const wxString colorPage = PutURL(GetColorOrderURL(), "RGBORD=1"); + const wxString colorPage = APPutURL(GetColorOrderURL(), "RGBORD=1"); for (auto& pixelPort : _pixelOutputs) { pixelPort->colorOrder = ExtractSingleColor(colorPage, pixelPort->output); } @@ -582,6 +584,79 @@ std::string AlphaPix::SafeDescription(const std::string description) const { wxString desc(description); return desc.Left(16).ToStdString(); } + +std::string AlphaPix::APGetURL(const std::string& url) const +{ + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + std::string res; + std::string const baseIP = _fppProxy.empty() ? _ip : _fppProxy; + + CURL* curl = curl_easy_init(); + if (curl) { + auto u = std::string("http://" + baseIP + _baseUrl + url); + logger_base.debug("Curl GET: %s", (const char*)u.c_str()); + curl_easy_setopt(curl, CURLOPT_URL, u.c_str()); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15); + curl_easy_setopt(curl, CURLOPT_HTTP09_ALLOWED, 1L); + curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); + std::string response_string; + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string); + + /* Perform the request, res will get the return code */ + CURLcode r = curl_easy_perform(curl); + + if (r != CURLE_OK) { + logger_base.error("Failure to access %s: %s.", (const char*)url.c_str(), curl_easy_strerror(r)); + } else { + res = response_string; + } + /* always cleanup */ + curl_easy_cleanup(curl); + } + return res; +} + +std::string AlphaPix::APPutURL(const std::string& url, const std::string& request) const +{ + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + + std::string const baseIP = _fppProxy.empty() ? _ip : _fppProxy; + logger_base.debug("Making request to Controller '%s'.", (const char*)url.c_str()); + logger_base.debug(" With data '%s'.", (const char*)request.c_str()); + + CURL* curl = curl_easy_init(); + if (curl != nullptr) { + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); + auto u = std::string("http://" + baseIP + _baseUrl + url); + logger_base.debug("Curl POST: %s", (const char*)u.c_str()); + curl_easy_setopt(curl, CURLOPT_URL, u.c_str()); + curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); + + struct curl_slist* headers = NULL; + headers = curl_slist_append(headers, _("content-type: application/x-www-form-urlencoded").c_str()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)request.size()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (const char*)request.c_str()); + // curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30); + curl_easy_setopt(curl, CURLOPT_HTTP09_ALLOWED, 1L); + std::string buffer = ""; + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); + + CURLcode ret = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + if (ret == CURLE_OK) { + return buffer; + } + logger_base.error("Failure to access %s: %s.", (const char*)url.c_str(), curl_easy_strerror(ret)); + } + + return ""; +} #pragma endregion #pragma region Getters and Setters @@ -674,7 +749,7 @@ bool AlphaPix::SetOutputs(ModelManager* allmodels, OutputManager* outputManager, if (serial->upload) { if (_modelnum == 4) { const std::string serialRequest = wxString::Format("Rever5=1&DMX512=%d", serial->universe); - const wxString res = PutURL(GetDMXURL(), serialRequest); + const wxString res = APPutURL(GetDMXURL(), serialRequest); if (res.empty()) worked = false; wxMilliSleep(1000); @@ -682,7 +757,7 @@ bool AlphaPix::SetOutputs(ModelManager* allmodels, OutputManager* outputManager, else { const std::string serialRequest = wxString::Format("Rever%d=1&DMX512_%d=%d", serial->output, serial->output, serial->universe); - const wxString res = PutURL(GetDMXURL(serial->output), serialRequest); + const wxString res = APPutURL(GetDMXURL(serial->output), serialRequest); if (res.empty()) worked = false; wxMilliSleep(1000); @@ -694,7 +769,7 @@ bool AlphaPix::SetOutputs(ModelManager* allmodels, OutputManager* outputManager, progress.Update(50, "Uploading Protocol Type."); const int newProtocol = EncodeStringPortProtocol(pixelType); if (newProtocol != -1 && controllerData.protocol != newProtocol) { - const wxString res = PutURL(GetProtocolURL(), wxString::Format("IC=%d", newProtocol)); + const wxString res = APPutURL(GetProtocolURL(), wxString::Format("IC=%d", newProtocol)); if (res.empty()) worked = false; wxMilliSleep(1000); @@ -708,14 +783,14 @@ bool AlphaPix::SetOutputs(ModelManager* allmodels, OutputManager* outputManager, colorOrder.erase(std::unique(colorOrder.begin(), colorOrder.end()), colorOrder.end()); if (colorOrder.size() == 1) { //all the same color order, "simple mode" will do - const wxString res = PutURL(GetColorOrderURL(), wxString::Format("RGBORD=0&RGBS=%d", colorOrder[0])); + const wxString res = APPutURL(GetColorOrderURL(), wxString::Format("RGBORD=0&RGBS=%d", colorOrder[0])); if (res.empty()) worked = false; wxMilliSleep(1000); } else { // different color orders, "advance mode" needed - const wxString res = PutURL(GetColorOrderURL(), "RGBORD=1"); + const wxString res = APPutURL(GetColorOrderURL(), "RGBORD=1"); if (res.empty()) worked = false; wxMilliSleep(1000); @@ -728,7 +803,7 @@ bool AlphaPix::SetOutputs(ModelManager* allmodels, OutputManager* outputManager, pixelPort->output, pixelPort->colorOrder); } - const wxString res2 = PutURL(GetIndvColorOrderURL(), colorRequestString); + const wxString res2 = APPutURL(GetIndvColorOrderURL(), colorRequestString); if (res2.empty()) worked = false; wxMilliSleep(1000); @@ -739,7 +814,7 @@ bool AlphaPix::SetOutputs(ModelManager* allmodels, OutputManager* outputManager, progress.Update(70, "Uploading Output Description."); const std::string outName = SafeDescription(controller->GetName()); if (!outName.empty() && !controllerData.name.IsSameAs(outName)) { - const wxString res = PutURL(GetNameURL(), "name=" + outName); + const wxString res = APPutURL(GetNameURL(), "name=" + outName); if (res.empty()) worked = false; wxMilliSleep(1000); @@ -760,7 +835,7 @@ bool AlphaPix::SetOutputs(ModelManager* allmodels, OutputManager* outputManager, logger_base.info("Uploading Output Type."); progress.Update(80, "Updating Output Type."); if (!requestInputString.empty()) { - const wxString res = PutURL(GetInputTypeURL(), requestInputString); + const wxString res = APPutURL(GetInputTypeURL(), requestInputString); if (res.empty()) worked = false; //wait for reboot @@ -790,7 +865,7 @@ void AlphaPix::UploadPixelOutputs(bool& worked) { logger_base.info("PUT String Output Information."); if (!requestString.empty()) { - const wxString res = PutURL(GetOutputURL(), requestString); + const wxString res = APPutURL(GetOutputURL(), requestString); if (res.empty()) worked = false; wxMilliSleep(2000); @@ -820,7 +895,7 @@ void AlphaPix::UploadFlexPixelOutputs(bool& worked) { logger_base.info("PUT String Output Information."); if (!requestString.empty() && upload) { - const wxString res = PutURL(GetOutputURL(i + 1), requestString); + const wxString res = APPutURL(GetOutputURL(i + 1), requestString); if (res.empty()) worked = false; wxMilliSleep(2000); diff --git a/xLights/controllers/AlphaPix.h b/xLights/controllers/AlphaPix.h index 61504a6d6a..0118673843 100644 --- a/xLights/controllers/AlphaPix.h +++ b/xLights/controllers/AlphaPix.h @@ -78,6 +78,9 @@ class AlphaPix : public BaseController return 2; return 0; } + + std::string APGetURL(const std::string& url) const; + std::string APPutURL(const std::string& url, const std::string& request) const; #pragma endregion #pragma region Private Static Functions @@ -98,11 +101,22 @@ class AlphaPix : public BaseController AlphaPix(const std::string& ip, const std::string &fppProxy); virtual ~AlphaPix(); #pragma endregion + +#pragma region Static Functions + static size_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) + { + if (data == nullptr) + return 0; + data->append((char*)ptr, size * nmemb); + return size * nmemb; + } +#pragma endregion #pragma region Getters and Setters #ifndef DISCOVERYONLY virtual bool SetOutputs(ModelManager* allmodels, OutputManager* outputManager, Controller* controller, wxWindow* parent) override; #endif virtual bool UsesHTTP() const override { return true; } + virtual bool needsHTTP_0_9() const override { return true; } #pragma endregion }; diff --git a/xLights/controllers/BaseController.cpp b/xLights/controllers/BaseController.cpp index 82f05c0b85..5585c3a15d 100644 --- a/xLights/controllers/BaseController.cpp +++ b/xLights/controllers/BaseController.cpp @@ -35,6 +35,7 @@ #include "Minleon.h" #include "WLED.h" #include "Experience.h" +#include "utils/CurlManager.h" #pragma region Constructors and Destructors BaseController::BaseController(const std::string& ip, const std::string &proxy) : _ip(ip), _fppProxy(proxy), _baseUrl("") { @@ -104,103 +105,46 @@ BaseController *BaseController::CreateBaseController(Controller *controller, con #pragma region Protected Functions std::string BaseController::GetURL(const std::string& url, const std::string& username, const std::string& password) const{ - static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); - std::string res; - std::string const baseIP = _fppProxy.empty() ? _ip : _fppProxy; - - CURL* curl = curl_easy_init(); - if (curl) { - auto u = std::string("http://" + baseIP + _baseUrl + url); - logger_base.debug("Curl GET: %s", (const char*)u.c_str()); - curl_easy_setopt(curl, CURLOPT_URL, u.c_str()); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15); - curl_easy_setopt(curl, CURLOPT_HTTP09_ALLOWED, 1L); - curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); - //curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); - - std::string response_string; - - if (!username.empty()) - { - curl_easy_setopt(curl, CURLOPT_USERNAME, (const char*)username.c_str()); - curl_easy_setopt(curl, CURLOPT_PASSWORD, (const char*)password.c_str()); - } - -#ifdef __WXMSW__ - curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, Curl::CurlDebug); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); -#endif - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string); - - /* Perform the request, res will get the return code */ - CURLcode r = curl_easy_perform(curl); - - if (r != CURLE_OK) { - logger_base.error("Failure to access %s: %s.", (const char*)url.c_str(), curl_easy_strerror(r)); - } - else { - res = response_string; - } - - /* always cleanup */ - curl_easy_cleanup(curl); + std::string const baseIP = _fppProxy.empty() ? _ip : _fppProxy; + auto furl = std::string("http://" + baseIP + _baseUrl + url); + if (!username.empty()) { + CurlManager::INSTANCE.setHostUsernamePassword(baseIP, username, password); + } + if (needsHTTP_0_9() && _fppProxy.empty()) { + CurlManager::INSTANCE.setHostAllowHTTP_0_9(baseIP, true); + } + int rc = 0; + std::string res = CurlManager::INSTANCE.doGet(furl, rc); + if (rc == 0 && !needsHTTP_0_9()) { + logger_base.error("Failure to access %s: %s.", (const char*)furl.c_str(), res.c_str()); + return ""; } return res; } std::string BaseController::PutURL(const std::string& url, const std::string& request, const std::string& username, const std::string& password, const std::string& contentType) const { - static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); std::string const baseIP = _fppProxy.empty() ? _ip : _fppProxy; logger_base.debug("Making request to Controller '%s'.", (const char*)url.c_str()); logger_base.debug(" With data '%s'.", (const char*)request.c_str()); - - CURL* curl = curl_easy_init(); - if (curl != nullptr) { - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); - auto u = std::string("http://" + baseIP + _baseUrl + url); - logger_base.debug("Curl POST: %s", (const char*)u.c_str()); - curl_easy_setopt(curl, CURLOPT_URL, u.c_str()); - curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); - -#ifdef __WXMSW__ - curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, Curl::CurlDebug); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); -#endif - - struct curl_slist* headers = NULL; - - headers = curl_slist_append(headers, _("content-type: application/" + contentType).c_str()); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)request.size()); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (const char*)request.c_str()); - //curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); - - if (username != "") - { - curl_easy_setopt(curl, CURLOPT_USERNAME, (const char*)username.c_str()); - curl_easy_setopt(curl, CURLOPT_PASSWORD, (const char*)password.c_str()); - } - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30); - curl_easy_setopt(curl, CURLOPT_HTTP09_ALLOWED, 1L); - std::string buffer = ""; - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); - - CURLcode ret = curl_easy_perform(curl); - curl_easy_cleanup(curl); - - if (ret == CURLE_OK) { - return buffer; - } - logger_base.error("Failure to access %s: %s.", (const char*)url.c_str(), curl_easy_strerror(ret)); + + auto furl = std::string("http://" + baseIP + _baseUrl + url); + if (!username.empty()) { + CurlManager::INSTANCE.setHostUsernamePassword(baseIP, username, password); } - - return ""; + if (needsHTTP_0_9() && _fppProxy.empty()) { + CurlManager::INSTANCE.setHostAllowHTTP_0_9(baseIP, true); + } + int rc = 0; + std::string res = CurlManager::INSTANCE.doPost(furl, contentType, request, rc); + if (rc == 0 && !needsHTTP_0_9()) { + logger_base.error("Failure to post to %s: %s.", (const char*)furl.c_str(), res.c_str()); + return ""; + } + return res; } #pragma endregion diff --git a/xLights/controllers/BaseController.h b/xLights/controllers/BaseController.h index 620976702f..07c5d9399c 100644 --- a/xLights/controllers/BaseController.h +++ b/xLights/controllers/BaseController.h @@ -33,20 +33,13 @@ class BaseController #pragma endregion #pragma region Protected Functions + virtual bool needsHTTP_0_9() const { return false; } std::string GetURL(const std::string& url, const std::string& username = "", const std::string& password = "") const; std::string PutURL(const std::string& url, const std::string& request, const std::string& username = "", const std::string& password = "", const std::string& contentType = "x-www-form-urlencoded") const; #pragma endregion public: - - #pragma region Static Functions - static size_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) { - if (data == nullptr) return 0; - data->append((char*)ptr, size * nmemb); - return size * nmemb; - } - #pragma endregion #pragma region Constructors and Destructors BaseController() {} diff --git a/xLights/controllers/ControllerUploadData.cpp b/xLights/controllers/ControllerUploadData.cpp index ec335424a6..267d2d8ec8 100644 --- a/xLights/controllers/ControllerUploadData.cpp +++ b/xLights/controllers/ControllerUploadData.cpp @@ -571,6 +571,7 @@ void UDControllerPort::CreateVirtualStrings(bool mergeSequential) { int32_t lastEndChannel = -1000; UDVirtualString* current = nullptr; + int curRemote = 0; for (const auto& it : _models) { bool first = false; int brightness = it->GetBrightness(NO_VALUE_INT); @@ -586,12 +587,12 @@ void UDControllerPort::CreateVirtualStrings(bool mergeSequential) { if (current == nullptr || !mergeSequential) { if (smartRemote != 0) { - int curRemote = current == nullptr ? (smartRemote < 100 ? 0 : 99): current->_smartRemote < 100; curRemote++; for (int sr = curRemote; sr < smartRemote; sr++) { // we seem to have missed one so create a dummy current = new UDVirtualString(); _virtualStrings.push_back(current); + curRemote++; current->_endChannel = it->GetStartChannel() + 2; current->_startChannel = it->GetStartChannel(); current->_description = "DUMMY"; diff --git a/xLights/controllers/Experience.cpp b/xLights/controllers/Experience.cpp index 73ece5dc99..c03f767f15 100644 --- a/xLights/controllers/Experience.cpp +++ b/xLights/controllers/Experience.cpp @@ -23,6 +23,8 @@ #include +#include "../utils/Curl.h" + #include #include #include @@ -51,6 +53,18 @@ std::string Experience::PostJSONToURL(const std::string& url, const wxJSONValue& } #pragma endregion +bool Experience::UploadSequence(const std::string& seq, const std::string& file,std::function progress) +{ + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + + std::string const baseIP = _fppProxy.empty() ? _ip : _fppProxy; + std::string url = "http://" + baseIP + _baseUrl + "/upload"; + logger_base.debug("Uploading to URL: %s", (const char*)url.c_str()); + + wxFileName fn(file); + return Curl::HTTPUploadFile(url, seq, fn.GetFullName().ToStdString(), progress); +} + #pragma region Encode and Decode int Experience::EncodeBrightness(int brightness) const { diff --git a/xLights/controllers/Experience.h b/xLights/controllers/Experience.h index a5e410ee00..0e936555a7 100644 --- a/xLights/controllers/Experience.h +++ b/xLights/controllers/Experience.h @@ -56,6 +56,8 @@ class Experience : public BaseController virtual ~Experience(){}; #pragma endregion + bool UploadSequence(const std::string& seq, const std::string& file, std::function progress); + #pragma region Getters and Setters #ifndef DISCOVERYONLY int32_t SetInputUniverses(wxJSONValue& data, Controller* controller); diff --git a/xLights/controllers/FPP.cpp b/xLights/controllers/FPP.cpp index 7eeb91af41..b6116fc316 100644 --- a/xLights/controllers/FPP.cpp +++ b/xLights/controllers/FPP.cpp @@ -220,9 +220,15 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp) { return dt->readData(ptr, buffer_size); } +static size_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) { + + if (data == nullptr) return 0; + data->append((char*)ptr, size * nmemb); + return size * nmemb; +} CURL *FPP::setupCurl(const std::string &url, bool isGet, int timeout) { CURL* curl = curl_easy_init(); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, BaseController::writeFunction); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &curlInputBuffer); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, defaultConnectTimeout); @@ -255,7 +261,7 @@ bool FPP::GetURLAsString(const std::string& url, std::string& val, bool recordEr std::string fullUrl = ipAddress + url; std::string ipAddForGet = ipAddress; if (fppType == FPP_TYPE::ESPIXELSTICK) { - fullUrl = ipAddress + "/fpp?path=" + url; + fullUrl = ipAddress + "/fpp?path=" + url; } if (!_fppProxy.empty()) { fullUrl = "http://" + _fppProxy + "/proxy/" + fullUrl; @@ -421,14 +427,12 @@ bool FPP::parseSysInfo(wxJSONValue& val) { } bool FPP::IsDDPInputEnabled() { - if (!IsDrive()) { - wxJSONValue origRoot; - if (GetURLAsJSON("/api/configfile/ci-universes.json", origRoot, false)) { - if (origRoot.HasMember("channelInputs") && origRoot.ItemAt("channelInputs").HasMember(0) - && origRoot.ItemAt("channelInputs").ItemAt(0).HasMember("enabled") && - origRoot.ItemAt("channelInputs").ItemAt(0).ItemAt("enabled").AsInt() == 1) { - return true; - } + wxJSONValue origRoot; + if (GetURLAsJSON("/api/configfile/ci-universes.json", origRoot, false)) { + if (origRoot.HasMember("channelInputs") && origRoot.ItemAt("channelInputs").HasMember(0) + && origRoot.ItemAt("channelInputs").ItemAt(0).HasMember("enabled") && + origRoot.ItemAt("channelInputs").ItemAt(0).ItemAt("enabled").AsInt() == 1) { + return true; } } return false; @@ -517,11 +521,6 @@ void FPP::parseConfig(const std::string& v) { } } - -bool FPP::IsDrive() { - return ipAddress.find("/") != std::string::npos || ipAddress.find("\\") != std::string::npos; -} - bool FPP::IsVersionAtLeast(uint32_t maj, uint32_t min, uint32_t patch) const{ if (majorVersion < maj) { return false; @@ -595,30 +594,6 @@ static inline void addString(wxMemoryBuffer &buffer, const std::string &str) { buffer.AppendData(str.c_str(), str.length()); } -bool FPP::GetPathAsJSON(const std::string &path, wxJSONValue &val) { - wxFileName fn; - fn = ToWXString(path); - if (FileExists(fn)) { - wxJSONReader reader; - wxFile tf(fn.GetFullPath()); - wxString json; - tf.ReadAll(&json); - reader.Parse(json, &val); - tf.Close(); - return true; - } - return false; -} -bool FPP::WriteJSONToPath(const std::string& path, const wxJSONValue& val) { - wxFileName fn; - fn = ToWXString(path); - wxFileOutputStream ufile(fn.GetFullPath()); - wxJSONWriter writer(wxJSONWRITER_STYLED, 0, 3); - writer.Write(val, ufile); - ufile.Close(); - return true; -} - int FPP::PostJSONToURL(const std::string& url, const wxJSONValue& val) { wxString str; wxJSONWriter writer(wxJSONWRITER_STYLED, 0, 3); @@ -816,13 +791,15 @@ bool FPP::callMoveFile(const std::string &filename) { return GetURLAsString("/fppxml.php?command=moveFile&file=" + URLEncode(filename), val); } -struct V7ProgressStruct { +class V7ProgressStruct { +public: wxFile in; FPP *instance; size_t length; size_t offset = 0; int lastPct = 0; + int errorCount = 0; std::string fullUrl; std::string fileSizeHeader; @@ -852,17 +829,19 @@ int progress_callback(void *clientp, void prepareCurlForMulti(V7ProgressStruct *ps) { static log4cpp::Category& logger_curl = log4cpp::Category::getInstance(std::string("log_curl")); - constexpr uint64_t BLOCK_SIZE = 64*1024*1024; + constexpr uint64_t BLOCK_SIZE = 16*1024*1024; CurlManager::CurlPrivateData *cpd = nullptr; CURL *curl = CurlManager::INSTANCE.createCurl(ps->fullUrl, &cpd, true); - //if we cannot upload it in 5 minutes, we have serious issues - curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 1000*5*60); + //if we cannot upload a single chunk in 3 minutes, we have serious issues + curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 1000*3*60); struct curl_slist *headers = nullptr; - headers = curl_slist_append(headers, "Content-Type: application/octet-stream"); + headers = curl_slist_append(headers, "Content-Type: application/offset+octet-stream"); headers = curl_slist_append(headers, "X-Requested-With: FPPConnect"); - + headers = curl_slist_append(headers, "Expect:"); + headers = curl_slist_append(headers, "Connection: keep-alive"); + std::string offsetHeader = "Upload-Offset: " + std::to_string(ps->offset); headers = curl_slist_append(headers, offsetHeader.c_str()); headers = curl_slist_append(headers, ps->fileSizeHeader.c_str()); @@ -876,6 +855,7 @@ void prepareCurlForMulti(V7ProgressStruct *ps) { cpd->req->resize(remaining); uint64_t read = ps->in.Read(cpd->req->data(), remaining); if (read != remaining) { + logger_curl.info("ERROR Uploading file: " + ps->filename + " Could not read source file."); ps->instance->messages.push_back("ERROR Uploading file: " + ps->filename + " Could not read source file."); } std::string contentSizeHeader = "Content-Length: " + std::to_string(remaining); @@ -898,9 +878,20 @@ void prepareCurlForMulti(V7ProgressStruct *ps) { long response_code = 0; curl_easy_getinfo(c, CURLINFO_RESPONSE_CODE, &response_code); logger_curl.info(" FPPConnect CURL Callbak - URL: %s Response: %d", ps->fullUrl.c_str(), response_code); - ps->offset += remaining; + bool cancelled = false; + if (response_code != 200 && ps->errorCount < 3) { + // strange error on upload, let's restart and try again (up to three attempts) + ps->offset = 0; + ps->in.Seek(0); + ++ps->errorCount; + } else if (response_code != 200) { + ps->instance->messages.push_back("ERROR Uploading file: " + ps->filename + ". Response code: " + std::to_string(response_code)); + cancelled = true; + } else { + ps->offset += remaining; + } uint64_t pct = (ps->offset * 1000) / ps->length; - bool cancelled = ps->instance->updateProgress(pct, false); + cancelled |= ps->instance->updateProgress(pct, false); if (cancelled || ps->offset >= ps->length) { delete ps; } else { @@ -941,58 +932,10 @@ bool FPP::uploadFileV7(const std::string &filename, return cancelled; } -bool FPP::copyFile(const std::string &filename, - const std::string &file, - const std::string &dir) { - static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); - bool cancelled = false; - cancelled |= updateProgress(0, true); - - wxFile in; - in.Open(ToWXString(file)); - - if (in.IsOpened()) { - wxFile out; - wxString target = ipAddress + wxFileName::GetPathSeparator() + dir + wxFileName::GetPathSeparator() + filename; - out.Open(target, wxFile::write); - - if (out.IsOpened()) { - wxFileOffset length = in.Length(); - wxFileOffset done = 0; - - uint8_t buffer[8192]; // 8KB at a time - while (!in.Eof() && !cancelled) { - size_t read = in.Read(&buffer[0], sizeof(buffer)); - size_t written = out.Write(&buffer[0], read); - while (written < read) { - written += out.Write(&buffer[written], read - written); - } - done += read; - - int prgs = done * 1000 / length; - cancelled |= updateProgress(prgs, true); - } - cancelled |= updateProgress(1000, true); - in.Close(); - out.Close(); - } else { - cancelled |= updateProgress(1000, true); - logger_base.warn(" Copy of file %s failed ... target file %s could not be opened.", (const char *)file.c_str(), (const char *)target.c_str()); - } - } else { - cancelled |= updateProgress(1000, true); - logger_base.warn(" Copy of file %s failed ... file could not be opened.", (const char *)file.c_str()); - } - return cancelled; -} - bool FPP::uploadOrCopyFile(const std::string &filename, const std::string &file, const std::string &dir) { - if (IsDrive()) { - return copyFile(filename, file, dir); - } - if (IsVersionAtLeast(6, 3, 2)) { + if (fppType == FPP_TYPE::FPP && IsVersionAtLeast(6, 3, 2)) { return uploadFileV7(filename, file, dir); } return uploadFile(filename, file); @@ -1066,6 +1009,52 @@ static void FindHostSpecificMedia(const std::string &hostName, std::string &medi } } } +bool FPP::CheckUploadMedia(const std::string &media, std::string &mediaBaseName) { + bool cancelled = false; + wxFileName mfn(FromUTF8(media)); + std::string mediaFile = media; + mediaBaseName = ToUTF8(mfn.GetFullName()); + + if (majorVersion >= 6) { + FindHostSpecificMedia(hostName, mediaBaseName, mediaFile, mfn); + } + + std::string url = "/api/media/" + URLEncode(mediaBaseName) + "/meta"; + std::string fullUrl = ipAddress + url; + std::string ipAddForGet = ipAddress; + if (!_fppProxy.empty()) { + fullUrl = "http://" + _fppProxy + "/proxy/" + fullUrl; + ipAddForGet = _fppProxy; + } else { + fullUrl = "http://" + fullUrl; + } + if (username != "") { + CurlManager::INSTANCE.setHostUsernamePassword(ipAddForGet, username, password); + } + CurlManager::INSTANCE.addGet(fullUrl, [this, mfn, mediaBaseName, mediaFile](int rc, const std::string &resp) { + bool doMediaUpload = true; + if (rc == 200) { + wxJSONValue currentMeta; + wxJSONReader reader; + reader.Parse(resp, ¤tMeta); + if (currentMeta.HasMember("format") && currentMeta["format"].HasMember("size") && + (mfn.GetSize() == std::atoi(currentMeta["format"]["size"].AsString().c_str()))) { + doMediaUpload = false; + } + } + if (doMediaUpload) { + std::string dir = "music"; + for (auto &a : FPP_VIDEO_EXT) { + if (mfn.GetExt() == a) { + dir = "videos"; + } + } + uploadOrCopyFile(mediaBaseName, mediaFile, dir); + } + }); + + return cancelled; +} bool FPP::PrepareUploadSequence(FSEQFile *file, const std::string &seq, @@ -1086,46 +1075,17 @@ bool FPP::PrepareUploadSequence(FSEQFile *file, std::string mediaBaseName = ""; bool cancelled = false; if (media != "" && fppType == FPP_TYPE::FPP) { - wxFileName mfn(FromUTF8(media)); - std::string mediaFile = media; - mediaBaseName = ToUTF8(mfn.GetFullName()); - - if (majorVersion >= 6) { - FindHostSpecificMedia(hostName, mediaBaseName, mediaFile, mfn); - } - - bool doMediaUpload = true; - wxJSONValue currentMeta; - if (GetURLAsJSON("/api/media/" + URLEncode(mediaBaseName) + "/meta", currentMeta, false)) { - if (currentMeta.HasMember("format") && currentMeta["format"].HasMember("size") && - (mfn.GetSize() == std::atoi(currentMeta["format"]["size"].AsString().c_str()))) { - doMediaUpload = false; - } - } - if (doMediaUpload) { - std::string dir = "music"; - for (auto &a : FPP_VIDEO_EXT) { - if (mfn.GetExt() == a) { - dir = "videos"; - } - } - cancelled |= uploadOrCopyFile(mediaBaseName, mediaFile, dir); - } + cancelled = CheckUploadMedia(media, mediaBaseName); if (cancelled) { - return cancelled; + return true; } } sequences[baseName].sequence = baseName; sequences[baseName].media = mediaBaseName; sequences[baseName].duration = ((float)(file->getStepTime() * file->getNumFrames())) / 1000.0f; - std::string fileName; - if (IsDrive()) { - fileName = ipAddress + GetPathSeparator() + "sequences" + GetPathSeparator() + baseName; - } else { - tempFileName = ToStdString(wxFileName::CreateTempFileName(ToWXString(baseName))); - fileName = tempFileName; - } + tempFileName = ToStdString(wxFileName::CreateTempFileName(ToWXString(baseName))); + std::string fileName = tempFileName; FSEQFile::CompressionType ctype = ::FSEQFile::CompressionType::zstd; if (type == 3 || type == 4) { @@ -1139,7 +1099,7 @@ bool FPP::PrepareUploadSequence(FSEQFile *file, int currentChannelCount = 0; std::vector> currentRanges; std::vector> newRanges; - if (!IsDrive() && fppType == FPP_TYPE::FPP) { + if (fppType == FPP_TYPE::FPP) { wxJSONValue currentMeta; if (GetURLAsJSON("/api/sequence/" + URLEncode(baseName) + "/meta", currentMeta, false)) { doSeqUpload = false; @@ -1335,13 +1295,7 @@ static bool PlaylistContainsEntry(wxJSONValue &pl, const std::string &media, con bool FPP::UploadPlaylist(const std::string &name) { wxJSONValue origJson; - std::string fn; - if (IsDrive()) { - fn = (ipAddress + GetPathSeparator() + "playlists" +GetPathSeparator() + name + ".json"); - GetPathAsJSON(fn, origJson); - } else { - GetURLAsJSON("/api/playlist/" + URLEncode(name), origJson, false); - } + GetURLAsJSON("/api/playlist/" + URLEncode(name), origJson, false); for (const auto& info : sequences) { if (!PlaylistContainsEntry(origJson["mainPlaylist"], info.second.media, info.first)) { @@ -1367,55 +1321,34 @@ bool FPP::UploadPlaylist(const std::string &name) { origJson.Remove(wxString("playlistInfo")); origJson["name"] = name; - if (IsDrive()) { - WriteJSONToPath(fn, origJson); - } else { - PostJSONToURL("/api/playlist/" + URLEncode(name), origJson); - } + PostJSONToURL("/api/playlist/" + URLEncode(name), origJson); return false; } bool FPP::UploadModels(const wxJSONValue &models) { - if (IsDrive()) { - std::string fn = (ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "model-overlays.json"); - WriteJSONToPath(fn, models); - } else { - PostJSONToURL("/api/models", models); - } + PostJSONToURL("/api/models", models); return false; } bool FPP::UploadDisplayMap(const std::string &displayMap) { - if (IsDrive()) { - wxFileName fn = (ipAddress + wxFileName::GetPathSeparator() + "config/virtualdisplaymap"); - wxFile tf(fn.GetFullPath()); - tf.Write(displayMap); - tf.Close(); - } else { - PostToURL("/api/configfile/virtualdisplaymap", displayMap); - } + PostToURL("/api/configfile/virtualdisplaymap", displayMap); return false; } bool FPP::UploadUDPOut(const wxJSONValue &udp) { - if (IsDrive()) { - std::string fn = ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "co-universes.json"; - WriteJSONToPath(fn, udp); - } else { - wxJSONValue orig; - wxJSONValue newudp = udp; - - if (GetURLAsJSON("/api/channel/output/universeOutputs", orig)) { - if (orig.HasMember("channelOutputs")) { - for (int x = 0; x < orig["channelOutputs"].Size(); x++) { - if (orig["channelOutputs"][x]["type"].AsString() == "universes" && orig["channelOutputs"][x].HasMember("interface")) { - newudp["channelOutputs"][0]["interface"] = orig["channelOutputs"][x]["interface"].AsString(); - } + wxJSONValue orig; + wxJSONValue newudp = udp; + + if (GetURLAsJSON("/api/channel/output/universeOutputs", orig)) { + if (orig.HasMember("channelOutputs")) { + for (int x = 0; x < orig["channelOutputs"].Size(); x++) { + if (orig["channelOutputs"][x]["type"].AsString() == "universes" && orig["channelOutputs"][x].HasMember("interface")) { + newudp["channelOutputs"][0]["interface"] = orig["channelOutputs"][x]["interface"].AsString(); } } } - PostJSONToURL("/api/channel/output/universeOutputs", newudp); } + PostJSONToURL("/api/channel/output/universeOutputs", newudp); return false; } @@ -1622,7 +1555,7 @@ std::string FPP::CreateVirtualDisplayMap(ModelManager* allmodels) { modelPts.insert(std::make_tuple(x, y, z, ch)); } } - for (auto [x,y,z, ch] : modelPts) { + for (auto const&[x,y,z, ch] : modelPts) { ret += ToUTF8(wxString::Format("%d,%d,%d,%d,%d,%s\n", (int)std::round(x), (int)std::round(y), (int)std::round(z), ch, model->GetChanCountPerNode(), stringType.c_str())); @@ -1950,12 +1883,8 @@ wxJSONValue FPP::CreateUniverseFile(const std::list& selected, bool } bool FPP::SetRestartFlag() { - std::string val; - if (!IsDrive()) { - restartNeeded = true; - return PutToURL("/api/settings/restartFlag", "2", "text/plain"); - } - return false; + restartNeeded = true; + return PutToURL("/api/settings/restartFlag", "2", "text/plain"); } bool FPP::Restart( bool ifNeeded) { @@ -1972,7 +1901,7 @@ bool FPP::Restart( bool ifNeeded) { void FPP::UpdateChannelRanges() { // This probably should handle drives correctly but as is it doesnt bail for now until we add drive support - if (fppType != FPP_TYPE::FPP || IsDrive()) { + if (fppType != FPP_TYPE::FPP) { return; } wxJSONValue jval; @@ -2008,9 +1937,7 @@ void FPP::UpdateChannelRanges() } void FPP::SetDescription(const std::string &st) { - if (!IsDrive()) { - PutToURL("/api/settings/HostDescription", st, "text/plain"); - } + PutToURL("/api/settings/HostDescription", st, "text/plain"); } bool FPP::SetInputUniversesBridge(Controller* controller) { @@ -2028,12 +1955,7 @@ bool FPP::SetInputUniversesBridge(Controller* controller) { wxJSONValue udp = CreateUniverseFile(std::list({ controller }), true); if (udp["channelInputs"][0]["universes"].Size() != 0 || forceUpload) { - if (IsDrive()) { - std::string fn = (c->GetResolvedIP() +GetPathSeparator() + "config" +GetPathSeparator() + "ci-universes.json"); - WriteJSONToPath(fn, udp); - } else { - PostJSONToURL("/api/channel/output/universeInputs", udp); - } + PostJSONToURL("/api/channel/output/universeInputs", udp); } return false; @@ -2224,11 +2146,7 @@ bool FPP::UploadPanelOutputs(ModelManager* allmodels, startChannel--; } if (startChannel >= 0 || fullcontrol) { - if (IsDrive()) { - GetPathAsJSON(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "channeloutputs.json", origJson); - } else { - GetURLAsJSON("/api/channel/output/channelOutputsJSON", origJson, false); - } + GetURLAsJSON("/api/channel/output/channelOutputsJSON", origJson, false); } if (startChannel >= 0) { std::map rngs; @@ -2254,12 +2172,8 @@ bool FPP::UploadPanelOutputs(ModelManager* allmodels, } } if (changed) { - if (IsDrive()) { - WriteJSONToPath(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "channeloutputs.json", origJson); - } else { - PostJSONToURL("/api/channel/output/channelOutputsJSON", origJson); - SetRestartFlag(); - } + PostJSONToURL("/api/channel/output/channelOutputsJSON", origJson); + SetRestartFlag(); } return false; } @@ -2278,11 +2192,7 @@ bool FPP::UploadVirtualMatrixOutputs(ModelManager* allmodels, bool changed = false; wxJSONValue origJson; if (fullcontrol || (rules->SupportsVirtualMatrix() && cud.GetMaxVirtualMatrixPort())) { - if (IsDrive()) { - GetPathAsJSON(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "co-other.json", origJson); - } else { - GetURLAsJSON("/api/channel/output/co-other", origJson, false); - } + GetURLAsJSON("/api/channel/output/co-other", origJson, false); if (fullcontrol) { for (int x = 0; x < origJson["channelOutputs"].Size(); x++) { if (origJson["channelOutputs"][x]["type"].AsString() == "VirtualMatrix") { @@ -2387,12 +2297,8 @@ bool FPP::UploadVirtualMatrixOutputs(ModelManager* allmodels, } } if (changed) { - if (IsDrive()) { - WriteJSONToPath(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "co-other.json", origJson); - } else { - PostJSONToURL("/api/channel/output/co-other", origJson); - SetRestartFlag(); - } + PostJSONToURL("/api/channel/output/co-other", origJson); + SetRestartFlag(); } return false; @@ -2487,21 +2393,12 @@ bool FPP::UploadSerialOutputs(ModelManager* allmodels, wxJSONValue otherOrigRoot = otherData; bool changed = true; - if (IsDrive()) { - GetPathAsJSON(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "co-other.json", otherOrigRoot); + if (GetURLAsJSON("/api/configfile/co-other.json", otherOrigRoot, false)) { changed = mergeSerialInto(otherData, otherOrigRoot, false); - } else { - if (GetURLAsJSON("/api/configfile/co-other.json", otherOrigRoot, false)) { - changed = mergeSerialInto(otherData, otherOrigRoot, false); - } } if (changed) { - if (IsDrive()) { - WriteJSONToPath(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "co-other.json", otherOrigRoot); - } else { - PostJSONToURL("/api/configfile/co-other.json", otherOrigRoot); - SetRestartFlag(); - } + PostJSONToURL("/api/configfile/co-other.json", otherOrigRoot); + SetRestartFlag(); SetNewRanges(rngs); } } @@ -2547,11 +2444,7 @@ bool FPP::UploadPixelOutputs(ModelManager* allmodels, fnOrig.AssignTempFileName("pixelOutputs"); std::string file = fnOrig.GetFullPath().ToStdString(); wxJSONValue origJson; - if (IsDrive()) { - GetPathAsJSON(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + fppFileName +".json", origJson); - } else { - GetURLAsJSON("/api/channel/output/" + fppFileName, origJson, false); - } + GetURLAsJSON("/api/channel/output/" + fppFileName, origJson, false); logger_base.debug("Original JSON"); DumpJSON(origJson); @@ -2641,13 +2534,19 @@ bool FPP::UploadPixelOutputs(ModelManager* allmodels, port->CreateVirtualStrings(false); for (const auto& pvs : port->GetVirtualStrings()) { wxJSONValue vs; - vs["description"] = pvs->_description; - vs["startChannel"] = pvs->_startChannel - 1; // we need 0 based - vs["pixelCount"] = pvs->Channels() / pvs->_channelsPerPixel; + if (pvs->_isDummy) { + vs["description"] = wxString(""); + vs["startChannel"] = 0; + vs["pixelCount"] = 0; + } else { + vs["description"] = pvs->_description; + vs["startChannel"] = pvs->_startChannel - 1; // we need 0 based + vs["pixelCount"] = pvs->Channels() / pvs->_channelsPerPixel; - rngs[pvs->_startChannel - 1] = pvs->Channels(); + rngs[pvs->_startChannel - 1] = pvs->Channels(); + } - if (origStrings.find(vs["description"].AsString()) != origStrings.end()) { + if (!pvs->_isDummy && (origStrings.find(vs["description"].AsString()) != origStrings.end())) { wxJSONValue &vo = origStrings[vs["description"].AsString()]; vs["groupCount"] = vo["groupCount"]; vs["reverse"] = vo["reverse"]; @@ -2908,21 +2807,12 @@ bool FPP::UploadPixelOutputs(ModelManager* allmodels, } else { wxJSONValue otherOrigRoot = otherDmxData; bool changed = true; - if (IsDrive()) { - GetPathAsJSON(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "co-other.json", otherOrigRoot); + if (GetURLAsJSON("/api/configfile/co-other.json", otherOrigRoot, false)) { changed = mergeSerialInto(otherDmxData, otherOrigRoot, true); - } else { - if (GetURLAsJSON("/api/configfile/co-other.json", otherOrigRoot, false)) { - changed = mergeSerialInto(otherDmxData, otherOrigRoot, true); - } } if (changed) { - if (IsDrive()) { - WriteJSONToPath(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + "co-other.json", otherOrigRoot); - } else { - PostJSONToURL("/api/configfile/co-other.json", otherOrigRoot); - SetRestartFlag(); - } + PostJSONToURL("/api/configfile/co-other.json", otherOrigRoot); + SetRestartFlag(); } } @@ -2939,18 +2829,39 @@ bool FPP::UploadPixelOutputs(ModelManager* allmodels, writer.Write(root, ufile); ufile.Close(); - if (IsDrive()) { - WriteJSONToPath(ipAddress +GetPathSeparator() + "config" +GetPathSeparator() + fppFileName +".json", root); - } else { - PostJSONToURL("/api/channel/output/" + fppFileName, root); - SetRestartFlag(); - } + PostJSONToURL("/api/channel/output/" + fppFileName, root); + SetRestartFlag(); } else { logger_base.debug("Skipping JSON upload as it has not changed."); } SetNewRanges(rngs); return false; } + +bool FPP::UploadControllerProxies(OutputManager* outputManager) +{ + auto currentProxies = GetProxies(); + std::vector newProxies; + + for (const auto& it : outputManager->GetControllers()) { + auto c = dynamic_cast(it); + if (c != nullptr) { + std::string proxy_ip = ip_utils::ResolveIP(c->GetFPPProxy()); + if (ipAddress.compare(proxy_ip) == 0) { + auto controllerip = c->GetIP(); + if (std::find(currentProxies.begin(), currentProxies.end(), controllerip) == currentProxies.end()) { + newProxies.push_back(controllerip); + currentProxies.push_back(controllerip); + } + } + } + } + + for (const auto& nprox : newProxies) { + PostToURL("/api/proxies/" + nprox, "", "text/plain"); + } + return false; +} #endif #define FPP_CTRL_PORT 32320 @@ -2965,7 +2876,7 @@ static void setRangesToChannelCount(DiscoveredData *inst) { int min = 9999999; int max = 0; if (inst->ranges != "") { wxArrayString r1 = wxSplit(wxString(inst->ranges), ','); - for (auto a : r1) { + for (auto const& a : r1) { wxArrayString r = wxSplit(a, '-'); int start = wxAtoi(r[0]); int len = 4; //at least 4 @@ -3687,8 +3598,14 @@ static bool supportedForFPPConnect(DiscoveredData* res, OutputManager* outputMan return res->majorVersion >= 4 && res->mode == "remote"; } - if (res->typeId == 0x88 || res->typeId == 0x89) { - // F16V4 / F48V4 + if (res->typeId == 0x88 || res->typeId == 0x89 || + res->typeId == 0x90 || res->typeId == 0x91) { + // F16V4 / F48V4 / F16V5 / F48V5 + return res->mode != "bridge"; + } + + if (res->typeId >= 0xA0 && res->typeId <= 0xAF) { + // Genius return res->mode != "bridge"; } @@ -3787,10 +3704,13 @@ void FPP::MapToFPPInstances(Discovery &discovery, std::list &instances, Ou void FPP::TypeIDtoControllerType(int typeId, FPP* inst) { if (typeId < 0x80) { inst->fppType = FPP_TYPE::FPP; - } else if (typeId == 0x88 || typeId == 0x89) { - inst->fppType = FPP_TYPE::FALCONV4; + } else if (typeId == 0x88 || typeId == 0x89 || + typeId == 0x90 || typeId == 0x91) { + inst->fppType = FPP_TYPE::FALCONV4V5; } else if (typeId == 0xC2 || typeId == 0xC3) { inst->fppType = FPP_TYPE::ESPIXELSTICK; + } else if (typeId >= 0xA0 && typeId <= 0xAF) { + inst->fppType = FPP_TYPE::GENIUS; } } diff --git a/xLights/controllers/FPP.h b/xLights/controllers/FPP.h index 69d3a6ccea..83ac9c0bd9 100644 --- a/xLights/controllers/FPP.h +++ b/xLights/controllers/FPP.h @@ -19,8 +19,9 @@ class FPPUploadProgressDialog; class Discovery; enum class FPP_TYPE { FPP, - FALCONV4, - ESPIXELSTICK }; + FALCONV4V5, + ESPIXELSTICK, + GENIUS }; class FPP : public BaseController { @@ -77,13 +78,13 @@ class FPP : public BaseController bool IsDDPInputEnabled(); bool IsVersionAtLeast(uint32_t maj, uint32_t min, uint32_t patch = 0) const; - bool IsDrive(); #ifndef DISCOVERYONLY bool PrepareUploadSequence(FSEQFile *file, const std::string &seq, const std::string &media, int type); + bool CheckUploadMedia(const std::string &media, std::string &mediaBaseName); bool WillUploadSequence() const; bool NeedCustomSequence() const; bool AddFrameToUpload(uint32_t frame, uint8_t *data); @@ -114,6 +115,8 @@ class FPP : public BaseController Controller* controller); bool SetInputUniversesBridge(Controller* controller); + bool UploadControllerProxies(OutputManager* outputManager); + bool SetRestartFlag(); bool Restart(bool ifNeeded = false); void SetDescription(const std::string &st); @@ -148,15 +151,12 @@ class FPP : public BaseController private: FPPUploadProgressDialog *progressDialog = nullptr; wxGauge *progress = nullptr; - void DumpJSON(const wxJSONValue& json); - bool GetPathAsJSON(const std::string &path, wxJSONValue &val); bool GetURLAsJSON(const std::string& url, wxJSONValue& val, bool recordError = true); bool GetURLAsString(const std::string& url, std::string& val, bool recordError = true); - bool WriteJSONToPath(const std::string& path, const wxJSONValue& val); int PostJSONToURL(const std::string& url, const wxJSONValue& val); int PostJSONToURLAsFormData(const std::string& url, const std::string &extra, const wxJSONValue& val); int PostToURL(const std::string& url, const std::string &val, const std::string &contentType = "application/octet-stream"); @@ -174,9 +174,6 @@ class FPP : public BaseController bool uploadFileV7(const std::string &filename, const std::string &file, const std::string &dir); - bool copyFile(const std::string &filename, - const std::string &file, - const std::string &dir); bool callMoveFile(const std::string &filename); bool parseSysInfo(wxJSONValue& v); diff --git a/xLights/controllers/FPPConnectDialog.cpp b/xLights/controllers/FPPConnectDialog.cpp index 16f20f85bf..7a46b861e3 100644 --- a/xLights/controllers/FPPConnectDialog.cpp +++ b/xLights/controllers/FPPConnectDialog.cpp @@ -33,6 +33,7 @@ #include "../Parallel.h" #include "../Discovery.h" #include "Falcon.h" +#include "Experience.h" //(*IdInit(FPPConnectDialog) const long FPPConnectDialog::ID_SCROLLEDWINDOW1 = wxNewId(); @@ -75,6 +76,7 @@ static const std::string FSEQ_COL = "ID_FSEQTYPE_"; static const std::string MEDIA_COL = "ID_MEDIA_"; static const std::string MODELS_COL = "ID_MODELS_"; static const std::string UDP_COL = "ID_UDPOUT_"; +static const std::string PROXY_COL = "ID_PROXY_"; static const std::string PLAYLIST_COL = "ID_PLAYLIST_"; static const std::string UPLOAD_CONTROLLER_COL = "ID_CONTROLLER_"; @@ -96,12 +98,14 @@ FPPConnectDialog::FPPConnectDialog(wxWindow* parent, OutputManager* outputManage FlexGridSizer1->AddGrowableCol(0); FlexGridSizer1->AddGrowableRow(0); SplitterWindow1 = new wxSplitterWindow(this, ID_SPLITTERWINDOW1, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_3DSASH, _T("ID_SPLITTERWINDOW1")); - SplitterWindow1->SetMinimumPaneSize(100); + SplitterWindow1->SetMinSize(wxSize(100,100)); SplitterWindow1->SetSashGravity(0.5); FPPInstanceList = new wxScrolledWindow(SplitterWindow1, ID_SCROLLEDWINDOW1, wxDefaultPosition, wxDefaultSize, wxVSCROLL|wxHSCROLL, _T("ID_SCROLLEDWINDOW1")); FPPInstanceList->SetMinSize(wxDLG_UNIT(SplitterWindow1,wxSize(800,100))); - FPPInstanceSizer = new wxFlexGridSizer(0, 11, 0, 0); + FPPInstanceSizer = new wxFlexGridSizer(0, 12, 0, 0); FPPInstanceList->SetSizer(FPPInstanceSizer); + FPPInstanceSizer->Fit(FPPInstanceList); + FPPInstanceSizer->SetSizeHints(FPPInstanceList); Panel1 = new wxPanel(SplitterWindow1, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1")); FlexGridSizer2 = new wxFlexGridSizer(2, 1, 0, 0); FlexGridSizer2->AddGrowableCol(0); @@ -125,6 +129,8 @@ FPPConnectDialog::FPPConnectDialog(wxWindow* parent, OutputManager* outputManage CheckListBoxHolder->SetMinSize(wxSize(-1,100)); FlexGridSizer2->Add(CheckListBoxHolder, 1, wxALL|wxEXPAND, 0); Panel1->SetSizer(FlexGridSizer2); + FlexGridSizer2->Fit(Panel1); + FlexGridSizer2->SetSizeHints(Panel1); SplitterWindow1->SplitHorizontally(FPPInstanceList, Panel1); FlexGridSizer1->Add(SplitterWindow1, 1, wxALL|wxEXPAND, 5); FlexGridSizer4 = new wxFlexGridSizer(0, 4, 0, 0); @@ -140,7 +146,8 @@ FPPConnectDialog::FPPConnectDialog(wxWindow* parent, OutputManager* outputManage FlexGridSizer4->Add(cancelButton, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); FlexGridSizer1->Add(FlexGridSizer4, 1, wxALL|wxEXPAND, 5); SetSizer(FlexGridSizer1); - Fit(); + FlexGridSizer1->Fit(this); + FlexGridSizer1->SetSizeHints(this); Connect(ID_CHOICE_FILTER,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&FPPConnectDialog::OnChoiceFilterSelect); Connect(ID_CHOICE_FOLDER,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&FPPConnectDialog::OnChoiceFolderSelect); @@ -185,9 +192,6 @@ FPPConnectDialog::FPPConnectDialog(wxWindow* parent, OutputManager* outputManage instances = FPP::GetInstances(this, outputManager); - prgs.Pulse("Checking for mounted media drives"); - CreateDriveList(); - AddInstanceHeader("Upload", "Enable to Upload Files/Configs to this FPP Device."); wxPanel *p = AddInstanceHeader("Location", "Host and IP Address."); p->Connect(wxEVT_CONTEXT_MENU, (wxObjectEventFunction)& FPPConnectDialog::LocationPopupMenu, nullptr, this); @@ -199,6 +203,7 @@ FPPConnectDialog::FPPConnectDialog(wxWindow* parent, OutputManager* outputManage AddInstanceHeader("Media", "Enable to Upload MP3, MP4 and WAV Media Files."); AddInstanceHeader("Models", "Enable to Upload Models for Display Testing."); AddInstanceHeader("UDP Out", "'None'- Device is not going to send Pixel data across the network. \n \n 'All' This will send pixel data over your Show Network from FPP instance to all controllers marked as 'ACTIVE'. \n \n 'Proxied' will set UDP Out only for Controllers with a Proxy IP address set."); + AddInstanceHeader("Add Proxies", "Upload Proxy IP Adresses to FPP."); AddInstanceHeader("Playlist","Select Playlist to Add Uploaded Sequences Too."); AddInstanceHeader("Pixel Hat/Cape", "Display Hat or Hat Attached to FPP Device, If Found."); @@ -306,8 +311,8 @@ void FPPConnectDialog::PopulateFPPInstanceList(wxProgressDialog *prgs) { w->Destroy(); w = tmp; } - while (FPPInstanceSizer->GetItemCount () > 11) { - FPPInstanceSizer->Remove(11); + while (FPPInstanceSizer->GetItemCount () > 12) { + FPPInstanceSizer->Remove(12); } int row = 0; @@ -348,13 +353,13 @@ void FPPConnectDialog::PopulateFPPInstanceList(wxProgressDialog *prgs) { font.SetPointSize(font.GetPointSize() - 2); Choice1->SetFont(font); Choice1->Append(_("V1")); - Choice1->Append(_("V2")); + Choice1->Append(_("V2 zstd")); Choice1->Append(_("V2 Sparse/zstd")); Choice1->Append(_("V2 Sparse/Uncompressed")); Choice1->SetSelection(inst->mode == "master" ? 1 : 2); FPPInstanceSizer->Add(Choice1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0); } - } else if (inst->fppType == FPP_TYPE::FALCONV4) { + } else if (inst->fppType == FPP_TYPE::FALCONV4V5) { wxChoice* Choice1 = new wxChoice(FPPInstanceList, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, FSEQ_COL + rowStr); wxFont font = Choice1->GetFont(); font.SetPointSize(font.GetPointSize() - 2); @@ -366,9 +371,9 @@ void FPPConnectDialog::PopulateFPPInstanceList(wxProgressDialog *prgs) { Choice1->Append(_("V2 Uncompressed")); Choice1->SetSelection(2); FPPInstanceSizer->Add(Choice1, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0); - } else if (inst->fppType == FPP_TYPE::ESPIXELSTICK) { + } else if (inst->fppType == FPP_TYPE::ESPIXELSTICK || inst->fppType == FPP_TYPE::GENIUS) { label = new wxStaticText(FPPInstanceList, wxID_ANY, "V2 Sparse/Uncompressed", wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATIC_TEXT_FS_" + rowStr)); - FPPInstanceSizer->Add(label, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); + FPPInstanceSizer->Add(label, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); } else { label = new wxStaticText(FPPInstanceList, wxID_ANY, "V1", wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATIC_TEXT_FS_" + rowStr)); FPPInstanceSizer->Add(label, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); @@ -402,20 +407,21 @@ void FPPConnectDialog::PopulateFPPInstanceList(wxProgressDialog *prgs) { Choice1->Append(_("Proxied")); Choice1->SetSelection(0); FPPInstanceSizer->Add(Choice1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); + + wxCheckBox* CheckBoxProxy = new wxCheckBox(FPPInstanceList, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, PROXY_COL + rowStr); + FPPInstanceSizer->Add(CheckBoxProxy, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); //playlist combo box - if (!inst->IsDrive()) { - wxComboBox *ComboBox1 = new wxComboBox(FPPInstanceList, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER, wxDefaultValidator, PLAYLIST_COL + rowStr); - ComboBox1->Append(_("")); - for (const auto& pl : inst->playlists) { - ComboBox1->Append(pl); - } - wxFont font = ComboBox1->GetFont(); - font.SetPointSize(font.GetPointSize() - 2); - ComboBox1->SetFont(font); - FPPInstanceSizer->Add(ComboBox1, 1, wxALL|wxEXPAND, 0); + wxComboBox *ComboBox1 = new wxComboBox(FPPInstanceList, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER, wxDefaultValidator, PLAYLIST_COL + rowStr); + ComboBox1->Append(_("")); + for (const auto& pl : inst->playlists) { + ComboBox1->Append(pl); } - } else if (inst->fppType == FPP_TYPE::FALCONV4) { + font = ComboBox1->GetFont(); + font.SetPointSize(font.GetPointSize() - 2); + ComboBox1->SetFont(font); + FPPInstanceSizer->Add(ComboBox1, 1, wxALL|wxEXPAND, 0); + } else if (inst->fppType == FPP_TYPE::FALCONV4V5) { // this probably needs to be moved as this is not really a zlib thing but only the falcons end up here today so I am going to put it here for now wxCheckBox *CheckBox1 = new wxCheckBox(FPPInstanceList, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, MEDIA_COL + rowStr); CheckBox1->SetValue(inst->mode != "remote"); @@ -424,11 +430,13 @@ void FPPConnectDialog::PopulateFPPInstanceList(wxProgressDialog *prgs) { FPPInstanceSizer->Add(0, 0, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); FPPInstanceSizer->Add(0, 0, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); FPPInstanceSizer->Add(0, 0, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); + FPPInstanceSizer->Add(0, 0, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); } else { FPPInstanceSizer->Add(0,0,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); FPPInstanceSizer->Add(0,0,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); FPPInstanceSizer->Add(0,0,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); FPPInstanceSizer->Add(0,0,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); + FPPInstanceSizer->Add(0, 0, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); } auto c = _outputManager->GetControllers(inst->ipAddress); @@ -452,7 +460,7 @@ void FPPConnectDialog::PopulateFPPInstanceList(wxProgressDialog *prgs) { FPPInstanceSizer->Add(0,0,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 1); } - row++; + ++row; } ApplySavedHostSettings(); @@ -576,7 +584,7 @@ void FPPConnectDialog::LoadSequencesFromFolder(wxString dir) const case SP_XmlPullEvent::eStartTag: { SP_XmlStartTagEvent * stagEvent = (SP_XmlStartTagEvent*)event; wxString NodeName = wxString::FromAscii(stagEvent->getName()); - count++; + ++count; if (NodeName == "xsequence") { isSequence = true; } else if (NodeName == "mediaFile") { @@ -800,7 +808,7 @@ void FPPConnectDialog::OnButton_UploadClick(wxCommandEvent& event) for (row = 0; row < doUpload.size(); ++row) { std::string rowStr = std::to_string(row); doUpload[row] = GetCheckValue(CHECK_COL + rowStr); - uploadCount++; + ++uploadCount; } FPPUploadProgressDialog prgs(this); @@ -817,7 +825,7 @@ void FPPConnectDialog::OnButton_UploadClick(wxCommandEvent& event) } else { inst->setProgress(nullptr, nullptr); } - row++; + ++row; } if (uploadCount) { //prgs.SetSize(450, 400); @@ -865,6 +873,9 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector if (playlist != "") { cancelled |= inst->UploadPlaylist(playlist); } + if (GetCheckValue(PROXY_COL + rowStr)) { + cancelled |= inst->UploadControllerProxies(_outputManager); + } if (GetChoiceValueIndex(UDP_COL + rowStr) == 1) { cancelled |= inst->UploadUDPOut(outputs); //add the UDP ranges into the list of ranges @@ -877,14 +888,15 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector inst->SetRestartFlag(); } if (GetCheckValue(UPLOAD_CONTROLLER_COL + rowStr)) { - auto vendor = FPP::GetVendor(inst->pixelControllerType); - auto model = FPP::GetModel(inst->pixelControllerType); + //auto vendor = FPP::GetVendor(inst->pixelControllerType); + //auto model = FPP::GetModel(inst->pixelControllerType); //auto caps = ControllerCaps::GetControllerConfig(vendor, model, ""); auto c = _outputManager->GetControllers(inst->ipAddress); if (c.size() == 1) { cancelled |= inst->UploadPanelOutputs(&frame->AllModels, _outputManager, c.front()); cancelled |= inst->UploadVirtualMatrixOutputs(&frame->AllModels, _outputManager, c.front()); cancelled |= inst->UploadPixelOutputs(&frame->AllModels, _outputManager, c.front()); + cancelled |= inst->UploadSerialOutputs(&frame->AllModels, _outputManager, c.front()); } } if (GetChoiceValueIndex(MODELS_COL + rowStr) == 1) { @@ -909,7 +921,7 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector delete bc; } } - row++; + ++row; } row = 0; for (const auto& inst : instances) { @@ -917,7 +929,7 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector // update the channel ranges now that the config has been uploaded an fppd restarted inst->UpdateChannelRanges(); } - row++; + ++row; } row = 0; wxTreeListItem item = CheckListBox_Sequences->GetFirstItem(); @@ -948,19 +960,26 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector int fseqType = 0; if (inst->fppType == FPP_TYPE::FPP) { fseqType = GetChoiceValueIndex(FSEQ_COL + rowStr); - } else if (inst->fppType == FPP_TYPE::FALCONV4) { + } else if (inst->fppType == FPP_TYPE::FALCONV4V5) { fseqType = GetChoiceValueIndex(FSEQ_COL + rowStr); // need to adjust so they are unique if (fseqType == 1) fseqType = 5; if (fseqType == 2) fseqType = 6; - } - else { + } else { fseqType = 3; } cancelled |= inst->PrepareUploadSequence(seq, fseq, m2, fseqType); - + } + row++; + } + while (CurlManager::INSTANCE.processCurls()) { + wxYield(); + } + row = 0; + for (const auto& inst : instances) { + if (!cancelled && doUpload[row]) { if (inst->WillUploadSequence()) { uploadCount++; if (inst->NeedCustomSequence()) { @@ -1032,7 +1051,7 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector if (!cancelled && doUpload[row]) { cancelled |= inst->FinalizeUploadSequence(); - if (inst->fppType == FPP_TYPE::FALCONV4) { + if (inst->fppType == FPP_TYPE::FALCONV4V5) { // a falcon std::string proxy = ""; auto c = _outputManager->GetControllers(inst->ipAddress); @@ -1061,6 +1080,26 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector cancelled = true; } inst->ClearTempFile(); + } else if (inst->fppType == FPP_TYPE::GENIUS) { + // a Genius + std::string proxy; + auto c = _outputManager->GetControllers(inst->ipAddress); + if (c.size() == 1) { + proxy = c.front()->GetFPPProxy(); + } + Experience genius(inst->ipAddress, proxy); + if (genius.IsConnected()) { + std::function updateProg = [&prgs, inst](int val, std::string msg) { + prgs->setActionLabel(msg); + inst->updateProgress(val, true); + return true; + }; + cancelled |= !genius.UploadSequence(inst->GetTempFile(), fseq, updateProg); + } else { + logger_base.debug("Upload failed as Genius is not connected."); + cancelled = true; + } + inst->ClearTempFile(); } } row++; @@ -1105,125 +1144,21 @@ void FPPConnectDialog::doUpload(FPPUploadProgressDialog *prgs, std::vector } row++; } + xLightsFrame* xlframe = static_cast(GetParent()); if (messages != "") { + xlframe->SetStatusText("FPP Connect Upload had errors or warnings", 0); wxMessageBox(messages, "Problems Uploading", wxOK | wxCENTRE, this); - } - prgs->EndModal(cancelled ? 1 : 0); -} - -void FPPConnectDialog::CreateDriveList() -{ - wxArrayString drives; -#ifdef __WXMSW__ - static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); - wxArrayString ud = wxFSVolume::GetVolumes(wxFS_VOL_REMOVABLE | wxFS_VOL_MOUNTED, 0); - for (const auto &a : ud) { - if (wxDir::Exists(a + "\\sequences")) { - drives.push_back(a); - logger_base.info("FPP Connect found drive %s with a \\sequences folder.", (const char*)a.c_str()); - } - } -#elif defined(__WXOSX__) - wxDir d; - d.Open("/Volumes"); - wxString dir; - bool fcont = d.GetFirst(&dir, wxEmptyString, wxDIR_DIRS); - while (fcont) { - if ((dir[0] != '.') - && (dir != "Recovery") - && (dir != "Macintosh HD") - && wxDir::Exists("/Volumes/" + dir + "/sequences")) { //raw USB drive mounted - - drives.push_back("/Volumes/" + dir + "/"); - } - fcont = d.GetNext(&dir); - } -#else - bool done = false; - wxDir d; - d.Open("/media"); - wxString dir; - bool fcont = d.GetFirst(&dir, wxEmptyString, wxDIR_DIRS); - while (fcont) { - wxDir d2; - d2.Open("/media/" + dir); - wxString dir2; - bool fcont2 = d2.GetFirst(&dir2, wxEmptyString, wxDIR_DIRS); - while (fcont2) { - if (dir2 == "sequences") { - drives.push_back("/media/" + dir + "/" + dir2); - } else if (wxDir::Exists("/media/" + dir + "/" + dir2 + "/sequences")) { - drives.push_back("/media/" + dir + "/" + dir2); - } - fcont2 = d2.GetNext(&dir2); - } - fcont = d.GetNext(&dir); - } -#endif - - for (const auto& a : drives) { - FPP *inst = new FPP(); - inst->hostName = "FPP"; - inst->ipAddress = ToUTF8(a); - inst->minorVersion = 0; - inst->majorVersion = 2; - inst->fullVersion = "Unknown"; - inst->mode = "standalone"; - if (FileExists(a + "/fpp-info.json")) { - //read version and hostname - wxJSONValue system; - wxJSONReader reader; - wxString str; - wxString drive = a; - if (!ObtainAccessToURL(ToUTF8(drive))) { - wxDirDialog dlg(this, "Select FPP Directory", drive, - wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST); - if (dlg.ShowModal() == wxID_OK) { - drive = dlg.GetPath(); - } - if (!ObtainAccessToURL(ToUTF8(drive))) { - continue; - } - } - wxFile file(drive + "/fpp-info.json"); - if (!file.IsOpened()) { - //could not open the file, likely not readable/writable - continue; - } - - file.ReadAll(&str); - reader.Parse(str, &system); - - if (!system["hostname"].IsNull()) { - inst->hostName = ToUTF8(system["hostname"].AsString()); - } - if (!system["type"].IsNull()) { - inst->platform = ToUTF8(system["type"].AsString()); - } - if (!system["model"].IsNull()) { - inst->model = ToUTF8(system["model"].AsString()); - } - if (!system["version"].IsNull()) { - inst->fullVersion = ToUTF8(system["version"].AsString()); - } - if (system["minorVersion"].IsInt()) { - inst->minorVersion = system["minorVersion"].AsInt(); - } - if (system["majorVersion"].IsInt()) { - inst->majorVersion = system["majorVersion"].AsInt(); - } - if (!system["channelRanges"].IsNull()) { - inst->ranges = ToUTF8(system["channelRanges"].AsString()); - } - if (!system["HostDescription"].IsNull()) { - inst->description = ToUTF8(system["HostDescription"].AsString()); - } - if (!system["fppModeString"].IsNull()) { - inst->mode = ToUTF8(system["fppModeString"].AsString()); - } + logger_base.warn("FPP Connect Upload had errors or warnings:\n" + messages); + prgs->EndModal(2); + } else { + if (cancelled) { + xlframe->SetStatusText("FPP Connect Upload Cancelled", 0); + prgs->EndModal(1); + } else { + xlframe->SetStatusText("FPP Connect Upload Complete", 0); + prgs->EndModal(0); } - instances.push_back(inst); - } + }; } bool FPPConnectDialog::GetCheckValue(const std::string &col) { @@ -1319,6 +1254,7 @@ void FPPConnectDialog::SaveSettings(bool onlyInsts) config->Write("FPPConnectUploadModels_" + keyPostfx, GetChoiceValueIndex(MODELS_COL + rowStr)); config->Write("FPPConnectUploadUDPOut_" + keyPostfx, GetChoiceValueIndex(UDP_COL + rowStr)); config->Write("FPPConnectUploadPixelOut_" + keyPostfx, GetCheckValue(UPLOAD_CONTROLLER_COL + rowStr)); + config->Write("FPPConnectUploadProxy_" + keyPostfx, GetCheckValue(PROXY_COL + rowStr)); row++; } config->Flush(); @@ -1368,6 +1304,9 @@ void FPPConnectDialog::ApplySavedHostSettings() if (config->Read("FPPConnectUploadPixelOut_" + keyPostfx, &bval)) { SetCheckValue(UPLOAD_CONTROLLER_COL + rowStr, bval); } + if (config->Read("FPPConnectUploadProxy_" + keyPostfx, &bval)) { + SetCheckValue(PROXY_COL + rowStr, bval); + } row++; } } diff --git a/xLights/controllers/FPPConnectDialog.h b/xLights/controllers/FPPConnectDialog.h index c0c77d6edb..5fcb397ef1 100644 --- a/xLights/controllers/FPPConnectDialog.h +++ b/xLights/controllers/FPPConnectDialog.h @@ -89,7 +89,6 @@ class FPPConnectDialog: public wxDialog void OnLocationPopupClick(wxCommandEvent &evt); //*) - void CreateDriveList(); void LoadSequencesFromFolder(wxString dir) const; void LoadSequences(); void PopulateFPPInstanceList(wxProgressDialog *prgs = nullptr); diff --git a/xLights/controllers/Falcon.cpp b/xLights/controllers/Falcon.cpp index d527a071ab..917e7777f3 100644 --- a/xLights/controllers/Falcon.cpp +++ b/xLights/controllers/Falcon.cpp @@ -957,7 +957,17 @@ void Falcon::V4_MakeStringsValid(Controller* controller, UDController& cud, std: } } -bool Falcon::V4_PopulateStrings(std::vector& uploadStrings, const std::vector& falconStrings, UDController& cud, ControllerCaps* caps, int defaultBrightness, std::string& error, bool oneBased, uint32_t controllerFirstChannel) +int Falcon::V4_GetBrightness(int port, int sr, int defaultBrightness, const std::vector& falconStrings) +{ + for (const auto& it : falconStrings) + { + if (it.port == port && it.smartRemote == sr) + return it.brightness; + } + return defaultBrightness; +} + +bool Falcon::V4_PopulateStrings(std::vector& uploadStrings, const std::vector& falconStrings, UDController& cud, ControllerCaps* caps, int defaultBrightness, std::string& error, bool oneBased, uint32_t controllerFirstChannel, bool fullcontrol) { bool success = true; @@ -1091,12 +1101,12 @@ bool Falcon::V4_PopulateStrings(std::vector& uploadStrings, co str.name = SafeDescription(it->_description); str.blank = false; str.gamma = V4_ValidGamma(it->_gammaSet ? it->_gamma * 10 : gamma); - str.brightness = V4_ValidBrightness(it->_brightnessSet ? it->_brightness : defaultBrightness); + str.brightness = V4_ValidBrightness(it->_brightnessSet ? it->_brightness : (fullcontrol ? defaultBrightness : V4_GetBrightness(p, sr, defaultBrightness, falconStrings))); str.zigcount = 0; str.endNulls = it->_endNullPixelsSet ? it->_endNullPixels : 0; str.startNulls = it->_startNullPixelsSet ? it->_startNullPixels : 0; str.colourOrder = it->_colourOrderSet ? V4_EncodeColourOrder(it->_colourOrder) : colourOrder; - str.direction = it->_reverseSet ? (it->_reverse == "F" ? 0 : 1) : direction; + str.direction = it->_reverseSet ? (it->_reverse == "Forward" ? 0 : 1) : direction; str.group = it->_groupCountSet ? it->_groupCount : group; str.zigcount = it->_zigZagSet ? it->_zigZag : 0; // dont carry between props str.pixels = INTROUNDUPDIV(it->Channels(), GetChannelsPerPixel(it->_protocol)) * str.group; @@ -1123,7 +1133,7 @@ bool Falcon::V4_PopulateStrings(std::vector& uploadStrings, co str.name = wxString::Format("Port %d", p + 1); str.blank = false; str.gamma = 10; - str.brightness = defaultBrightness; + str.brightness = fullcontrol ? defaultBrightness : V4_GetBrightness(p, 0, defaultBrightness, falconStrings); str.zigcount = 0; str.endNulls = 0; str.startNulls = 0; @@ -1156,7 +1166,7 @@ bool Falcon::V4_PopulateStrings(std::vector& uploadStrings, co str.name = wxString::Format("Port %d", p + 1); str.blank = false; str.gamma = 10; - str.brightness = defaultBrightness; + str.brightness = fullcontrol ? defaultBrightness : V4_GetBrightness(p, sr, defaultBrightness, falconStrings); str.zigcount = 0; str.endNulls = 0; str.startNulls = 0; @@ -1180,7 +1190,7 @@ bool Falcon::V4_PopulateStrings(std::vector& uploadStrings, co str.name = wxString::Format("Port %d", p + 1); str.blank = false; str.gamma = 10; - str.brightness = defaultBrightness; + str.brightness = fullcontrol ? defaultBrightness : V4_GetBrightness(p, sr, defaultBrightness, falconStrings); str.zigcount = 0; str.endNulls = 0; str.startNulls = 0; @@ -1340,7 +1350,7 @@ bool Falcon::V4_SetOutputs(ModelManager* allmodels, OutputManager* outputManager std::vector uploadStrings; std::string error; - if (!V4_PopulateStrings(uploadStrings, falconStrings, cud, caps, defaultBrightness, error, oneBased, controller->GetStartChannel())) { + if (!V4_PopulateStrings(uploadStrings, falconStrings, cud, caps, defaultBrightness, error, oneBased, controller->GetStartChannel(), fullcontrol)) { DisplayError("Falcon Outputs Upload: Problem constructing strings for upload:\n" + error, parent); if (doProgress) progress->Update(100, "Aborting."); return false; diff --git a/xLights/controllers/Falcon.h b/xLights/controllers/Falcon.h index be10a39910..f9bede2eb2 100644 --- a/xLights/controllers/Falcon.h +++ b/xLights/controllers/Falcon.h @@ -101,7 +101,8 @@ class Falcon : public BaseController bool V4_ValidateWAV(const std::string& media); #ifndef DISCOVERYONLY - bool V4_PopulateStrings(std::vector& uploadStrings, const std::vector& falconStrings, UDController& cud, ControllerCaps* caps, int defaultBrightness, std::string& error, bool oneBased, uint32_t firstControllerChannel); + int V4_GetBrightness(int port, int sr, int defaultBrightness, const std::vector& falconStrings); + bool V4_PopulateStrings(std::vector& uploadStrings, const std::vector& falconStrings, UDController& cud, ControllerCaps* caps, int defaultBrightness, std::string& error, bool oneBased, uint32_t firstControllerChannel, bool fullcontrol); void V4_MakeStringsValid(Controller* controlle, UDController& cud, std::vector& falconStrings, int addressingMode); #endif diff --git a/xLights/controllers/HinksPix.cpp b/xLights/controllers/HinksPix.cpp index dd738f35e2..c601eb0112 100644 --- a/xLights/controllers/HinksPix.cpp +++ b/xLights/controllers/HinksPix.cpp @@ -26,6 +26,13 @@ #include +static size_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) { + + if (data == nullptr) return 0; + data->append((char*)ptr, size * nmemb); + return size * nmemb; +} + #pragma region HinksPixOutput void HinksPixOutput::Dump() const { static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); diff --git a/xLights/controllers/HinksPixExportDialog.cpp b/xLights/controllers/HinksPixExportDialog.cpp index f776af1ff8..a4460a9422 100644 --- a/xLights/controllers/HinksPixExportDialog.cpp +++ b/xLights/controllers/HinksPixExportDialog.cpp @@ -196,6 +196,8 @@ HinksPixExportDialog::HinksPixExportDialog(wxWindow* parent, OutputManager* outp HinkControllerList->SetMinSize(wxDLG_UNIT(SplitterWindow1,wxSize(-1,150))); HinkControllerSizer = new wxFlexGridSizer(0, 8, 0, 0); HinkControllerList->SetSizer(HinkControllerSizer); + HinkControllerSizer->Fit(HinkControllerList); + HinkControllerSizer->SetSizeHints(HinkControllerList); Panel1 = new wxPanel(SplitterWindow1, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1")); FlexGridSizer2 = new wxFlexGridSizer(2, 2, 0, 0); FlexGridSizer2->AddGrowableCol(1); @@ -218,10 +220,12 @@ HinksPixExportDialog::HinksPixExportDialog(wxWindow* parent, OutputManager* outp BoxSizer2->Add(BitmapButtonMoveUp, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE, 5); BitmapButtonMoveDown = new wxBitmapButton(Panel1, ID_BITMAPBUTTON_MOVE_DOWN, wxArtProvider::GetBitmapBundle("wxART_GO_DOWN", wxART_BUTTON), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW, wxDefaultValidator, _T("ID_BITMAPBUTTON_MOVE_DOWN")); BoxSizer2->Add(BitmapButtonMoveDown, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE, 5); - FlexGridSizer2->Add(BoxSizer2, 1, wxALL|wxALIGN_CENTER_VERTICAL, 0); + FlexGridSizer2->Add(BoxSizer2, 1, wxALL|wxEXPAND, 0); CheckListBox_Sequences = new wxListView(Panel1, ID_LISTVIEW_Sequences, wxDefaultPosition, wxDefaultSize, wxLC_REPORT, wxDefaultValidator, _T("ID_LISTVIEW_Sequences")); FlexGridSizer2->Add(CheckListBox_Sequences, 1, wxEXPAND, 0); Panel1->SetSizer(FlexGridSizer2); + FlexGridSizer2->Fit(Panel1); + FlexGridSizer2->SetSizeHints(Panel1); SplitterWindow1->SplitHorizontally(HinkControllerList, Panel1); FlexGridSizer1->Add(SplitterWindow1, 1, wxALL|wxEXPAND, 5); BoxSizer1 = new wxBoxSizer(wxHORIZONTAL); @@ -231,22 +235,18 @@ HinksPixExportDialog::HinksPixExportDialog(wxWindow* parent, OutputManager* outp BoxSizer1->Add(StaticText5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); SpinCtrlStartHour = new wxSpinCtrl(this, ID_SPINCTRL_START_HOUR, _T("0"), wxDefaultPosition, wxDefaultSize, 0, 0, 23, 0, _T("ID_SPINCTRL_START_HOUR")); SpinCtrlStartHour->SetValue(_T("0")); - SpinCtrlStartHour->SetMinSize(wxSize(50,-1)); - BoxSizer1->Add(SpinCtrlStartHour, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); - SpinCtrlStartMin = new wxSpinCtrl(this, ID_SPINCTRL_START_MIN, _T("0"), wxDefaultPosition, wxDefaultSize, 0, 0, 59, 0, _T("ID_SPINCTRL_START_MIN")); + BoxSizer1->Add(SpinCtrlStartHour, 0, wxALL|wxEXPAND, 5); + SpinCtrlStartMin = new wxSpinCtrl(this, ID_SPINCTRL_START_MIN, _T("0"), wxDefaultPosition, wxSize(66,37), 0, 0, 59, 0, _T("ID_SPINCTRL_START_MIN")); SpinCtrlStartMin->SetValue(_T("0")); - SpinCtrlStartMin->SetMinSize(wxSize(50,-1)); - BoxSizer1->Add(SpinCtrlStartMin, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BoxSizer1->Add(SpinCtrlStartMin, 0, wxALL|wxEXPAND, 5); StaticText6 = new wxStaticText(this, ID_STATICTEXT6, _("End Time:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT6")); BoxSizer1->Add(StaticText6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); SpinCtrlEndHour = new wxSpinCtrl(this, ID_SPINCTRL_END_HOUR, _T("23"), wxDefaultPosition, wxDefaultSize, 0, 0, 23, 23, _T("ID_SPINCTRL_END_HOUR")); SpinCtrlEndHour->SetValue(_T("23")); - SpinCtrlEndHour->SetMinSize(wxSize(50,-1)); - BoxSizer1->Add(SpinCtrlEndHour, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BoxSizer1->Add(SpinCtrlEndHour, 0, wxALL|wxEXPAND, 5); SpinCtrlEndMin = new wxSpinCtrl(this, ID_SPINCTRL_END_MIN, _T("59"), wxDefaultPosition, wxDefaultSize, 0, 0, 59, 59, _T("ID_SPINCTRL_END_MIN")); SpinCtrlEndMin->SetValue(_T("59")); - SpinCtrlEndMin->SetMinSize(wxSize(50,-1)); - BoxSizer1->Add(SpinCtrlEndMin, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BoxSizer1->Add(SpinCtrlEndMin, 0, wxALL|wxEXPAND, 5); BoxSizer1->Add(-1,-1,0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); Button_Export = new wxButton(this, ID_BUTTON_EXPORT, _("Export to SD Card"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON_EXPORT")); BoxSizer1->Add(Button_Export, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); @@ -254,10 +254,9 @@ HinksPixExportDialog::HinksPixExportDialog(wxWindow* parent, OutputManager* outp BoxSizer1->Add(cancelButton, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); FlexGridSizer1->Add(BoxSizer1, 1, wxALL|wxEXPAND, 5); SetSizer(FlexGridSizer1); + FlexGridSizer1->Fit(this); FlexGridSizer1->SetSizeHints(this); - Connect(ID_CHOICE_FILTER,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&HinksPixExportDialog::OnChoiceFilterSelect); - Connect(ID_CHOICE_FOLDER,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&HinksPixExportDialog::OnChoiceFolderSelect); Connect(ID_BITMAPBUTTON_MOVE_UP,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HinksPixExportDialog::OnBitmapButtonMoveUpClick); Connect(ID_BITMAPBUTTON_MOVE_DOWN,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HinksPixExportDialog::OnBitmapButtonMoveDownClick); Connect(ID_LISTVIEW_Sequences,wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,(wxObjectEventFunction)&HinksPixExportDialog::SequenceListPopup); @@ -734,14 +733,6 @@ void HinksPixExportDialog::SequenceListPopup(wxListEvent& /*event*/) { PopupMenu(&mnu); } -void HinksPixExportDialog::OnChoiceFolderSelect(wxCommandEvent& /*event*/) { - LoadSequences(); -} - -void HinksPixExportDialog::OnChoiceFilterSelect(wxCommandEvent& /*event*/) { - LoadSequences(); -} - void HinksPixExportDialog::GetFolderList(const wxString& folder) { ChoiceFolder->Append("--Show Folder--"); wxArrayString subfolders; @@ -833,7 +824,7 @@ void HinksPixExportDialog::OnButton_ExportClick(wxCommandEvent& /*event*/) { } wxString drive = GetChoiceValue(DISK_COL + rowStr); - + //try to fix path wxFileName dirname( drive, "" ); drive = dirname.GetPath(); @@ -939,6 +930,7 @@ void HinksPixExportDialog::OnBitmapButtonMoveUpClick(wxCommandEvent& /*event*/) } void HinksPixExportDialog::OnChoiceSelected(wxCommandEvent& event) { + wxString const text = event.GetString(); if (text.IsEmpty()) { return; @@ -948,6 +940,11 @@ void HinksPixExportDialog::OnChoiceSelected(wxCommandEvent& event) { if (item) { wxChoice* cb = dynamic_cast(item); if (cb) { + if (cb == ChoiceFilter || cb == ChoiceFolder) { + LoadSequences(); + return; + } + auto name = cb->GetName(); if (name.Contains(SLAVE1_COL) || name.Contains(SLAVE2_COL)) { int row = 0; @@ -1013,7 +1010,7 @@ void HinksPixExportDialog::createPlayList(std::vectorIsOk()) { + } else if (!discovery->IsOk()) { logger_base.error("Error initialising PixLite/PixCon datagram ... is network connected? OK : FALSE"); delete discovery; - } - else if (discovery->Error()) { + } else if (discovery->Error()) { logger_base.error("Error creating PixLite/PixCon socket => %d : %s.", discovery->LastError(), (const char*)DecodeIPError(discovery->LastError()).c_str()); delete discovery; - } - else { + } else { discovery->SetTimeout(1); discovery->Notify(false); wxIPV4address remoteAddr; - remoteAddr.Hostname(_ip); + remoteAddr.Hostname(ip); remoteAddr.Service(PIXLITE_PORT); uint8_t discoveryData[12]; Pixlite16::CreateDiscovery(discoveryData); - logger_base.debug("Sending discovery to pixlite: %s:%d.", (const char*)_ip.c_str(), PIXLITE_PORT); + logger_base.debug("Sending discovery to pixlite: %s:%d.", (const char*)ip.c_str(), PIXLITE_PORT); discovery->SendTo(remoteAddr, discoveryData, sizeof(discoveryData)); if (discovery->Error()) { - logger_base.error("PixLite/PixCon error sending to %s => %d : %s.", (const char*)_ip.c_str(), discovery->LastError(), (const char*)DecodeIPError(discovery->LastError()).c_str()); - } - else { + logger_base.error("PixLite/PixCon error sending to %s => %d : %s.", (const char*)ip.c_str(), discovery->LastError(), (const char*)DecodeIPError(discovery->LastError()).c_str()); + } else { uint32_t count = 0; - #define SLP_TIME 100 +#define SLP_TIME 100 while (count < 5000 && !discovery->IsData()) { wxMilliSleep(SLP_TIME); count += SLP_TIME; } - + if (!discovery->IsData()) { logger_base.warn("No discovery responses."); } @@ -1007,57 +1008,65 @@ bool Pixlite16::GetConfig() discovery->RecvFrom(pixliteAddr, data, sizeof(data)); if (!discovery->Error() && data[10] == 0x02) { - logger_base.debug(" Discover response from %s.", (const char *)pixliteAddr.IPAddress().c_str()); - bool connected = false; - _config._protocolVersion = data[11]; - logger_base.debug(" Protocol version %d.", _config._protocolVersion); - switch (_config._protocolVersion) { - case 4: - connected = ParseV4Config(data, _config); - if (!connected) { - logger_base.error(" Failed to parse v4 config packet."); + logger_base.debug(" Discover response from %s.", (const char*)pixliteAddr.IPAddress().c_str()); + + if (desiredip == pixliteAddr.IPAddress()) { + logger_base.debug(" This is the one we wanted to see."); + + bool connected = false; + _config._protocolVersion = data[11]; + logger_base.debug(" Protocol version %d.", _config._protocolVersion); + switch (_config._protocolVersion) { + case 4: + connected = ParseV4Config(data, _config); + if (!connected) { + logger_base.error(" Failed to parse v4 config packet."); + } + break; + case 5: + connected = ParseV5Config(data, _config); + if (!connected) { + logger_base.error(" Failed to parse v5 config packet."); + } + break; + case 6: + connected = ParseV6Config(data, _config); + if (!connected) { + logger_base.error(" Failed to parse v6 config packet."); + } + break; + case 8: + connected = ParseV8Config(data, _config); + if (!connected) { + logger_base.error(" Failed to parse v8 config packet."); + } + break; + default: + logger_base.error("Unsupported Pixlite protocol version: %d.", _config._protocolVersion); + wxASSERT(false); + break; } - break; - case 5: - connected = ParseV5Config(data, _config); - if (!connected) { - logger_base.error(" Failed to parse v5 config packet."); - } - break; - case 6: - connected = ParseV6Config(data, _config); - if (!connected) { - logger_base.error(" Failed to parse v6 config packet."); - } - break; - case 8: - connected = ParseV8Config(data, _config); - if (!connected) { - logger_base.error(" Failed to parse v8 config packet."); - } - break; - default: - logger_base.error("Unsupported Pixlite protocol version: %d.", _config._protocolVersion); - wxASSERT(false); - break; - } - - if (connected) { - wxString rcvIP = wxString::Format("%i.%i.%i.%i", _config._currentIP[0], _config._currentIP[1], _config._currentIP[2], _config._currentIP[3]); - logger_base.debug("Found PixLite/PixCon controller on %s.", (const char*)rcvIP.c_str()); - logger_base.debug(" Model %s %.1f.", (const char*)_config._modelName.c_str(), (float)_config._hwRevision / 10.0); - logger_base.debug(" Firmware %s.", (const char*)_config._firmwareVersion.c_str()); - logger_base.debug(" Nickname %s.", (const char*)_config._nickname.c_str()); - logger_base.debug(" Brand %d.", _config._brand); - res = true; - break; + if (connected) { + wxString rcvIP = wxString::Format("%i.%i.%i.%i", _config._currentIP[0], _config._currentIP[1], _config._currentIP[2], _config._currentIP[3]); + + logger_base.debug("Found PixLite/PixCon controller on %s.", (const char*)rcvIP.c_str()); + logger_base.debug(" Model %s %.1f.", (const char*)_config._modelName.c_str(), (float)_config._hwRevision / 10.0); + logger_base.debug(" Firmware %s.", (const char*)_config._firmwareVersion.c_str()); + logger_base.debug(" Nickname %s.", (const char*)_config._nickname.c_str()); + logger_base.debug(" Brand %d.", _config._brand); + res = true; + break; + } else { + logger_base.error("Unable to download PixLite/PixCon controller configuration from %s.", (const char*)ip.c_str()); + } } - else { - logger_base.error("Unable to download PixLite/PixCon controller configuration from %s.", (const char*)_ip.c_str()); + if (!discovery->Error() && data[10] == 0x01) { + // ignore this ... this is the discovery we sent + } else { + logger_base.debug(" Not the controller we wanted to see."); } - } - else if (discovery->Error()) { + } else if (discovery->Error()) { logger_base.error("Error reading PixLite/PixCon response => %d : %s.", discovery->LastError(), (const char*)DecodeIPError(discovery->LastError()).c_str()); } } @@ -1069,6 +1078,36 @@ bool Pixlite16::GetConfig() return res; } +bool Pixlite16::GetConfig() +{ + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + + bool res = false; + wxIPV4address localAddr; + + if (_ip != "") { + localAddr.AnyAddress(); + res = GetConfig(localAddr, _ip, _ip); + } + + // if we had no luck broadcast to all adapters and see if we can find it + if (!res) + { + logger_base.warn("Trying broadcast to each adapter to see if we can find"); + + for (const auto& lip : GetLocalIPs()) + { + if (!res) { + logger_base.warn(" Trying %s.", (const char*)lip.c_str()); + localAddr.Hostname(lip); + res = GetConfig(localAddr, "255.255.255.255", _ip); + } + } + } + + return res; +} + // we populate what we can in the Config structure so we can be consistent with earlier versions bool Pixlite16::GetMK3Config() { diff --git a/xLights/controllers/Pixlite16.h b/xLights/controllers/Pixlite16.h index d468336c50..17954b1061 100644 --- a/xLights/controllers/Pixlite16.h +++ b/xLights/controllers/Pixlite16.h @@ -123,6 +123,7 @@ class Pixlite16 : public BaseController static void CreateDiscovery(uint8_t* buffer); bool GetConfig(); + bool GetConfig(wxIPV4address localAddr, std::string ip, const std::string& desiredip); bool SendConfig(bool logresult = false) const; bool SendMk3Config(bool logresult = false) const; diff --git a/xLights/controllers/SanDevices.h b/xLights/controllers/SanDevices.h index 2349eec584..9318001b81 100644 --- a/xLights/controllers/SanDevices.h +++ b/xLights/controllers/SanDevices.h @@ -190,5 +190,6 @@ class SanDevices : public BaseController virtual bool SetOutputs(ModelManager* allmodels, OutputManager* outputManager, Controller* controller, wxWindow* parent) override; #endif virtual bool UsesHTTP() const override { return true; } + virtual bool needsHTTP_0_9() const override { return true; } #pragma endregion }; diff --git a/xLights/controllers/WLED.cpp b/xLights/controllers/WLED.cpp index 103ebcb767..139ebbac8e 100644 --- a/xLights/controllers/WLED.cpp +++ b/xLights/controllers/WLED.cpp @@ -228,6 +228,13 @@ void WLED::UpdatePixelOutputs(bool& worked, int totalPixelCount, wxJSONValue& js jsonVal["hw"]["led"]["ins"] = newLEDS; } +static size_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) { + + if (data == nullptr) return 0; + data->append((char*)ptr, size * nmemb); + return size * nmemb; +} + bool WLED::PostJSON(wxJSONValue const& jsonVal) { wxString str; wxJSONWriter writer(wxJSONWRITER_NONE, 0, 3); diff --git a/xLights/effects/AdjustEffect.cpp b/xLights/effects/AdjustEffect.cpp new file mode 100644 index 0000000000..e6a6fd48e9 --- /dev/null +++ b/xLights/effects/AdjustEffect.cpp @@ -0,0 +1,176 @@ +/*************************************************************** + * This source files comes from the xLights project + * https://www.xlights.org + * https://github.com/smeighan/xLights + * See the github commit history for a record of contributing + * developers. + * Copyright claimed based on commit dates recorded in Github + * License: https://github.com/smeighan/xLights/blob/master/License.txt + **************************************************************/ + +#include "AdjustEffect.h" +#include "AdjustPanel.h" +#include "../sequencer/Effect.h" +#include "../RenderBuffer.h" +#include "../UtilClasses.h" +#include "../models/Model.h" +#include "../models/ModelGroup.h" +#include "../xLightsApp.h" +#include "../xLightsMain.h" +#include "../TimingPanel.h" + +#include "../../include/adjust16.xpm" +#include "../../include/adjust24.xpm" +#include "../../include/adjust32.xpm" +#include "../../include/adjust48.xpm" +#include "../../include/adjust64.xpm" +#include "UtilFunctions.h" + +AdjustEffect::AdjustEffect(int id) : + RenderableEffect(id, "Adjust", adjust16_xpm, adjust24_xpm, adjust32_xpm, adjust48_xpm, adjust64_xpm) +{ + //ctor +} + +AdjustEffect::~AdjustEffect() +{ + //dtor +} + +xlEffectPanel *AdjustEffect::CreatePanel(wxWindow *parent) { + return new AdjustPanel(parent); +} + +std::list AdjustEffect::CheckEffectSettings(const SettingsMap& settings, AudioManager* media, Model* model, Effect* eff, bool renderCache) +{ + std::list res; + + if (settings.Get("T_CHECKBOX_Canvas", "0") == "0") { + res.push_back(wxString::Format(" WARN: Canvas mode not enabled on a Adjust effect. Without canvas mode Adjust is unlikely to do anything useful. Effect: Adjust, Model: %s, Start %s", model->GetFullName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); + } + + return res; +} + +void AdjustEffect::SetDefaultParameters() { + AdjustPanel *ap = (AdjustPanel*)panel; + if (ap == nullptr) { + return; + } + + SetChoiceValue(ap->Choice_Action, "None"); + SetSpinValue(ap->SpinCtrl_Value1, 0); + SetSpinValue(ap->SpinCtrl_Value2, 0); + SetSpinValue(ap->SpinCtrl_NthChannel, 1); + SetSpinValue(ap->SpinCtrl_StartingAt, 1); + + // Turn on canvas mode as this really only makes sense in canvas mode + xLightsFrame* frame = xLightsApp::GetFrame(); + TimingPanel* layerBlendingPanel = frame->GetLayerBlendingPanel(); + layerBlendingPanel->CheckBox_Canvas->SetValue(true); +} + +void AdjustEffect::AdjustChannels(bool singleColour, int numChannels, RenderBuffer& buffer, const std::string& action, int value1, int value2, int nth, int starting, int count) +{ + int channels = std::min(numChannels, buffer.BufferWi * buffer.BufferHt * (singleColour ? 1 : 3)); + int done = 0; + + for (int i = starting - 1; (count == 0 || done < count) && i < channels; i = i + nth) { + ++done; + int value = 0; + xlColor c = xlBLACK; + + // get the channel value + if (singleColour) { + c = buffer.GetPixel(i % buffer.BufferWi, i / buffer.BufferWi); + value = c.red; + } else { + c = buffer.GetPixel((i / 3) % buffer.BufferWi, (i / 3) / buffer.BufferWi); + if (i % 3 == 0) + value = c.red; + else if (i % 3 == 1) + value = c.green; + else + value = c.blue; + } + c.alpha = 255; + + // adjust it + if (action == "None") { + // do nothing + } else if (action == "Adjust By Value") { + value += value1; + } else if (action == "Adjust By Percentage") { + value += (value * value1) / 100; + } else if (action == "Set Minimum") { + value = std::max(value1, value); + } else if (action == "Set Maximum") { + value = std::min(value1, value); + } else if (action == "Set Range") { + if (value1 > value2) + std::swap(value1, value2); + value = std::min(value2, std::max(value1, value)); + } else if (action == "Shift With Wrap By Value") { + value += value1; + if (value < 0) + value += 256; + else if (value > 255) + value -= 256; + } else if (action == "Shift With Wrap By Percentage") { + } else if (action == "Prevent Range") { + if (value1 > value2) + std::swap(value1, value2); + if (value >= value1 && value <= value2) { + // within restricted range ... move it to the closest value + if (value - value1 < value2 - value) + value = value1; + else + value = value2; + } + } else if (action == "Reverse") { + value = 255 - value; + } + + // force it in range + value = std::min(255, std::max(0, value)); + + // write the channel value + if (singleColour) { + c.red = value; + c.green = value; + c.blue = value; + buffer.SetPixel(i % buffer.BufferWi, i / buffer.BufferWi, c, false, true, true); + } else { + if (i % 3 == 0) + c.red = value; + else if (i % 3 == 1) + c.green = value; + else + c.blue = value; + buffer.SetPixel((i / 3) % buffer.BufferWi, (i / 3) / buffer.BufferWi, c); + } + } +} + +void AdjustEffect::Render(Effect* effect, const SettingsMap& SettingsMap, RenderBuffer& buffer) +{ + int num_channels = 0; + std::string string_type = ""; + + Model* model_info = buffer.GetModel(); + if (model_info == nullptr) + num_channels = buffer.BufferWi * buffer.BufferHt * 3; + else { + num_channels = model_info->GetNumChannels(); + string_type = model_info->GetStringType(); + } + + auto action = SettingsMap.Get("CHOICE_Action", "None"); + auto value1 = SettingsMap.GetInt("SPINCTRL_Value1", 0); + auto value2 = SettingsMap.GetInt("SPINCTRL_Value2", 0); + auto nth = SettingsMap.GetInt("SPINCTRL_NthChannel", 1); + auto starting = SettingsMap.GetInt("SPINCTRL_StartingAt", 1); + auto count = SettingsMap.GetInt("SPINCTRL_Count", 0); + + AdjustChannels(StartsWith(string_type, "Single Color"), num_channels, buffer, action, value1, value2, nth, starting, count); +} diff --git a/xLights/effects/AdjustEffect.h b/xLights/effects/AdjustEffect.h new file mode 100644 index 0000000000..221da613ad --- /dev/null +++ b/xLights/effects/AdjustEffect.h @@ -0,0 +1,37 @@ +#pragma once + +/*************************************************************** + * This source files comes from the xLights project + * https://www.xlights.org + * https://github.com/smeighan/xLights + * See the github commit history for a record of contributing + * developers. + * Copyright claimed based on commit dates recorded in Github + * License: https://github.com/smeighan/xLights/blob/master/License.txt + **************************************************************/ + +#include "RenderableEffect.h" +#include "../UtilFunctions.h" + +class AdjustEffect : public RenderableEffect +{ +public: + AdjustEffect(int id); + virtual ~AdjustEffect(); + virtual bool CanBeRandom() override + { + return false; + } + virtual void Render(Effect* effect, const SettingsMap& settings, RenderBuffer& buffer) override; + virtual void SetDefaultParameters() override; + virtual bool CanRenderPartialTimeInterval() const override + { + return true; + } + virtual std::list CheckEffectSettings(const SettingsMap& settings, AudioManager* media, Model* model, Effect* eff, bool renderCache) override; + +protected: + virtual xlEffectPanel* CreatePanel(wxWindow* parent) override; + void AdjustChannels(bool singleColour, int numChannels, RenderBuffer& buffer, const std::string& action, int value1, int value2, int nth, int starting, int count); +}; + diff --git a/xLights/effects/AdjustPanel.cpp b/xLights/effects/AdjustPanel.cpp new file mode 100644 index 0000000000..87bcad1f1c --- /dev/null +++ b/xLights/effects/AdjustPanel.cpp @@ -0,0 +1,176 @@ +/*************************************************************** + * This source files comes from the xLights project + * https://www.xlights.org + * https://github.com/smeighan/xLights + * See the github commit history for a record of contributing + * developers. + * Copyright claimed based on commit dates recorded in Github + * License: https://github.com/smeighan/xLights/blob/master/License.txt + **************************************************************/ + + //(*InternalHeaders(AdjustPanel) + #include + #include + #include + #include + #include + #include + //*) + +#include + +#include "AdjustPanel.h" +#include "AdjustEffect.h" +#include "EffectPanelUtils.h" +#include "../UtilFunctions.h" + +//(*IdInit(AdjustPanel) +const long AdjustPanel::ID_STATICTEXT1 = wxNewId(); +const long AdjustPanel::ID_CHOICE_Action = wxNewId(); +const long AdjustPanel::ID_STATICTEXT2 = wxNewId(); +const long AdjustPanel::ID_SPINCTRL_Value1 = wxNewId(); +const long AdjustPanel::ID_STATICTEXT3 = wxNewId(); +const long AdjustPanel::ID_SPINCTRL_Value2 = wxNewId(); +const long AdjustPanel::ID_STATICTEXT4 = wxNewId(); +const long AdjustPanel::ID_SPINCTRL_NthChannel = wxNewId(); +const long AdjustPanel::ID_STATICTEXT5 = wxNewId(); +const long AdjustPanel::ID_SPINCTRL_StartingAt = wxNewId(); +const long AdjustPanel::ID_STATICTEXT6 = wxNewId(); +const long AdjustPanel::ID_SPINCTRL_Count = wxNewId(); +//*) + +BEGIN_EVENT_TABLE(AdjustPanel,wxPanel) + //(*EventTable(AdjustPanel) + //*) +END_EVENT_TABLE() + +AdjustPanel::AdjustPanel(wxWindow* parent) : xlEffectPanel(parent) +{ + //(*Initialize(AdjustPanel) + Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("wxID_ANY")); + FlexGridSizer_Main = new wxFlexGridSizer(0, 2, 0, 0); + FlexGridSizer_Main->AddGrowableCol(1); + StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("Adjustment:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1")); + FlexGridSizer_Main->Add(StaticText1, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + Choice_Action = new BulkEditChoice(this, ID_CHOICE_Action, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE_Action")); + FlexGridSizer_Main->Add(Choice_Action, 1, wxALL|wxEXPAND, 5); + StaticText_Value1 = new wxStaticText(this, ID_STATICTEXT2, _("Value 1:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2")); + FlexGridSizer_Main->Add(StaticText_Value1, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + SpinCtrl_Value1 = new BulkEditSpinCtrl(this, ID_SPINCTRL_Value1, _T("0"), wxDefaultPosition, wxDefaultSize, 0, -255, 255, 0, _T("ID_SPINCTRL_Value1")); + SpinCtrl_Value1->SetValue(_T("0")); + FlexGridSizer_Main->Add(SpinCtrl_Value1, 1, wxALL|wxEXPAND, 5); + StaticText_Value2 = new wxStaticText(this, ID_STATICTEXT3, _("Value 2:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT3")); + FlexGridSizer_Main->Add(StaticText_Value2, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + SpinCtrl_Value2 = new BulkEditSpinCtrl(this, ID_SPINCTRL_Value2, _T("0"), wxDefaultPosition, wxDefaultSize, 0, -255, 255, 0, _T("ID_SPINCTRL_Value2")); + SpinCtrl_Value2->SetValue(_T("0")); + FlexGridSizer_Main->Add(SpinCtrl_Value2, 1, wxALL|wxEXPAND, 5); + StaticText2 = new wxStaticText(this, ID_STATICTEXT4, _("Nth Channel:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT4")); + FlexGridSizer_Main->Add(StaticText2, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + SpinCtrl_NthChannel = new BulkEditSpinCtrl(this, ID_SPINCTRL_NthChannel, _T("1"), wxDefaultPosition, wxDefaultSize, 0, 1, 32, 1, _T("ID_SPINCTRL_NthChannel")); + SpinCtrl_NthChannel->SetValue(_T("1")); + FlexGridSizer_Main->Add(SpinCtrl_NthChannel, 1, wxALL|wxEXPAND, 5); + StaticText3 = new wxStaticText(this, ID_STATICTEXT5, _("Starting At:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT5")); + FlexGridSizer_Main->Add(StaticText3, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + SpinCtrl_StartingAt = new BulkEditSpinCtrl(this, ID_SPINCTRL_StartingAt, _T("1"), wxDefaultPosition, wxDefaultSize, 0, 1, 100, 1, _T("ID_SPINCTRL_StartingAt")); + SpinCtrl_StartingAt->SetValue(_T("1")); + FlexGridSizer_Main->Add(SpinCtrl_StartingAt, 1, wxALL|wxEXPAND, 5); + StaticText4 = new wxStaticText(this, ID_STATICTEXT6, _("Count:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT6")); + FlexGridSizer_Main->Add(StaticText4, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + SpinCtrl_Count = new BulkEditSpinCtrl(this, ID_SPINCTRL_Count, _T("0"), wxDefaultPosition, wxDefaultSize, 0, 0, 10000, 0, _T("ID_SPINCTRL_Count")); + SpinCtrl_Count->SetValue(_T("0")); + FlexGridSizer_Main->Add(SpinCtrl_Count, 1, wxALL|wxEXPAND, 5); + SetSizer(FlexGridSizer_Main); + FlexGridSizer_Main->Fit(this); + FlexGridSizer_Main->SetSizeHints(this); + + Connect(ID_CHOICE_Action,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&AdjustPanel::OnChoice_ActionSelect); + //*) + SetName("ID_PANEL_ADJUST"); + + Connect(wxID_ANY, EVT_VC_CHANGED, (wxObjectEventFunction)&AdjustPanel::OnVCChanged, 0, this); + Connect(wxID_ANY, EVT_VALIDATEWINDOW, (wxObjectEventFunction)&AdjustPanel::OnValidateWindow, 0, this); + + Choice_Action->Append("None"); + Choice_Action->Append("Adjust By Value"); + Choice_Action->Append("Adjust By Percentage"); + Choice_Action->Append("Set Minimum"); + Choice_Action->Append("Set Maximum"); + Choice_Action->Append("Set Range"); + Choice_Action->Append("Shift With Wrap By Value"); + Choice_Action->Append("Prevent Range"); + Choice_Action->Append("Reverse"); + + ValidateWindow(); +} + +AdjustPanel::~AdjustPanel() +{ + //(*Destroy(AdjustPanel) + //*) +} + +void AdjustPanel::ValidateWindow() +{ + auto action = Choice_Action->GetStringSelection(); + + if (action == "None") { + StaticText_Value1->SetLabel("Unused:"); + SpinCtrl_Value1->Disable(); + StaticText_Value2->SetLabel("Unused:"); + SpinCtrl_Value2->Disable(); + } else if (action == "Adjust By Value") { + StaticText_Value1->SetLabel("Adjust by:"); + SpinCtrl_Value1->SetRange(-255, 255); + SpinCtrl_Value1->Enable(); + StaticText_Value2->SetLabel("Unused:"); + SpinCtrl_Value2->Disable(); + } else if (action == "Adjust By Percentage") { + StaticText_Value1->SetLabel("Adjust by:"); + SpinCtrl_Value1->SetRange(-100, 25500); + SpinCtrl_Value1->Enable(); + StaticText_Value2->SetLabel("Unused:"); + SpinCtrl_Value2->Disable(); + } else if (action == "Set Minimum") { + StaticText_Value1->SetLabel("Minimum:"); + SpinCtrl_Value1->SetRange(0, 255); + SpinCtrl_Value1->Enable(); + StaticText_Value2->SetLabel("Unused:"); + SpinCtrl_Value2->Disable(); + } else if (action == "Set Maximum") { + StaticText_Value1->SetLabel("Maximum:"); + SpinCtrl_Value1->SetRange(0, 255); + SpinCtrl_Value1->Enable(); + StaticText_Value2->SetLabel("Unused:"); + SpinCtrl_Value2->Disable(); + } else if (action == "Set Range") { + StaticText_Value1->SetLabel("Minimum:"); + SpinCtrl_Value1->SetRange(0, 255); + SpinCtrl_Value1->Enable(); + StaticText_Value2->SetLabel("Maximum:"); + SpinCtrl_Value2->SetRange(0, 255); + SpinCtrl_Value2->Enable(); + } else if (action == "Shift With Wrap By Value") { + StaticText_Value1->SetLabel("Shift by:"); + SpinCtrl_Value1->SetRange(-255, 255); + SpinCtrl_Value1->Enable(); + StaticText_Value2->SetLabel("Unused:"); + SpinCtrl_Value2->Disable(); + } else if (action == "Prevent Range") { + StaticText_Value1->SetLabel("Minimum:"); + SpinCtrl_Value1->SetRange(0, 255); + SpinCtrl_Value1->Enable(); + StaticText_Value2->SetLabel("Maximum:"); + SpinCtrl_Value2->SetRange(0, 255); + SpinCtrl_Value2->Enable(); + } else if (action == "Reverse") { + StaticText_Value1->SetLabel("Unused:"); + SpinCtrl_Value1->Disable(); + StaticText_Value2->SetLabel("Unused:"); + SpinCtrl_Value2->Disable(); + } +} + +void AdjustPanel::OnChoice_ActionSelect(wxCommandEvent& event) +{ + ValidateWindow(); +} diff --git a/xLights/effects/AdjustPanel.h b/xLights/effects/AdjustPanel.h new file mode 100644 index 0000000000..1d3aa1f4f8 --- /dev/null +++ b/xLights/effects/AdjustPanel.h @@ -0,0 +1,83 @@ +#pragma once + +/*************************************************************** + * This source files comes from the xLights project + * https://www.xlights.org + * https://github.com/smeighan/xLights + * See the github commit history for a record of contributing + * developers. + * Copyright claimed based on commit dates recorded in Github + * License: https://github.com/smeighan/xLights/blob/master/License.txt + **************************************************************/ + + //(*Headers(AdjustPanel) + #include + class wxChoice; + class wxFlexGridSizer; + class wxSpinCtrl; + class wxSpinEvent; + class wxStaticText; + //*) + +#include "../BulkEditControls.h" +#include "EffectPanelUtils.h" + +class Model; + +class AdjustPanel: public xlEffectPanel +{ + std::list GetActiveModels(); + + public: + + AdjustPanel(wxWindow* parent); + virtual ~AdjustPanel(); + virtual void ValidateWindow() override; + + //(*Declarations(AdjustPanel) + BulkEditChoice* Choice_Action; + BulkEditSpinCtrl* SpinCtrl_Count; + BulkEditSpinCtrl* SpinCtrl_NthChannel; + BulkEditSpinCtrl* SpinCtrl_StartingAt; + BulkEditSpinCtrl* SpinCtrl_Value1; + BulkEditSpinCtrl* SpinCtrl_Value2; + wxFlexGridSizer* FlexGridSizer_Main; + wxStaticText* StaticText1; + wxStaticText* StaticText2; + wxStaticText* StaticText3; + wxStaticText* StaticText4; + wxStaticText* StaticText_Value1; + wxStaticText* StaticText_Value2; + //*) + + protected: + + //(*Identifiers(AdjustPanel) + static const long ID_STATICTEXT1; + static const long ID_CHOICE_Action; + static const long ID_STATICTEXT2; + static const long ID_SPINCTRL_Value1; + static const long ID_STATICTEXT3; + static const long ID_SPINCTRL_Value2; + static const long ID_STATICTEXT4; + static const long ID_SPINCTRL_NthChannel; + static const long ID_STATICTEXT5; + static const long ID_SPINCTRL_StartingAt; + static const long ID_STATICTEXT6; + static const long ID_SPINCTRL_Count; + //*) + + public: + + //(*Handlers(AdjustPanel) + void OnButtonRemapClick(wxCommandEvent& event); + void OnButton_SaveAsStateClick(wxCommandEvent& event); + void OnButton_Load_StateClick(wxCommandEvent& event); + void OnChoice_ActionSelect(wxCommandEvent& event); + //*) + + void OnButtonRemapRClick(wxCommandEvent& event); + void OnChoicePopup(wxCommandEvent& event); + + DECLARE_EVENT_TABLE() +}; diff --git a/xLights/effects/EffectManager.cpp b/xLights/effects/EffectManager.cpp index fba8c6fd23..25506414d7 100644 --- a/xLights/effects/EffectManager.cpp +++ b/xLights/effects/EffectManager.cpp @@ -11,6 +11,7 @@ #include "EffectManager.h" #include "OffEffect.h" #include "OnEffect.h" +#include "AdjustEffect.h" #include "BarsEffect.h" #include "ButterflyEffect.h" #include "CandleEffect.h" @@ -81,6 +82,7 @@ EffectManager::EffectManager() { add(createEffect(eff_OFF)); add(createEffect(eff_ON)); + add(createEffect(eff_ADJUST)); add(createEffect(eff_BARS)); add(createEffect(eff_BUTTERFLY)); add(createEffect(eff_CANDLE)); @@ -153,7 +155,10 @@ RenderableEffect *EffectManager::createEffect(RGB_EFFECTS_e eff) { switch (eff) { case eff_OFF: return new OffEffect(eff_OFF); case eff_ON: return new OnEffect(eff_ON); - case eff_BARS: return new BarsEffect(eff_BARS); + case eff_ADJUST: + return new AdjustEffect(eff_ADJUST); + case eff_BARS: + return new BarsEffect(eff_BARS); case eff_BUTTERFLY: return new ButterflyEffect(eff_BUTTERFLY); case eff_CANDLE: return new CandleEffect(eff_CANDLE); case eff_CIRCLES: return new CirclesEffect(eff_CIRCLES); diff --git a/xLights/effects/EffectManager.h b/xLights/effects/EffectManager.h index 60c449f8d5..d1c76d4823 100644 --- a/xLights/effects/EffectManager.h +++ b/xLights/effects/EffectManager.h @@ -23,6 +23,7 @@ class EffectManager enum RGB_EFFECTS_e { eff_OFF, eff_ON, + eff_ADJUST, eff_BARS, eff_BUTTERFLY, eff_CANDLE, diff --git a/xLights/effects/FacesEffect.cpp b/xLights/effects/FacesEffect.cpp index 866b162f1c..da7d1da0bc 100644 --- a/xLights/effects/FacesEffect.cpp +++ b/xLights/effects/FacesEffect.cpp @@ -38,8 +38,8 @@ class FacesRenderCache : public EffectRenderCache { int nextBlinkTime; std::map nodeNameCache; - FacesRenderCache() : - blinkEndTime(0), nextBlinkTime(intRand(0, 5000)) { + FacesRenderCache(int nextBlinkTime) : + blinkEndTime(0), nextBlinkTime(nextBlinkTime) { } virtual ~FacesRenderCache() { for (auto it : _imageCache) { @@ -112,6 +112,10 @@ wxString FacesEffect::GetEffectString() { ret << p->Choice_Faces_Eyes->GetStringSelection().ToStdString(); ret << ","; + ret << "E_CHOICE_Faces_EyeBlinkFrequency="; + ret << p->Choice_Faces_EyeBlinkFrequency->GetStringSelection().ToStdString(); + ret << ","; + ret << "E_CHOICE_Faces_FaceDefinition="; ret << p->Face_FaceDefinitonChoice->GetStringSelection().ToStdString(); ret << ","; @@ -235,6 +239,20 @@ std::list FacesEffect::CheckEffectSettings(const SettingsMap& setti return res; } +int FacesEffect::GetMaxEyeDelay( std::string& eyeBlinkFreqString ) const { + int maxEyeDelay = 5500; //Normal + if( eyeBlinkFreqString == "Slowest") + maxEyeDelay = 9000; + else if( eyeBlinkFreqString == "Slow") + maxEyeDelay = 7250; + else if( eyeBlinkFreqString == "Fast") + maxEyeDelay = 3750; + else if( eyeBlinkFreqString == "Fastest") + maxEyeDelay = 2000; + + return maxEyeDelay; +} + void FacesEffect::SetPanelStatus(Model* cls) { FacesPanel* fp = (FacesPanel*)panel; if (fp == nullptr) @@ -353,6 +371,7 @@ void FacesEffect::SetDefaultParameters() { SetRadioValue(fp->RadioButton1); SetChoiceValue(fp->Choice_Faces_Phoneme, "AI"); SetChoiceValue(fp->Choice_Faces_Eyes, "Auto"); + SetChoiceValue(fp->Choice_Faces_EyeBlinkFrequency, "Normal"); SetChoiceValue(fp->Choice1, ""); if (fp->Face_FaceDefinitonChoice->GetCount() > 0) { @@ -453,6 +472,7 @@ void FacesEffect::Render(Effect* effect, const SettingsMap& SettingsMap, RenderB RenderCoroFacesFromPGO(buffer, SettingsMap["CHOICE_Faces_Phoneme"], SettingsMap.Get("CHOICE_Faces_Eyes", "Auto"), + SettingsMap.Get("CHOICE_Faces_EyeBlinkFrequency", "Normal"), SettingsMap.GetBool("CHECKBOX_Faces_Outline"), alpha, SettingsMap.GetBool("CHECKBOX_Faces_SuppressShimmer", false)); } else { @@ -462,6 +482,7 @@ void FacesEffect::Render(Effect* effect, const SettingsMap& SettingsMap, RenderB SettingsMap["CHOICE_Faces_Phoneme"], SettingsMap["CHOICE_Faces_TimingTrack"], SettingsMap["CHOICE_Faces_Eyes"], + SettingsMap["CHOICE_Faces_EyeBlinkFrequency"], SettingsMap.GetBool("CHECKBOX_Faces_Outline"), SettingsMap.GetBool("CHECKBOX_Faces_TransparentBlack", false), SettingsMap.GetInt("TEXTCTRL_Faces_TransparentBlack", 0), @@ -475,7 +496,7 @@ void FacesEffect::Render(Effect* effect, const SettingsMap& SettingsMap, RenderB //} } -void FacesEffect::RenderFaces(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, bool outline, uint8_t alpha, bool suppressShimmer) { +void FacesEffect::RenderFaces(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, const std::string& eyeBlinkFreq, bool outline, uint8_t alpha, bool suppressShimmer) { if (alpha == 0) return; // 0 alpha means there is nothing to do @@ -507,7 +528,7 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, const std::string& Phoneme, int Wt = buffer.BufferWi; // this draws eyes as well - drawoutline(buffer, PhonemeInt, outline, eyes, buffer.BufferHt, buffer.BufferWi); + drawoutline(buffer, PhonemeInt, outline, eyes, eyeBlinkFreq, buffer.BufferHt, buffer.BufferWi); mouth(buffer, PhonemeInt, Ht, Wt, shimmer); // draw a mouth syllable } @@ -672,12 +693,14 @@ void FacesEffect::facesCircle(RenderBuffer& buffer, int Phoneme, int xc, int yc, } } -void FacesEffect::drawoutline(RenderBuffer& buffer, int Phoneme, bool outline, const std::string& eyes, int BufferHt, int BufferWi) { +void FacesEffect::drawoutline(RenderBuffer& buffer, int Phoneme, bool outline, const std::string& eyes, const std::string& eyeBlinkFreqIn, int BufferHt, int BufferWi) { std::string eye = eyes; + std::string eyeBlinkFreq = eyeBlinkFreqIn; FacesRenderCache* cache = (FacesRenderCache*)buffer.infoCache[id]; if (cache == nullptr) { - cache = new FacesRenderCache(); + int maxEyeDelay = GetMaxEyeDelay(eyeBlinkFreq); + cache = new FacesRenderCache(intRand(0, maxEyeDelay)); buffer.infoCache[id] = cache; } @@ -695,8 +718,9 @@ void FacesEffect::drawoutline(RenderBuffer& buffer, int Phoneme, bool outline, c if (eye == "Auto") { if (Phoneme == 9 || Phoneme == 10) { if ((buffer.curPeriod * buffer.frameTimeInMs) >= cache->nextBlinkTime) { - //roughly every 5 seconds we'll blink - cache->nextBlinkTime += intRand(4500, 5500); + //calculate the blink time taking into account user selection + int maxEyeDelay = GetMaxEyeDelay(eyeBlinkFreq); + cache->nextBlinkTime += intRand(maxEyeDelay-1000, maxEyeDelay); cache->blinkEndTime = buffer.curPeriod * buffer.frameTimeInMs + 101; //100ms blink eye = "Closed"; } else if ((buffer.curPeriod * buffer.frameTimeInMs) < cache->blinkEndTime) { @@ -811,7 +835,7 @@ static bool parse_model(const wxString& want_model) // Outline_x_y = list of persistent/sticky elements (stays on after frame ends) // Eyes_x_y = list of random elements (intended for eye blinks, etc) -void FacesEffect::RenderCoroFacesFromPGO(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, bool face_outline, uint8_t alpha, bool suppressShimmer) +void FacesEffect::RenderCoroFacesFromPGO(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, const std::string& eyeBlinkFreq, bool face_outline, uint8_t alpha, bool suppressShimmer) { if (alpha == 0) return; @@ -827,7 +851,7 @@ void FacesEffect::RenderCoroFacesFromPGO(RenderBuffer& buffer, const std::string if (auto_phonemes.find((const char*)Phoneme.c_str()) != auto_phonemes.end()) { - RenderFaces(buffer, auto_phonemes[(const char*)Phoneme.c_str()], eyes, face_outline, alpha, suppressShimmer); + RenderFaces(buffer, auto_phonemes[(const char*)Phoneme.c_str()], eyes, eyeBlinkFreq, face_outline, alpha, suppressShimmer); return; } @@ -890,14 +914,19 @@ std::string FacesEffect::MakeKey(int bufferWi, int bufferHt, std::string dirstr, void FacesEffect::RenderFaces(RenderBuffer& buffer, SequenceElements* elements, const std::string& faceDef, const std::string& Phoneme, const std::string& trackName, - const std::string& eyesIn, bool face_outline, bool transparentBlack, int transparentBlackLevel, uint8_t alpha, const std::string& outlineState, bool suppressShimmer) + const std::string& eyesIn, const std::string& eyeBlinkFreqIn, bool face_outline, bool transparentBlack, int transparentBlackLevel, uint8_t alpha, const std::string& outlineState, bool suppressShimmer) { if (alpha == 0) return; // if alpha is zero dont bother. + std::string eyes = eyesIn; + std::string eyeBlinkFreq = eyeBlinkFreqIn; + FacesRenderCache* cache = (FacesRenderCache*)buffer.infoCache[id]; if (cache == nullptr) { - cache = new FacesRenderCache(); + int maxEyeDelay = GetMaxEyeDelay(eyeBlinkFreq); + cache = new FacesRenderCache(intRand(0, maxEyeDelay)); + buffer.infoCache[id] = cache; } @@ -906,7 +935,6 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, elements->AddRenderDependency(trackName, buffer.cur_model); cache->Clear(); } - std::string eyes = eyesIn; if (buffer.cur_model == "") { return; @@ -1007,8 +1035,9 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, phoneme = "rest"; if ("Auto" == eyes) { if ((buffer.curPeriod * buffer.frameTimeInMs) >= cache->nextBlinkTime) { - // roughly every 5 seconds we'll blink - cache->nextBlinkTime += intRand(4500, 5500); + //calculate the blink time taking into account user selection + int maxEyeDelay = GetMaxEyeDelay( eyeBlinkFreq ); + cache->nextBlinkTime += intRand(maxEyeDelay-1000, maxEyeDelay); cache->blinkEndTime = buffer.curPeriod * buffer.frameTimeInMs + 101; // 100ms blink eyes = "Closed"; } else if ((buffer.curPeriod * buffer.frameTimeInMs) < cache->blinkEndTime) { @@ -1058,7 +1087,7 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, if ((buffer.curPeriod * buffer.frameTimeInMs) >= cache->nextBlinkTime) { if ((startms + 150) >= (buffer.curPeriod * buffer.frameTimeInMs)) { - // don't want to blink RIGHT at the start of the rest, delay a little bie + // don't want to blink RIGHT at the start of the rest, delay a little bit int tmp = (buffer.curPeriod * buffer.frameTimeInMs) + intRand(150, 549); // also don't want it right at the end @@ -1068,8 +1097,9 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, cache->nextBlinkTime = tmp; } } else { - // roughly every 5 seconds we'll blink - cache->nextBlinkTime += intRand(4500, 5500); + //calculate the blink time taking into account user selection + int maxEyeDelay = GetMaxEyeDelay(eyeBlinkFreq); + cache->nextBlinkTime += intRand(maxEyeDelay-1000, maxEyeDelay); cache->blinkEndTime = buffer.curPeriod * buffer.frameTimeInMs + 101; // 100ms blink eyes = "Closed"; } @@ -1084,8 +1114,9 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, } else if (phoneme == "rest" || phoneme == "(off)") { if ("Auto" == eyes) { if ((buffer.curPeriod * buffer.frameTimeInMs) >= cache->nextBlinkTime) { - // roughly every 5 seconds we'll blink - cache->nextBlinkTime += intRand(4500, 5500); + //calculate the blink time, taking into account user selection + int maxEyeDelay = GetMaxEyeDelay(eyeBlinkFreq); + cache->nextBlinkTime += intRand(maxEyeDelay-1000, maxEyeDelay); cache->blinkEndTime = buffer.curPeriod * buffer.frameTimeInMs + 101; // 100ms blink eyes = "Closed"; } else if ((buffer.curPeriod * buffer.frameTimeInMs) < cache->blinkEndTime) { @@ -1273,7 +1304,7 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, } if (type == 2) { - RenderFaces(buffer, phoneme, eyes, face_outline, alpha, suppressShimmer); + RenderFaces(buffer, phoneme, eyes, eyeBlinkFreq, face_outline, alpha, suppressShimmer); return; } if (type == 3) { @@ -1371,6 +1402,9 @@ void FacesEffect::RenderFaces(RenderBuffer& buffer, auto c = sts[wxString::Format("s%d-Color", (int)i)]; if (r != "") { xlColor colour = xlColor(c); + if (c.empty()) { + colour = xlWHITE; + } colour.alpha = ((int)alpha * colour.alpha) / 255; // use the nodes as it is faster diff --git a/xLights/effects/FacesEffect.h b/xLights/effects/FacesEffect.h index be90ec6835..ee8761ba60 100644 --- a/xLights/effects/FacesEffect.h +++ b/xLights/effects/FacesEffect.h @@ -41,17 +41,19 @@ class FacesEffect : public RenderableEffect virtual xlEffectPanel* CreatePanel(wxWindow* parent) override; private: + const std::map eyeBlinkMap; void mouth(RenderBuffer& buffer, int Phoneme, int BufferHt, int BufferWt, bool shimmer); void drawline1(RenderBuffer& buffer, int Phoneme, int x1, int x2, int y1, int y2, int colorIdx); - void drawoutline(RenderBuffer& buffer, int Phoneme, bool outline, const std::string& eyes, int BufferHt, int BufferWi); + void drawoutline(RenderBuffer& buffer, int Phoneme, bool outline, const std::string& eyes, const std::string& eyeBlinkFreq, int BufferHt, int BufferWi); void facesCircle(RenderBuffer& buffer, int Phoneme, int xc, int yc, double radius, int start_degrees, int end_degrees, int colorIdx); void drawline3(RenderBuffer& buffer, int Phoneme, int x1, int x2, int y6, int y7, int colorIdx); - void RenderFaces(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, bool face_outline, uint8_t alpha, bool suppressShimmer); - void RenderCoroFacesFromPGO(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, bool face_outline, uint8_t alpha, bool suppressShimmer); + void RenderFaces(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, const std::string& eyeBlinkFreq, bool face_outline, uint8_t alpha, bool suppressShimmer); + void RenderCoroFacesFromPGO(RenderBuffer& buffer, const std::string& Phoneme, const std::string& eyes, const std::string& eyeBlinkFreq, bool face_outline, uint8_t alpha, bool suppressShimmer); void RenderFaces(RenderBuffer& buffer, SequenceElements* elements, const std::string& faceDefintion, - const std::string& Phoneme, const std::string& track, const std::string& eyes, bool face_outline, bool transparentBlack, int transparentBlackLevel, uint8_t alpha, const std::string& outlineState, bool suppressShimmer); + const std::string& Phoneme, const std::string& track, const std::string& eyes, const std::string& eyeBlinkFreq, bool face_outline, bool transparentBlack, int transparentBlackLevel, uint8_t alpha, const std::string& outlineState, bool suppressShimmer); std::string MakeKey(int bufferWi, int bufferHt, std::string dirstr, std::string picture, std::string stf); uint8_t CalculateAlpha(SequenceElements* elements, int leadFrames, bool fade, const std::string& timingTrack, RenderBuffer& buffer); bool ShimmerState(RenderBuffer& buffer) const; + int GetMaxEyeDelay( std::string& eyeBlinkFreq ) const; }; diff --git a/xLights/effects/FacesPanel.cpp b/xLights/effects/FacesPanel.cpp index 13a145f9d1..3eff5c9ee2 100644 --- a/xLights/effects/FacesPanel.cpp +++ b/xLights/effects/FacesPanel.cpp @@ -33,6 +33,8 @@ const long FacesPanel::ID_STATICTEXT15 = wxNewId(); const long FacesPanel::ID_CHOICE_Faces_FaceDefinition = wxNewId(); const long FacesPanel::ID_STATICTEXT_Faces_Eyes = wxNewId(); const long FacesPanel::ID_CHOICE_Faces_Eyes = wxNewId(); +const long FacesPanel::ID_STATICTEXT_EYEBLINKFREQUENCY = wxNewId(); +const long FacesPanel::ID_CHOICE_Faces_EyeBlinkFrequency = wxNewId(); const long FacesPanel::ID_CHECKBOX_Faces_Outline = wxNewId(); const long FacesPanel::ID_CHECKBOX_Faces_SuppressShimmer = wxNewId(); const long FacesPanel::ID_STATICTEXT1 = wxNewId(); @@ -70,7 +72,7 @@ FacesPanel::FacesPanel(wxWindow* parent) : xlEffectPanel(parent) RadioButton1 = new wxRadioButton(this, IDD_RADIOBUTTON_Faces_Phoneme, _("Phoneme"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("IDD_RADIOBUTTON_Faces_Phoneme")); RadioButton1->SetValue(true); FlexGridSizer97->Add(RadioButton1, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); - Choice_Faces_Phoneme = new wxChoice(this, ID_CHOICE_Faces_Phoneme, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE_Faces_Phoneme")); + Choice_Faces_Phoneme = new BulkEditChoice(this, ID_CHOICE_Faces_Phoneme, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE_Faces_Phoneme")); Choice_Faces_Phoneme->SetSelection( Choice_Faces_Phoneme->Append(_("AI")) ); Choice_Faces_Phoneme->Append(_("E")); Choice_Faces_Phoneme->Append(_("FV")); @@ -104,7 +106,16 @@ FacesPanel::FacesPanel(wxWindow* parent) : xlEffectPanel(parent) Choice_Faces_Eyes->SetSelection( Choice_Faces_Eyes->Append(_("Auto")) ); Choice_Faces_Eyes->Append(_("(off)")); FlexGridSizer98->Add(Choice_Faces_Eyes, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); - FlexGridSizer98->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + StaticText_Faces_EyeBlinkFrequency = new wxStaticText(this, ID_STATICTEXT_EYEBLINKFREQUENCY, _("Eye Blink Frequency"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT_EYEBLINKFREQUENCY")); + FlexGridSizer98->Add(StaticText_Faces_EyeBlinkFrequency, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5); + Choice_Faces_EyeBlinkFrequency = new BulkEditChoice(this, ID_CHOICE_Faces_EyeBlinkFrequency, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE_Faces_EyeBlinkFrequency")); + Choice_Faces_EyeBlinkFrequency->Append(_("Slowest")); + Choice_Faces_EyeBlinkFrequency->Append(_("Slow")); + Choice_Faces_EyeBlinkFrequency->SetSelection( Choice_Faces_EyeBlinkFrequency->Append(_("Normal")) ); + Choice_Faces_EyeBlinkFrequency->Append(_("Fast")); + Choice_Faces_EyeBlinkFrequency->Append(_("Fastest")); + FlexGridSizer98->Add(Choice_Faces_EyeBlinkFrequency, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer98->Add(-1,-1,1, wxALL|wxALIGN_CENTER_VERTICAL, 5); CheckBox_Faces_Outline = new BulkEditCheckBox(this, ID_CHECKBOX_Faces_Outline, _("Show outline"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX_Faces_Outline")); CheckBox_Faces_Outline->SetValue(false); FlexGridSizer98->Add(CheckBox_Faces_Outline, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); @@ -125,10 +136,10 @@ FacesPanel::FacesPanel(wxWindow* parent) : xlEffectPanel(parent) FlexGridSizer1->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticText1 = new wxStaticText(this, ID_STATICTEXT_Faces_Lead_Frames, _("Lead In/Out Frames"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT_Faces_Lead_Frames")); FlexGridSizer1->Add(StaticText1, 1, wxALL|wxEXPAND, 5); - SpinCtrl_LeadFrames = new wxSpinCtrl(this, ID_SPINCTRL_Faces_LeadFrames, _T("0"), wxDefaultPosition, wxSize(100,-1), 0, 0, 1000, 0, _T("ID_SPINCTRL_Faces_LeadFrames")); + SpinCtrl_LeadFrames = new BulkEditSpinCtrl(this, ID_SPINCTRL_Faces_LeadFrames, _T("0"), wxDefaultPosition, wxSize(100,-1), 0, 0, 1000, 0, _T("ID_SPINCTRL_Faces_LeadFrames")); SpinCtrl_LeadFrames->SetValue(_T("0")); FlexGridSizer1->Add(SpinCtrl_LeadFrames, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); - CheckBox_Fade = new wxCheckBox(this, ID_CHECKBOX_Faces_Fade, _("Fade during lead in/out"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX_Faces_Fade")); + CheckBox_Fade = new BulkEditCheckBox(this, ID_CHECKBOX_Faces_Fade, _("Fade during lead in/out"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX_Faces_Fade")); CheckBox_Fade->SetValue(false); FlexGridSizer1->Add(CheckBox_Fade, 1, wxALL|wxEXPAND, 5); FlexGridSizer98->Add(FlexGridSizer1, 1, wxALL|wxEXPAND, 5); @@ -149,6 +160,8 @@ FacesPanel::FacesPanel(wxWindow* parent) : xlEffectPanel(parent) Connect(IDD_RADIOBUTTON_Faces_Phoneme,wxEVT_COMMAND_RADIOBUTTON_SELECTED,(wxObjectEventFunction)&FacesPanel::OnMouthMovementTypeSelected); Connect(IDD_RADIOBUTTON_Faces_TimingTrack,wxEVT_COMMAND_RADIOBUTTON_SELECTED,(wxObjectEventFunction)&FacesPanel::OnMouthMovementTypeSelected); + Connect(ID_CHOICE_Faces_Eyes,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&FacesPanel::OnChoice_Faces_EyesSelect); + Connect(ID_CHOICE_Faces_EyeBlinkFrequency,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&FacesPanel::OnChoice_Faces_EyeBlinkFrequencySelect); Connect(ID_CHECKBOX_Faces_Outline,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&FacesPanel::OnCheckBox_Faces_OutlineClick); Connect(ID_CHECKBOX_Faces_SuppressWhenNotSinging,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&FacesPanel::OnCheckBox_SuppressWhenNotSingingClick); Connect(ID_CHECKBOX_Faces_Fade,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&FacesPanel::OnCheckBox_FadeClick); @@ -202,6 +215,16 @@ void FacesPanel::ValidateWindow() else { Choice1->Enable(false); } + + wxString type = Choice_Faces_Eyes->GetStringSelection(); + if (type == "Auto") + { + Choice_Faces_EyeBlinkFrequency->Enable(); + } + else + { + Choice_Faces_EyeBlinkFrequency->Disable(); + } } void FacesPanel::OnMouthMovementTypeSelected(wxCommandEvent& event) @@ -222,3 +245,13 @@ void FacesPanel::OnCheckBox_Faces_OutlineClick(wxCommandEvent& event) { ValidateWindow(); } + +void FacesPanel::OnChoice_Faces_EyeBlinkFrequencySelect(wxCommandEvent& event) +{ + ValidateWindow(); +} + +void FacesPanel::OnChoice_Faces_EyesSelect(wxCommandEvent& event) +{ + ValidateWindow(); +} diff --git a/xLights/effects/FacesPanel.h b/xLights/effects/FacesPanel.h index f89e8279bd..9e6bd47ab3 100644 --- a/xLights/effects/FacesPanel.h +++ b/xLights/effects/FacesPanel.h @@ -37,24 +37,26 @@ class FacesPanel: public xlEffectPanel //(*Declarations(FacesPanel) BulkEditCheckBox* CheckBox_Faces_Outline; + BulkEditCheckBox* CheckBox_Fade; BulkEditCheckBox* CheckBox_SuppressShimmer; BulkEditCheckBox* CheckBox_SuppressWhenNotSinging; BulkEditCheckBox* CheckBox_TransparentBlack; + BulkEditChoice* Choice_Faces_EyeBlinkFrequency; BulkEditChoice* Choice_Faces_Eyes; + BulkEditChoice* Choice_Faces_Phoneme; BulkEditChoice* Choice_Faces_TimingTrack; BulkEditFaceChoice* Face_FaceDefinitonChoice; BulkEditSlider* Slider_Faces_TransparentBlack; + BulkEditSpinCtrl* SpinCtrl_LeadFrames; BulkEditStateChoice* Choice1; BulkEditTextCtrl* TextCtrl_Faces_TransparentBlack; - wxCheckBox* CheckBox_Fade; - wxChoice* Choice_Faces_Phoneme; wxRadioButton* RadioButton1; wxRadioButton* RadioButton2; - wxSpinCtrl* SpinCtrl_LeadFrames; wxStaticText* StaticText14; wxStaticText* StaticText1; wxStaticText* StaticText2; wxStaticText* StaticText71; + wxStaticText* StaticText_Faces_EyeBlinkFrequency; //*) protected: @@ -68,6 +70,8 @@ class FacesPanel: public xlEffectPanel static const long ID_CHOICE_Faces_FaceDefinition; static const long ID_STATICTEXT_Faces_Eyes; static const long ID_CHOICE_Faces_Eyes; + static const long ID_STATICTEXT_EYEBLINKFREQUENCY; + static const long ID_CHOICE_Faces_EyeBlinkFrequency; static const long ID_CHECKBOX_Faces_Outline; static const long ID_CHECKBOX_Faces_SuppressShimmer; static const long ID_STATICTEXT1; @@ -88,6 +92,8 @@ class FacesPanel: public xlEffectPanel void OnCheckBox_SuppressWhenNotSingingClick(wxCommandEvent& event); void OnCheckBox_FadeClick(wxCommandEvent& event); void OnCheckBox_Faces_OutlineClick(wxCommandEvent& event); + void OnChoice_Faces_EyeBlinkFrequencySelect(wxCommandEvent& event); + void OnChoice_Faces_EyesSelect(wxCommandEvent& event); //*) DECLARE_EVENT_TABLE() diff --git a/xLights/effects/LiquidEffect.cpp b/xLights/effects/LiquidEffect.cpp index 7bc1b4827f..f9ae9fd572 100644 --- a/xLights/effects/LiquidEffect.cpp +++ b/xLights/effects/LiquidEffect.cpp @@ -29,6 +29,7 @@ #include //#define LE_INTERPOLATE +#define MAX_PARTICLES 100000 LiquidEffect::LiquidEffect(int id) : RenderableEffect(id, "Liquid", liquid_16, liquid_24, liquid_32, liquid_48, liquid_64) { @@ -47,14 +48,34 @@ std::list LiquidEffect::CheckEffectSettings(const SettingsMap& sett std::list res; if (media == nullptr && (settings.GetBool("E_CHECKBOX_FlowMusic1", false) || - settings.GetBool("E_CHECKBOX_FlowMusic2", false) || - settings.GetBool("E_CHECKBOX_FlowMusic3", false) || - settings.GetBool("E_CHECKBOX_FlowMusic4", false)) - ) - { + settings.GetBool("E_CHECKBOX_FlowMusic2", false) || + settings.GetBool("E_CHECKBOX_FlowMusic3", false) || + settings.GetBool("E_CHECKBOX_FlowMusic4", false))) { res.push_back(wxString::Format(" WARN: Liquid effect cant change flow to music if there is no music. Model '%s', Start %s", model->GetName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); } + int frameInterval = 50; + if (media != nullptr) + frameInterval = media->GetFrameInterval(); + int lifetimeFrames = (1.1 * GetValueCurveIntMax("LifeTime", 1000, settings, LIQUID_LIFETIME_MIN, LIQUID_LIFETIME_MAX)) / 100 * frameInterval / 1000; // this is the lifetime in frames + if (lifetimeFrames == 0) { + lifetimeFrames = (eff->GetEndTimeMS() - eff->GetStartTimeMS()) / frameInterval; + } + lifetimeFrames = std::min(lifetimeFrames, (eff->GetEndTimeMS() - eff->GetStartTimeMS()) / frameInterval); + int flow1 = GetValueCurveIntMax("Flow1", 100, settings, LIQUID_FLOW_MIN, LIQUID_FLOW_MAX); + int flow2 = settings.GetBool("E_CHECKBOX_Enabled2", false) ? GetValueCurveIntMax("Flow2", 100, settings, LIQUID_FLOW_MIN, LIQUID_FLOW_MAX) : 0; + int flow3 = settings.GetBool("E_CHECKBOX_Enabled3", false) ? GetValueCurveIntMax("Flow3", 100, settings, LIQUID_FLOW_MIN, LIQUID_FLOW_MAX) : 0; + int flow4 = settings.GetBool("E_CHECKBOX_Enabled4", false) ? GetValueCurveIntMax("Flow4", 100, settings, LIQUID_FLOW_MIN, LIQUID_FLOW_MAX) : 0; + int count = lifetimeFrames * (flow1 + flow2 + flow3 + flow4); + + if (count > MAX_PARTICLES) { + res.push_back(wxString::Format(" WARN: Liquid effect lifetime * (flow 1 + flow 2 + flow 3 + flow 4) = %d exceeds %d. Particle count will be limited. Model '%s', Start %s", count, MAX_PARTICLES, model->GetName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); + } + + if (settings.GetInt("E_TEXTCTRL_Size", 500) > 1000) { + res.push_back(wxString::Format(" WARN: Liquid effect particle size > 1000 can slow render times significantly. Model '%s', Start %s", model->GetName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); + } + return res; } @@ -224,7 +245,49 @@ void LiquidEffect::CreateBarrier(b2World* world, float x, float y, float width, groundBody->CreateFixture((b2Shape*)&groundBox, 0.0f); } -void LiquidEffect::Draw(RenderBuffer& buffer, b2ParticleSystem* ps, const xlColor& color, bool mixColors, int despeckle) +bool LiquidEffect::LostForever(int x, int y, int w, int h, float gravityX, float gravityY) +{ + // essentially vertical ... at this point it wont come back + if (gravityX < 0.0001f && gravityX > -0.0001f) { + if (x < -1 || x > w + 1) + return true; + } + + // gravity left and off the screen so it wont come back + if (gravityX < 0.0001f) + { + if (x < -1) + return true; + } + + // gravity right and off the screen so it wont come back + if (gravityX > -0.0001f) { + if (x > w + 1) + return true; + } + + // essentially horizontal + if (gravityY < 0.0001f && gravityY > -0.0001f) { + if (y < -1 || y > h + 1) + return true; + } + + // gravity down and off the bottom of the screen + if (gravityY > -0.0001f) { + if (y < -1) + return true; + } + + // gravity up and off the top of the screen + if (gravityY < 0.0001f) { + if (y > h + 1) + return true; + } + + return false; +} + +void LiquidEffect::Draw(RenderBuffer& buffer, b2ParticleSystem* ps, const xlColor& color, bool mixColors, int despeckle, float gravityX, float gravityY) { #ifdef LE_INTERPOLATE size_t bufsiz = sizeof(size_t) * buffer.BufferWi * buffer.BufferHt; @@ -309,7 +372,7 @@ void LiquidEffect::Draw(RenderBuffer& buffer, b2ParticleSystem* ps, const xlColo int x = positionBuffer[i].x; int y = positionBuffer[i].y; - if (y < -1 || x < -1 || x > buffer.BufferWi + 1) + if (LostForever(x, y, buffer.BufferWi, buffer.BufferHt, gravityX, gravityY)) { ps->DestroyParticle(i); } @@ -331,7 +394,7 @@ void LiquidEffect::Draw(RenderBuffer& buffer, b2ParticleSystem* ps, const xlColo if (despeckle > 0) { - for (size_t y = 0; y < buffer.BufferHt; y++) { + for (size_t y = 0; y < buffer.BufferHt; ++y) { for (size_t x = 0; x < buffer.BufferWi; ++x) { if (buffer.GetPixel(x, y) == xlBLACK) { buffer.SetPixel(x, y, GetDespeckleColor(buffer, x, y, despeckle)); @@ -373,14 +436,14 @@ xlColor LiquidEffect::GetDespeckleColor(RenderBuffer& buffer, size_t x, size_t y // if any surrounding pixel is also black then we return black ... we only despeckly totally surrounded pixels if (c == xlBLACK) { - blacks++; + ++blacks; if (blacks >= despeckle) return xlBLACK; } red += c.red; green += c.green; blue += c.blue; - count++; + ++count; } } } @@ -406,6 +469,7 @@ void LiquidEffect::CreateParticles(b2ParticleSystem* ps, int x, int y, int direc velx -= velx * velVariation; vely -= vely * velVariation; + // if lifetime is 1000 ... then we live for 10 seconds float lt = lifetime / 100.0; int count = flow; @@ -414,7 +478,15 @@ void LiquidEffect::CreateParticles(b2ParticleSystem* ps, int x, int y, int direc count *= audioLevel; } - for (int i = 0; i < count; i++) + // if we are going to exceed the maximum particles in 2 steps then we need to start flagging the older particles for deletion + // DestroyOldestParticle does not delete them immediately + if (ps->GetParticleCount() > MAX_PARTICLES - (2 * count)) { + for (int i = 0; i < ps->GetParticleCount() - (MAX_PARTICLES - 2 * count); ++i) { + ps->DestroyOldestParticle(i, true); + } + } + + for (int i = 0; i < count && ps->GetParticleCount() < MAX_PARTICLES; ++i) { b2ParticleDef pd; if (particleType == "Elastic") @@ -506,7 +578,7 @@ void LiquidEffect::CreateParticleSystem(b2World* world, int lifetime, int size) b2ParticleSystemDef particleSystemDef; auto particleSystem = world->CreateParticleSystem(&particleSystemDef); particleSystem->SetRadius((float)size / 1000.0f); - particleSystem->SetMaxParticleCount(100000); + particleSystem->SetMaxParticleCount(MAX_PARTICLES); if (lifetime > 0) { particleSystem->SetDestructionByAge(true); @@ -521,6 +593,7 @@ void LiquidEffect::Step(b2World* world, RenderBuffer &buffer, bool enabled[], in ) { // move all existing items + // If frame time is 50ms then time advances by 0.05s float32 timeStep = (float)buffer.frameTimeInMs / 1000.0; int32 velocityIterations = 6; int32 positionIterations = 2; @@ -542,7 +615,7 @@ void LiquidEffect::Step(b2World* world, RenderBuffer &buffer, bool enabled[], in } int j = 0; - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; ++i) { if (enabled[i]) { @@ -564,7 +637,7 @@ void LiquidEffect::Step(b2World* world, RenderBuffer &buffer, bool enabled[], in CreateParticles(ps, x4, y4, direction4, velocity4, flow4, flowMusic4, lifetime, buffer.BufferWi, buffer.BufferHt, color, particleType, mixcolors, audioLevel, sourceSize4); break; } - j++; + ++j; } } } @@ -672,7 +745,7 @@ void LiquidEffect::Render(RenderBuffer &buffer, { xlColor color; buffer.palette.GetColor(0, color); - Draw(buffer, ps, color, holdcolor || mixcolors, despeckle); + Draw(buffer, ps, color, holdcolor || mixcolors, despeckle, gravityX, gravityY); } // because of memory usage delete our world when rendered the last frame diff --git a/xLights/effects/LiquidEffect.h b/xLights/effects/LiquidEffect.h index fafcfab55b..03cc322dca 100644 --- a/xLights/effects/LiquidEffect.h +++ b/xLights/effects/LiquidEffect.h @@ -130,7 +130,8 @@ class LiquidEffect : public RenderableEffect bool enabled4, int direction4, int x4, int y4, int velocity4, int flow4, int sourceSize4, bool flowMusic4, const std::string& particleType, int despeckle, float gravity, int gravityAngle); void CreateBarrier(b2World* world, float x, float y, float width, float height); - void Draw(RenderBuffer& buffer, b2ParticleSystem* ps, const xlColor& color, bool mixColors, int despeckle); + void Draw(RenderBuffer& buffer, b2ParticleSystem* ps, const xlColor& color, bool mixColors, int despeckle, float gravityX, float gravityY); + bool LostForever(int x, int y, int w, int h, float gravityX, float gravityY); void CreateParticles(b2ParticleSystem* ps, int x, int y, int direction, int velocity, int flow, bool flowMusic, int lifetime, int width, int height, const xlColor& c, const std::string& particleType, bool mixcolors, float audioLevel, int sourceSize); void CreateParticleSystem(b2World* world, int lifetime, int size); void Step(b2World* world, RenderBuffer& buffer, bool enabled[], int lifetime, const std::string& particleType, bool mixcolors, diff --git a/xLights/effects/PianoEffect.cpp b/xLights/effects/PianoEffect.cpp index 46ef588085..49aba49c5c 100644 --- a/xLights/effects/PianoEffect.cpp +++ b/xLights/effects/PianoEffect.cpp @@ -723,6 +723,7 @@ std::map>> PianoEffect::LoadTimingTrack(c } } + // std::eraseif std::remove_if(tracker.begin(), tracker.end(), [](std::tuple t) { return std::get<0>(t) == -1; }); } diff --git a/xLights/effects/PicturesEffect.cpp b/xLights/effects/PicturesEffect.cpp index d2dfc37d12..1157981a21 100644 --- a/xLights/effects/PicturesEffect.cpp +++ b/xLights/effects/PicturesEffect.cpp @@ -463,6 +463,7 @@ bool PicturesEffect::IsPictureFile(std::string filename) ext == "jpg" || ext == "jpeg" || ext == "png" || + ext == "webp" || ext == "bmp" ) { diff --git a/xLights/effects/RenderableEffect.cpp b/xLights/effects/RenderableEffect.cpp index 869d8b79c4..11333da606 100644 --- a/xLights/effects/RenderableEffect.cpp +++ b/xLights/effects/RenderableEffect.cpp @@ -936,6 +936,35 @@ double RenderableEffect::GetValueCurveDouble(const std::string &name, double def return res; } +int RenderableEffect::GetValueCurveIntMax(const std::string& name, int def, const SettingsMap& SettingsMap, int min, int max, int divisor) +{ + int res = def; + + const std::string vn = "E_VALUECURVE_" + name; + if (SettingsMap.Contains(vn)) { + const std::string& vc = SettingsMap.Get(vn, xlEMPTY_STRING); + + ValueCurve valc; + valc.SetDivisor(divisor); + valc.SetLimits(min, max); + valc.Deserialise(vc); + if (valc.IsActive()) { + return valc.GetMaxValueDivided(); + } + } + + const std::string sn = "E_SLIDER_" + name; + const std::string tn = "E_TEXTCTRL_" + name; + // bool slider = false; + if (SettingsMap.Contains(sn)) { + res = SettingsMap.GetInt(sn, def); + // slider = true; + } else if (SettingsMap.Contains(tn)) { + res = SettingsMap.GetInt(tn, def); + } + return res; +} + int RenderableEffect::GetValueCurveInt(const std::string &name, int def, const SettingsMap &SettingsMap, float offset, int min, int max, long startMS, long endMS, int divisor) { int res = def; diff --git a/xLights/effects/RenderableEffect.h b/xLights/effects/RenderableEffect.h index 0c8b1c849c..f56d6f1de6 100644 --- a/xLights/effects/RenderableEffect.h +++ b/xLights/effects/RenderableEffect.h @@ -170,6 +170,7 @@ class RenderableEffect double GetValueCurveDouble(const std::string& name, double def, const SettingsMap& SettingsMap, float offset, double min, double max, long startMS, long endMS, int divisor = 1); int GetValueCurveInt(const std::string& name, int def, const SettingsMap& SettingsMap, float offset, int min, int max, long startMS, long endMS, int divisor = 1); + int GetValueCurveIntMax(const std::string& name, int def, const SettingsMap& SettingsMap, int min, int max, int divisor = 1); EffectLayer* GetTiming(const std::string& timingtrack) const; Effect* GetCurrentTiming(const RenderBuffer& buffer, const std::string& timingtrack) const; std::string GetTimingTracks(const int maxLayers = 0, const int absoluteLayers = 0) const; diff --git a/xLights/effects/ServoEffect.cpp b/xLights/effects/ServoEffect.cpp index bf4758a0e2..ff651d8deb 100644 --- a/xLights/effects/ServoEffect.cpp +++ b/xLights/effects/ServoEffect.cpp @@ -81,6 +81,10 @@ void ServoEffect::SetDefaultParameters() { dp->ValueCurve_Servo->SetActive(false); SetSliderValue(dp->Slider_Servo, 0); + dp->Choice_Channel->SetSelection(-1); + SetCheckBoxValue(dp->CheckBox_Timing_Track, false); + SetCheckBoxValue(dp->CheckBox_16bit, false); + dp->Choice_Servo_TimingTrack->SetSelection(-1); } void ServoEffect::Render(Effect *effect, const SettingsMap &SettingsMap, RenderBuffer &buffer) { diff --git a/xLights/effects/ShockwaveEffect.cpp b/xLights/effects/ShockwaveEffect.cpp index a76347fd68..0a42b2b453 100644 --- a/xLights/effects/ShockwaveEffect.cpp +++ b/xLights/effects/ShockwaveEffect.cpp @@ -39,7 +39,14 @@ xlEffectPanel *ShockwaveEffect::CreatePanel(wxWindow *parent) { int ShockwaveEffect::DrawEffectBackground(const Effect *e, int x1, int y1, int x2, int y2, xlVertexColorAccumulator &backgrounds, xlColor* colorMask, bool ramps) { - backgrounds.AddHBlendedRectangleAsTriangles(x1, y1, x2, y2, colorMask, 0, e->GetPalette()); + int cycles = e->GetSettings().GetInt("E_SLIDER_Shockwave_Cycles", 1); + int totalsize = x2 - x1; + double x_size = totalsize / (double)cycles; + x_size = std::max(x_size, 0.01); + for (int i = 0; i < cycles; ++i) { + backgrounds.AddHBlendedRectangleAsTriangles(x1 + (i * x_size), y1, x1 + (i * x_size) + x_size, y2, colorMask, 0, e->GetPalette()); + } + return 2; } @@ -63,14 +70,17 @@ void ShockwaveEffect::SetDefaultParameters() { SetSliderValue(sp->Slider_Shockwave_End_Width, 10); SetSliderValue(sp->Slider_Shockwave_Start_Radius, 1); SetSliderValue(sp->Slider_Shockwave_Start_Width, 5); + SetSliderValue(sp->Slider_Shockwave_Cycles, 1); SetCheckBoxValue(sp->CheckBox_Shockwave_Blend_Edges, true); + SetCheckBoxValue(sp->CheckBox_Shockwave_Scale, false); } #define ToRadians(x) ((double)x * PI / (double)180.0) void ShockwaveEffect::Render(Effect *effect, const SettingsMap &SettingsMap, RenderBuffer &buffer) { - double eff_pos = buffer.GetEffectTimeIntervalPosition(); + int cycles = SettingsMap.GetInt("SLIDER_Shockwave_Cycles", 1); + double eff_pos = buffer.GetEffectTimeIntervalPosition(cycles); int center_x = GetValueCurveInt("Shockwave_CenterX", 50, SettingsMap, eff_pos, SHOCKWAVE_X_MIN, SHOCKWAVE_X_MAX, buffer.GetStartTimeMS(), buffer.GetEndTimeMS()); int center_y = GetValueCurveInt("Shockwave_CenterY", 50, SettingsMap, eff_pos, SHOCKWAVE_Y_MIN, SHOCKWAVE_Y_MAX, buffer.GetStartTimeMS(), buffer.GetEndTimeMS()); int start_radius = GetValueCurveInt("Shockwave_Start_Radius", 0, SettingsMap, eff_pos, SHOCKWAVE_STARTRADIUS_MIN, SHOCKWAVE_STARTRADIUS_MAX, buffer.GetStartTimeMS(), buffer.GetEndTimeMS()); @@ -79,10 +89,12 @@ void ShockwaveEffect::Render(Effect *effect, const SettingsMap &SettingsMap, Ren int end_width = GetValueCurveInt("Shockwave_End_Width", 0, SettingsMap, eff_pos, SHOCKWAVE_ENDWIDTH_MIN, SHOCKWAVE_ENDWIDTH_MAX, buffer.GetStartTimeMS(), buffer.GetEndTimeMS()); int acceleration = SettingsMap.GetInt("SLIDER_Shockwave_Accel", 0); bool blend_edges = SettingsMap.GetBool("CHECKBOX_Shockwave_Blend_Edges"); + bool scale = SettingsMap.GetBool("CHECKBOX_Shockwave_Scale", false); int num_colors = buffer.palette.Size(); if( num_colors == 0 ) num_colors = 1; + double eff_pos_adj = buffer.calcAccel(eff_pos, acceleration); HSVValue hsv, hsv1; @@ -103,6 +115,13 @@ void ShockwaveEffect::Render(Effect *effect, const SettingsMap &SettingsMap, Ren double radius1 = start_radius; double radius2 = end_radius; + if (scale) {//convert to percentage of buffer, i.e 100 is 100% of buffer size + double bufferMax = std::max(buffer.BufferHt, buffer.BufferWi); + radius1 = radius1 * (bufferMax / 200.0); //200 bc radius is half of the width + radius2 = radius2 * (bufferMax / 200.0); + start_width = start_width * (bufferMax / 100.0); + end_width = end_width * (bufferMax / 100.0); + } double radius_center = radius1 + (radius2 - radius1) * eff_pos_adj; double half_width = (start_width + (end_width - start_width) * eff_pos_adj) / 2.0; if (half_width < 0.25) { diff --git a/xLights/effects/ShockwavePanel.cpp b/xLights/effects/ShockwavePanel.cpp index cbc954ebc1..094efab5b3 100644 --- a/xLights/effects/ShockwavePanel.cpp +++ b/xLights/effects/ShockwavePanel.cpp @@ -63,7 +63,12 @@ const long ShockwavePanel::ID_STATICTEXT_Shockwave_Accel = wxNewId(); const long ShockwavePanel::ID_SLIDER_Shockwave_Accel = wxNewId(); const long ShockwavePanel::IDD_TEXTCTRL_Shockwave_Accel = wxNewId(); const long ShockwavePanel::ID_BITMAPBUTTON_SLIDER_Shockwave_Accel = wxNewId(); +const long ShockwavePanel::ID_STATICTEXT1 = wxNewId(); +const long ShockwavePanel::ID_SLIDER_Shockwave_Cycles = wxNewId(); +const long ShockwavePanel::IDD_TEXTCTRL_Shockwave_Cycles = wxNewId(); +const long ShockwavePanel::ID_BITMAPBUTTON_SLIDER_Shockwave_Cycles = wxNewId(); const long ShockwavePanel::ID_CHECKBOX_Shockwave_Blend_Edges = wxNewId(); +const long ShockwavePanel::ID_CHECKBOX_Shockwave_Scale = wxNewId(); const long ShockwavePanel::ID_PANEL44 = wxNewId(); const long ShockwavePanel::ID_NOTEBOOK_Shockwave = wxNewId(); //*) @@ -133,7 +138,7 @@ ShockwavePanel::ShockwavePanel(wxWindow* parent) : xlEffectPanel(parent) BitmapButton_Shockwave_StartRadius->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT)); FlexGridSizer100->Add(BitmapButton_Shockwave_StartRadius, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticText158 = new wxStaticText(Panel10, ID_STATICTEXT_Shockwave_End_Radius, _("Radius2:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT_Shockwave_End_Radius")); - FlexGridSizer100->Add(StaticText158, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer100->Add(StaticText158, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5); Slider_Shockwave_End_Radius = new BulkEditSlider(Panel10, ID_SLIDER_Shockwave_End_Radius, 10, 0, 750, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER_Shockwave_End_Radius")); FlexGridSizer100->Add(Slider_Shockwave_End_Radius, 1, wxALL|wxEXPAND, 5); BitmapButton_Shockwave_End_Radius = new BulkEditValueCurveButton(Panel10, ID_VALUECURVE_Shockwave_End_Radius, GetValueCurveNotSelectedBitmap(), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_VALUECURVE_Shockwave_End_Radius")); @@ -157,7 +162,7 @@ ShockwavePanel::ShockwavePanel(wxWindow* parent) : xlEffectPanel(parent) BitmapButton_Shockwave_StartWidth->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT)); FlexGridSizer100->Add(BitmapButton_Shockwave_StartWidth, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticText159 = new wxStaticText(Panel10, ID_STATICTEXT_Shockwave_End_Width, _("Width2:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT_Shockwave_End_Width")); - FlexGridSizer100->Add(StaticText159, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer100->Add(StaticText159, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5); Slider_Shockwave_End_Width = new BulkEditSlider(Panel10, ID_SLIDER_Shockwave_End_Width, 10, 0, 255, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER_Shockwave_End_Width")); FlexGridSizer100->Add(Slider_Shockwave_End_Width, 1, wxALL|wxEXPAND, 5); BitmapButton_Shockwave_End_Width = new BulkEditValueCurveButton(Panel10, ID_VALUECURVE_Shockwave_End_Width, GetValueCurveNotSelectedBitmap(), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_VALUECURVE_Shockwave_End_Width")); @@ -169,6 +174,8 @@ ShockwavePanel::ShockwavePanel(wxWindow* parent) : xlEffectPanel(parent) BitmapButton_Shockwave_EndWidth->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT)); FlexGridSizer100->Add(BitmapButton_Shockwave_EndWidth, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); Panel10->SetSizer(FlexGridSizer100); + FlexGridSizer100->Fit(Panel10); + FlexGridSizer100->SetSizeHints(Panel10); Panel14 = new wxPanel(Notebook3, ID_PANEL44, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL44")); FlexGridSizer101 = new wxFlexGridSizer(0, 4, 0, 0); FlexGridSizer101->AddGrowableCol(1); @@ -182,14 +189,35 @@ ShockwavePanel::ShockwavePanel(wxWindow* parent) : xlEffectPanel(parent) BitmapButton_Shockwave_Accel = new xlLockButton(Panel14, ID_BITMAPBUTTON_SLIDER_Shockwave_Accel, wxNullBitmap, wxDefaultPosition, wxSize(14,14), wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_BITMAPBUTTON_SLIDER_Shockwave_Accel")); BitmapButton_Shockwave_Accel->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT)); FlexGridSizer101->Add(BitmapButton_Shockwave_Accel, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + StaticText1 = new wxStaticText(Panel14, ID_STATICTEXT1, _("Cycles:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1")); + FlexGridSizer101->Add(StaticText1, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5); + Slider_Shockwave_Cycles = new BulkEditSlider(Panel14, ID_SLIDER_Shockwave_Cycles, 1, 1, 100, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER_Shockwave_Cycles")); + FlexGridSizer101->Add(Slider_Shockwave_Cycles, 1, wxALL|wxEXPAND, 5); + TextCtrl_Shockwave_Cycles = new BulkEditTextCtrl(Panel14, IDD_TEXTCTRL_Shockwave_Cycles, _("1"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(20,-1)), 0, wxDefaultValidator, _T("IDD_TEXTCTRL_Shockwave_Cycles")); + TextCtrl_Shockwave_Cycles->SetMaxLength(3); + FlexGridSizer101->Add(TextCtrl_Shockwave_Cycles, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + BitmapButton_Shockwave_Cycles = new xlLockButton(Panel14, ID_BITMAPBUTTON_SLIDER_Shockwave_Cycles, wxNullBitmap, wxDefaultPosition, wxSize(14,14), wxBU_AUTODRAW|wxBORDER_NONE, wxDefaultValidator, _T("ID_BITMAPBUTTON_SLIDER_Shockwave_Cycles")); + BitmapButton_Shockwave_Cycles->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT)); + FlexGridSizer101->Add(BitmapButton_Shockwave_Cycles, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer101->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); CheckBox_Shockwave_Blend_Edges = new BulkEditCheckBox(Panel14, ID_CHECKBOX_Shockwave_Blend_Edges, _("Blend Edges:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT, wxDefaultValidator, _T("ID_CHECKBOX_Shockwave_Blend_Edges")); CheckBox_Shockwave_Blend_Edges->SetValue(true); FlexGridSizer101->Add(CheckBox_Shockwave_Blend_Edges, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer101->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer101->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer101->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + CheckBox_Shockwave_Scale = new BulkEditCheckBox(Panel14, ID_CHECKBOX_Shockwave_Scale, _("Scale to Buffer:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT, wxDefaultValidator, _T("ID_CHECKBOX_Shockwave_Scale")); + CheckBox_Shockwave_Scale->SetValue(false); + FlexGridSizer101->Add(CheckBox_Shockwave_Scale, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); Panel14->SetSizer(FlexGridSizer101); + FlexGridSizer101->Fit(Panel14); + FlexGridSizer101->SetSizeHints(Panel14); Notebook3->AddPage(Panel10, _("Position"), false); Notebook3->AddPage(Panel14, _("Options"), false); FlexGridSizer110->Add(Notebook3, 1, wxALL|wxEXPAND, 5); SetSizer(FlexGridSizer110); + FlexGridSizer110->Fit(this); + FlexGridSizer110->SetSizeHints(this); Connect(ID_VALUECURVE_Shockwave_CenterX,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ShockwavePanel::OnVCButtonClick); Connect(ID_BITMAPBUTTON_SLIDER_Shockwave_CenterX,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ShockwavePanel::OnLockButtonClick); @@ -204,6 +232,7 @@ ShockwavePanel::ShockwavePanel(wxWindow* parent) : xlEffectPanel(parent) Connect(ID_VALUECURVE_Shockwave_End_Width,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ShockwavePanel::OnVCButtonClick); Connect(ID_BITMAPBUTTON_SLIDER_Shockwave_End_Width,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ShockwavePanel::OnLockButtonClick); Connect(ID_BITMAPBUTTON_SLIDER_Shockwave_Accel,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ShockwavePanel::OnLockButtonClick); + Connect(ID_BITMAPBUTTON_SLIDER_Shockwave_Cycles,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ShockwavePanel::OnLockButtonClick); //*) Connect(wxID_ANY, EVT_VC_CHANGED, (wxObjectEventFunction)&ShockwavePanel::OnVCChanged, 0, this); diff --git a/xLights/effects/ShockwavePanel.h b/xLights/effects/ShockwavePanel.h index e559a94f28..ce6866aeef 100644 --- a/xLights/effects/ShockwavePanel.h +++ b/xLights/effects/ShockwavePanel.h @@ -35,13 +35,16 @@ class ShockwavePanel: public xlEffectPanel //(*Declarations(ShockwavePanel) BulkEditCheckBox* CheckBox_Shockwave_Blend_Edges; + BulkEditCheckBox* CheckBox_Shockwave_Scale; BulkEditSlider* Slider_Shockwave_Accel; BulkEditSlider* Slider_Shockwave_CenterX; BulkEditSlider* Slider_Shockwave_CenterY; + BulkEditSlider* Slider_Shockwave_Cycles; BulkEditSlider* Slider_Shockwave_End_Radius; BulkEditSlider* Slider_Shockwave_End_Width; BulkEditSlider* Slider_Shockwave_Start_Radius; BulkEditSlider* Slider_Shockwave_Start_Width; + BulkEditTextCtrl* TextCtrl_Shockwave_Cycles; BulkEditValueCurveButton* BitmapButton_Shockwave_CenterX; BulkEditValueCurveButton* BitmapButton_Shockwave_CenterY; BulkEditValueCurveButton* BitmapButton_Shockwave_End_Radius; @@ -56,9 +59,11 @@ class ShockwavePanel: public xlEffectPanel wxStaticText* StaticText158; wxStaticText* StaticText159; wxStaticText* StaticText166; + wxStaticText* StaticText1; xlLockButton* BitmapButton_Shockwave_Accel; xlLockButton* BitmapButton_Shockwave_Center_X; xlLockButton* BitmapButton_Shockwave_Center_Y; + xlLockButton* BitmapButton_Shockwave_Cycles; xlLockButton* BitmapButton_Shockwave_EndRadius; xlLockButton* BitmapButton_Shockwave_EndWidth; xlLockButton* BitmapButton_Shockwave_StartRadius; @@ -103,7 +108,12 @@ class ShockwavePanel: public xlEffectPanel static const long ID_SLIDER_Shockwave_Accel; static const long IDD_TEXTCTRL_Shockwave_Accel; static const long ID_BITMAPBUTTON_SLIDER_Shockwave_Accel; + static const long ID_STATICTEXT1; + static const long ID_SLIDER_Shockwave_Cycles; + static const long IDD_TEXTCTRL_Shockwave_Cycles; + static const long ID_BITMAPBUTTON_SLIDER_Shockwave_Cycles; static const long ID_CHECKBOX_Shockwave_Blend_Edges; + static const long ID_CHECKBOX_Shockwave_Scale; static const long ID_PANEL44; static const long ID_NOTEBOOK_Shockwave; //*) diff --git a/xLights/effects/SketchEffect.cpp b/xLights/effects/SketchEffect.cpp index 8cf3c4f829..95dc62eb2b 100644 --- a/xLights/effects/SketchEffect.cpp +++ b/xLights/effects/SketchEffect.cpp @@ -180,15 +180,18 @@ std::list SketchEffect::CheckEffectSettings(const SettingsMap& sett wxLogNull logNo; // suppress popups from png images. See http://trac.wxwidgets.org/ticket/15331 std::list res; - wxString filename = settings.Get("E_FILEPICKER_SketchBackground", ""); - - if (filename == "" || !FileExists(filename)) { - res.push_back(wxString::Format(" ERR: Sketch effect cant find image file '%s'. Model '%s', Start %s", filename, model->GetName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); - } else { - if (!IsFileInShowDir(xLightsFrame::CurrentDir, filename.ToStdString())) { - res.push_back(wxString::Format(" WARN: Sketch effect image file '%s' not under show directory. Model '%s', Start %s", filename, model->GetName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); + if (!xLightsFrame::IsCheckSequenceOptionDisabled("SketchImage")) { + wxString filename = settings.Get("E_FILEPICKER_SketchBackground", ""); + if (filename == "" || !FileExists(filename)) { + // this is only a warning as it does not affect rendering + res.push_back(wxString::Format(" WARN: Sketch effect cant find image file '%s'. Model '%s', Start %s", filename, model->GetName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); + } else { + if (!IsFileInShowDir(xLightsFrame::CurrentDir, filename.ToStdString())) { + res.push_back(wxString::Format(" WARN: Sketch effect image file '%s' not under show directory. Model '%s', Start %s", filename, model->GetName(), FORMATTIME(eff->GetStartTimeMS())).ToStdString()); + } } } + return res; } diff --git a/xLights/effects/SketchPanel.cpp b/xLights/effects/SketchPanel.cpp index 568737449a..fe4d69826c 100644 --- a/xLights/effects/SketchPanel.cpp +++ b/xLights/effects/SketchPanel.cpp @@ -25,7 +25,7 @@ namespace const char demoVideoURL2[] = "https://vimeo.com/698053599"; const wxString imgSelect("Select an image file"); - const wxString imgFilters("*.jpg;*.gif;*.png;*.bmp;*.jpeg"); + const wxString imgFilters("*.jpg;*.gif;*.png;*.bmp;*.jpeg;*.webp"); SketchAssistPanel* getSketchAssistPanel(wxWindow* win) { diff --git a/xLights/effects/assist/SketchAssistPanel.cpp b/xLights/effects/assist/SketchAssistPanel.cpp index 05e8e3d0a4..8c90e33e7a 100644 --- a/xLights/effects/assist/SketchAssistPanel.cpp +++ b/xLights/effects/assist/SketchAssistPanel.cpp @@ -43,7 +43,7 @@ namespace { const wxString imgSelect("Select an image file"); - const wxString imgFilters("*.jpg;*.gif;*.png;*.bmp;*.jpeg"); + const wxString imgFilters("*.jpg;*.gif;*.png;*.bmp;*.jpeg;*.webp"); const char HotkeysText[] = "Shift\tToggle segment type (line, one-point curve, two-point curve)\n" diff --git a/xLights/effects/assist/xlGridCanvasPictures.cpp b/xLights/effects/assist/xlGridCanvasPictures.cpp index a194247bc2..71181cf8ed 100644 --- a/xLights/effects/assist/xlGridCanvasPictures.cpp +++ b/xLights/effects/assist/xlGridCanvasPictures.cpp @@ -18,7 +18,9 @@ #include "../../ExternalHooks.h" #include "UtilFunctions.h" -static const wxString strSupportedImageTypes = "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"; +static const wxString strSupportedImageTypes = "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"; BEGIN_EVENT_TABLE(xlGridCanvasPictures, xlGridCanvas) EVT_PAINT(xlGridCanvasPictures::render) diff --git a/xLights/effects/metal/MetalComputeUtilities.mm b/xLights/effects/metal/MetalComputeUtilities.mm index 09618f6081..4b79ccef0f 100644 --- a/xLights/effects/metal/MetalComputeUtilities.mm +++ b/xLights/effects/metal/MetalComputeUtilities.mm @@ -336,8 +336,11 @@ } bool MetalRenderBufferComputeData::callRotoZoomFunction(id &function, RotoZoomData &data) { - id bufferResult = getPixelBuffer(); id commandBuffer = getCommandBuffer(); + if (commandBuffer == nil) { + return false; + } + id bufferResult = getPixelBuffer(); id bufferCopy = getPixelBufferCopy(); id blitCommandEncoder = [commandBuffer blitCommandEncoder]; [blitCommandEncoder setLabel:@"CopyDataToCopyBuffer"]; diff --git a/xLights/graphics/opengl/xlOGL3GraphicsContext.cpp b/xLights/graphics/opengl/xlOGL3GraphicsContext.cpp index a98a0354b3..9202ecf63a 100644 --- a/xLights/graphics/opengl/xlOGL3GraphicsContext.cpp +++ b/xLights/graphics/opengl/xlOGL3GraphicsContext.cpp @@ -1790,26 +1790,41 @@ class xlGLMesh : public xlMesh { LOG_GL_ERRORV(glGenBuffers(1, &indexBuffer)); - LOG_GL_ERRORV(glBindBuffer(GL_ARRAY_BUFFER, vbuffer)); - LOG_GL_ERRORV(glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], GL_STATIC_DRAW)); + if (vertices.size() > 0) + { + LOG_GL_ERRORV(glBindBuffer(GL_ARRAY_BUFFER, vbuffer)); + LOG_GL_ERRORV(glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], GL_STATIC_DRAW)); - LOG_GL_ERRORV(glBindBuffer(GL_ARRAY_BUFFER, tbuffer)); - LOG_GL_ERRORV(glBufferData(GL_ARRAY_BUFFER, tvertices.size() * sizeof(float), &tvertices[0], GL_STATIC_DRAW)); + LOG_GL_ERRORV(glBindBuffer(GL_ARRAY_BUFFER, tbuffer)); + LOG_GL_ERRORV(glBufferData(GL_ARRAY_BUFFER, tvertices.size() * sizeof(float), &tvertices[0], GL_STATIC_DRAW)); + } - LOG_GL_ERRORV(glBindBuffer(GL_ARRAY_BUFFER, nbuffer)); - LOG_GL_ERRORV(glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(float), &normals[0], GL_STATIC_DRAW)); + if (normals.size() > 0) + { + LOG_GL_ERRORV(glBindBuffer(GL_ARRAY_BUFFER, nbuffer)); + LOG_GL_ERRORV(glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(float), &normals[0], GL_STATIC_DRAW)); + } - LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, wfIndexes)); - LOG_GL_ERRORV(glBufferData(GL_ELEMENT_ARRAY_BUFFER, wireFrame.size() * sizeof(uint32_t), &wireFrame[0], GL_STATIC_DRAW)); - LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (wireFrame.size() > 0) + { + LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, wfIndexes)); + LOG_GL_ERRORV(glBufferData(GL_ELEMENT_ARRAY_BUFFER, wireFrame.size() * sizeof(uint32_t), &wireFrame[0], GL_STATIC_DRAW)); + LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } - LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexes)); - LOG_GL_ERRORV(glBufferData(GL_ELEMENT_ARRAY_BUFFER, lines.size() * sizeof(uint32_t), &lines[0], GL_STATIC_DRAW)); - LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (lines.size() > 0) + { + LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexes)); + LOG_GL_ERRORV(glBufferData(GL_ELEMENT_ARRAY_BUFFER, lines.size() * sizeof(uint32_t), &lines[0], GL_STATIC_DRAW)); + LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } - LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer)); - LOG_GL_ERRORV(glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexes.size() * sizeof(uint32_t), &indexes[0], GL_STATIC_DRAW)); - LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (indexes.size() > 0) + { + LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer)); + LOG_GL_ERRORV(glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexes.size() * sizeof(uint32_t), &indexes[0], GL_STATIC_DRAW)); + LOG_GL_ERRORV(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } } GLuint vbuffer = 0; diff --git a/xLights/models/ArchesModel.cpp b/xLights/models/ArchesModel.cpp index e5a55faa17..166647c4c2 100644 --- a/xLights/models/ArchesModel.cpp +++ b/xLights/models/ArchesModel.cpp @@ -122,9 +122,7 @@ int ArchesModel::OnPropertyGridChange(wxPropertyGridInterface* grid, wxPropertyG AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "ArchesModel::OnPropertyGridChange::ArchesCount"); AddASAPWork(OutputModelManager::WORK_MODELS_REWORK_STARTCHANNELS, "ArchesModel::OnPropertyGridChange::ArchesCount"); AddASAPWork(OutputModelManager::WORK_UPDATE_PROPERTYGRID, "ArchesModel::OnPropertyGridChange::ArchesCount"); - if (ModelXml->GetAttribute("Advanced", "0") == "1") { - AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "ArchesModel::OnPropertyGridChange::ArchesCount"); - } + AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "ArchesModel::OnPropertyGridChange::ArchesCount"); return 0; } else if ("ArchesNodes" == event.GetPropertyName()) { ModelXml->DeleteAttribute("parm2"); diff --git a/xLights/models/BaseObject.cpp b/xLights/models/BaseObject.cpp index 36295718d9..1539630a32 100644 --- a/xLights/models/BaseObject.cpp +++ b/xLights/models/BaseObject.cpp @@ -248,6 +248,15 @@ void BaseObject::FlipVertical(bool ignoreLock) { IncrementChangeCount(); } +static inline bool checkNameAttributes(wxXmlNode* nn, wxXmlNode* cc) { + if (nn->HasAttribute("name")) { + return (cc->GetAttribute("name") == nn->GetAttribute("name")); + } else if (nn->HasAttribute("Name")) { + return (cc->GetAttribute("Name") == nn->GetAttribute("Name")); + } + return true; +} + bool BaseObject::IsXmlChanged(wxXmlNode* n) const { for (wxXmlAttribute* a = n->GetAttributes(); a != nullptr; a = a->GetNext()) { @@ -263,7 +272,7 @@ bool BaseObject::IsXmlChanged(wxXmlNode* n) const for (wxXmlNode* nn = n->GetChildren(); nn != nullptr; nn = nn->GetNext()) { bool found = false; for (wxXmlNode* cc = ModelXml->GetChildren(); cc != nullptr; cc = cc->GetNext()) { - if (cc->GetName() == nn->GetName() && (!nn->HasAttribute("name") || (cc->GetAttribute("name") == nn->GetAttribute("name")))) { + if (cc->GetName() == nn->GetName() && checkNameAttributes(nn, cc)) { found = true; for (wxXmlAttribute* a = cc->GetAttributes(); a != nullptr; a = a->GetNext()) { if (!cc->HasAttribute(a->GetName()) || nn->GetAttribute(a->GetName()) != a->GetValue()) { diff --git a/xLights/models/CandyCaneModel.cpp b/xLights/models/CandyCaneModel.cpp index 3219ec42d5..0ba18ab25c 100644 --- a/xLights/models/CandyCaneModel.cpp +++ b/xLights/models/CandyCaneModel.cpp @@ -112,10 +112,8 @@ int CandyCaneModel::OnPropertyGridChange(wxPropertyGridInterface *grid, wxProper AddASAPWork(OutputModelManager::WORK_REDRAW_LAYOUTPREVIEW, "CandyCaneModel::OnPropertyGridChange::CandyCaneCount"); AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "CandyCaneModel::OnPropertyGridChange::CandyCaneCount"); AddASAPWork(OutputModelManager::WORK_MODELS_REWORK_STARTCHANNELS, "CandyCaneModel::OnPropertyGridChange::CandyCaneCount"); - AddASAPWork(OutputModelManager::WORK_UPDATE_PROPERTYGRID, "ArchesModel::OnPropertyGridChange::CandyCaneCount"); - if (ModelXml->GetAttribute("Advanced", "0") == "1") { - AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "CandyCaneModel::OnPropertyGridChange::CandyCaneCount"); - } + AddASAPWork(OutputModelManager::WORK_UPDATE_PROPERTYGRID, "CandyCaneModel::OnPropertyGridChange::CandyCaneCount"); + AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "CandyCaneModel::OnPropertyGridChange::CandyCaneCount"); return 0; } else if ("CandyCaneNodes" == event.GetPropertyName()) { ModelXml->DeleteAttribute("parm2"); @@ -211,21 +209,22 @@ bool CandyCaneModel::IsNodeFirst(int n) const return (GetIsLtoR() && n == 0) || (!GetIsLtoR() && n == Nodes.size() - parm2); } +// Canes are 3 high per width of each indivudual cane, then multiply by 2 because standard ThreePointLocation applies a / 2 for heights std::string CandyCaneModel::GetDimension() const { if (parm1 != 0) { - return GetModelScreenLocation().GetDimension(3.0 / parm1); + return GetModelScreenLocation().GetDimension(6.0 / parm1); } - return GetModelScreenLocation().GetDimension(1.0); + return GetModelScreenLocation().GetDimension(6.0); } void CandyCaneModel::AddDimensionProperties(wxPropertyGridInterface* grid) { if (parm1 != 0) { - GetModelScreenLocation().AddDimensionProperties(grid, 3.0 / parm1); + GetModelScreenLocation().AddDimensionProperties(grid, 6.0 / parm1); } else { - GetModelScreenLocation().AddDimensionProperties(grid, 1.0); + GetModelScreenLocation().AddDimensionProperties(grid, 6.0); } } diff --git a/xLights/models/CustomModel.cpp b/xLights/models/CustomModel.cpp index 4723a6c79f..a009af4d4d 100644 --- a/xLights/models/CustomModel.cpp +++ b/xLights/models/CustomModel.cpp @@ -106,6 +106,8 @@ class CustomModelProperty : public wxStringProperty void CustomModel::AddTypeProperties(wxPropertyGridInterface* grid, OutputManager* outputManager) { + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + wxPGProperty* p = grid->Append(new CustomModelProperty(this, outputManager, "Model Data", "CustomData", CLICK_TO_EDIT)); grid->LimitPropertyEditing(p); @@ -132,7 +134,7 @@ void CustomModel::AddTypeProperties(wxPropertyGridInterface* grid, OutputManager if (hasIndiv) { int c = _strings; - for (int x = 0; x < c; x++) { + for (int x = 0; x < c; ++x) { nm = StartNodeAttrName(x); std::string val = ModelXml->GetAttribute(nm, "").ToStdString(); if (val.empty()) { @@ -156,10 +158,17 @@ void CustomModel::AddTypeProperties(wxPropertyGridInterface* grid, OutputManager } } + wxStopWatch sw; p = grid->Append(new wxImageFileProperty("Background Image", "CustomBkgImage", custom_background)); - p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"); + + if (sw.Time() > 500) + logger_base.debug(" Adding background image property (%s) to model %s really slow: %lums", (const char*)custom_background.c_str(), (const char*)name.c_str(), sw.Time()); + + p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"); } int CustomModel::OnPropertyGridChange(wxPropertyGridInterface* grid, wxPropertyGridEvent& event) @@ -282,6 +291,9 @@ void CustomModel::UpdateModel(int width, int height, int depth, const std::strin void CustomModel::InitModel() { + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + wxStopWatch sw; + std::string customModel = ModelXml->GetAttribute("CustomModel").ToStdString(); InitCustomMatrix(customModel); //CopyBufCoord2ScreenCoord(); @@ -294,6 +306,11 @@ void CustomModel::InitModel() if (_depth > 1) { screenLocation.SetPerspective2D(0.1f); // if i dont do this you cant see the back nodes in 2D } + + if (sw.Time() > 5) + { + logger_base.debug("Custom model %s took %lums to initialise.", (const char*)name.c_str(), sw.Time()); + } } void CustomModel::SetCustomWidth(long w) diff --git a/xLights/models/DMX/DmxImage.cpp b/xLights/models/DMX/DmxImage.cpp index 5f2f5e5a16..eaad4344db 100644 --- a/xLights/models/DMX/DmxImage.cpp +++ b/xLights/models/DMX/DmxImage.cpp @@ -123,7 +123,9 @@ void DmxImage::AddTypeProperties(wxPropertyGridInterface *grid) { grid->Append(new wxPropertyCategory(base_name, base_name + "Properties")); wxPGProperty* prop = grid->Append(new wxImageFileProperty("Image", base_name + "Image", _imageFile)); - prop->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"); + prop->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"); prop = grid->Append(new wxFloatProperty("Offset X", base_name + "OffsetX", offset_x * OFFSET_SCALE)); prop->SetAttribute("Precision", 1); diff --git a/xLights/models/ImageModel.cpp b/xLights/models/ImageModel.cpp index 3f82a198db..50550acb8a 100644 --- a/xLights/models/ImageModel.cpp +++ b/xLights/models/ImageModel.cpp @@ -86,7 +86,9 @@ void ImageModel::AddTypeProperties(wxPropertyGridInterface* grid, OutputManager* wxPGProperty *p = grid->Append(new wxImageFileProperty("Image", "Image", _imageFile)); - p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"); + p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"); p = grid->Append(new wxUIntProperty("Off Brightness", "OffBrightness", _offBrightness)); p->SetAttribute("Min", 0); diff --git a/xLights/models/ImageObject.cpp b/xLights/models/ImageObject.cpp index 277d8f36a3..79a09483aa 100644 --- a/xLights/models/ImageObject.cpp +++ b/xLights/models/ImageObject.cpp @@ -57,7 +57,9 @@ void ImageObject::AddTypeProperties(wxPropertyGridInterface* grid, OutputManager wxPGProperty *p = grid->Append(new wxImageFileProperty("Image", "Image", _imageFile)); - p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"); + p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"); p = grid->Append(new wxUIntProperty("Transparency", "Transparency", transparency)); p->SetAttribute("Min", 0); diff --git a/xLights/models/MatrixModel.cpp b/xLights/models/MatrixModel.cpp index 915e304518..0a077bf720 100644 --- a/xLights/models/MatrixModel.cpp +++ b/xLights/models/MatrixModel.cpp @@ -97,13 +97,19 @@ void MatrixModel::AddStyleProperties(wxPropertyGridInterface *grid) { grid->Append(new wxEnumProperty("Direction", "MatrixStyle", MATRIX_STYLES, vMatrix ? 1 : 0)); wxPGProperty *p = grid->Append(new wxBoolProperty("Alternate Nodes", "AlternateNodes", _alternateNodes)); p->SetEditor("CheckBox"); + p->Enable(_noZig == false); + + p = grid->Append(new wxBoolProperty("Don't Zig Zag", "NoZig", _noZig)); + p->SetEditor("CheckBox"); + p->Enable(_alternateNodes == false); } -int MatrixModel::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEvent& event) { +int MatrixModel::OnPropertyGridChange(wxPropertyGridInterface* grid, wxPropertyGridEvent& event) +{ if ("MatrixStyle" == event.GetPropertyName()) { ModelXml->DeleteAttribute("DisplayAs"); ModelXml->AddAttribute("DisplayAs", event.GetPropertyValue().GetLong() ? "Vert Matrix" : "Horiz Matrix"); - //AdjustStringProperties(grid, parm1); + // AdjustStringProperties(grid, parm1); IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "MatrixModel::OnPropertyGridChange::MatrixStyle"); AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "MatrixModel::OnPropertyGridChange::MatrixStyle"); @@ -113,7 +119,7 @@ int MatrixModel::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyG } else if ("MatrixStringCount" == event.GetPropertyName()) { ModelXml->DeleteAttribute("parm1"); ModelXml->AddAttribute("parm1", wxString::Format("%d", (int)event.GetPropertyValue().GetLong())); - //AdjustStringProperties(grid, parm1); + // AdjustStringProperties(grid, parm1); IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "MatrixModel::OnPropertyGridChange::MatrixStringCount"); AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "MatrixModel::OnPropertyGridChange::MatrixStringCount"); @@ -163,6 +169,17 @@ int MatrixModel::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyG AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "TreeModel::OnPropertyGridChange::AlternateNodes"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "TreeModel::OnPropertyGridChange::AlternateNodes"); AddASAPWork(OutputModelManager::WORK_REDRAW_LAYOUTPREVIEW, "TreeModel::OnPropertyGridChange::AlternateNodes"); + grid->GetPropertyByName("NoZig")->Enable(event.GetPropertyValue().GetBool() == false); + return 0; + } else if (event.GetPropertyName() == "NoZig") { + ModelXml->DeleteAttribute("NoZig"); + ModelXml->AddAttribute("NoZig", event.GetPropertyValue().GetBool() ? "true" : "false"); + IncrementChangeCount(); + AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "TreeModel::OnPropertyGridChange::NoZig"); + AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "TreeModel::OnPropertyGridChange::NoZig"); + AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "TreeModel::OnPropertyGridChange::NoZig"); + AddASAPWork(OutputModelManager::WORK_REDRAW_LAYOUTPREVIEW, "TreeModel::OnPropertyGridChange::NoZig"); + grid->GetPropertyByName("AlternateNodes")->Enable(event.GetPropertyValue().GetBool() == false); return 0; } @@ -264,6 +281,7 @@ void MatrixModel::InitSingleChannelModel() void MatrixModel::InitModel() { _alternateNodes = (ModelXml->GetAttribute("AlternateNodes", "false") == "true"); + _noZig = (ModelXml->GetAttribute("NoZig", "false") == "true"); if (DisplayAs == "Vert Matrix") { InitVMatrix(); } else if (DisplayAs == "Horiz Matrix") { @@ -371,7 +389,12 @@ void MatrixModel::InitVMatrix(int firstExportStrand) } } } else { - Nodes[idx]->Coords[0].bufY = isBotToTop == (segmentnum % 2 == 0) ? y : PixelsPerStrand - y - 1; + if (_noZig) + { + Nodes[idx]->Coords[0].bufY = isBotToTop == true ? y : PixelsPerStrand - y - 1; + } else { + Nodes[idx]->Coords[0].bufY = isBotToTop == (segmentnum % 2 == 0) ? y : PixelsPerStrand - y - 1; + } } } } @@ -405,7 +428,12 @@ void MatrixModel::InitVMatrix(int firstExportStrand) } } } else { - Nodes[idx]->Coords[0].bufY = isBotToTop == (segmentnum % 2 == 0) ? y : PixelsPerStrand - y - 1; + if (_noZig) + { + Nodes[idx]->Coords[0].bufY = isBotToTop == true ? y : PixelsPerStrand - y - 1; + } else { + Nodes[idx]->Coords[0].bufY = isBotToTop == (segmentnum % 2 == 0) ? y : PixelsPerStrand - y - 1; + } } // before we adjust the buffer capture the screen coordinates for (size_t c = 0; c < GetCoordCount(idx); c++) { @@ -504,7 +532,12 @@ void MatrixModel::InitHMatrix() { } } } else { - Nodes[idx]->Coords[0].bufX = IsLtoR != (segmentnum % 2 == 0) ? PixelsPerStrand - x - 1 : x; + if (_noZig) + { + Nodes[idx]->Coords[0].bufX = IsLtoR != true ? PixelsPerStrand - x - 1 : x; + } else { + Nodes[idx]->Coords[0].bufX = IsLtoR != (segmentnum % 2 == 0) ? PixelsPerStrand - x - 1 : x; + } } } } @@ -540,7 +573,12 @@ void MatrixModel::InitHMatrix() { } } } else { - Nodes[idx]->Coords[0].bufX = IsLtoR != (segmentnum % 2 == 0) ? PixelsPerStrand - x - 1 : x; + if (_noZig) + { + Nodes[idx]->Coords[0].bufX = IsLtoR != true ? PixelsPerStrand - x - 1 : x; + } else { + Nodes[idx]->Coords[0].bufX = IsLtoR != (segmentnum % 2 == 0) ? PixelsPerStrand - x - 1 : x; + } } // before we adjust the buffer capture the screen coordinates for (size_t c = 0; c < GetCoordCount(idx); c++) { @@ -579,6 +617,7 @@ void MatrixModel::ExportXlightsModel() wxString nn = ModelXml->GetAttribute("NodeNames"); wxString da = ModelXml->GetAttribute("DisplayAs"); wxString an = ModelXml->GetAttribute("AlternateNodes", "false"); + wxString nz = ModelXml->GetAttribute("NoZig", "false"); wxString ld = ModelXml->GetAttribute("LowDefinition", "100"); wxString v = xlights_version_string; f.Write("\nGetAttribute("PixelType"); wxString psp = root->GetAttribute("PixelSpacing"); wxString an = root->GetAttribute("AlternateNodes"); + wxString nz = root->GetAttribute("NoZig"); wxString ld = root->GetAttribute("LowDefinition", "100"); // generally xmodels dont have these ... but there are some cases where we do where it would point to a shadow model ... in those cases we want to bring it in @@ -677,6 +718,7 @@ void MatrixModel::ImportXlightsModel(wxXmlNode* root, xLightsFrame* xlights, flo SetProperty("PixelType", pt); SetProperty("PixelSpacing", psp); SetProperty("AlternateNodes", an); + SetProperty("NoZig", nz); SetProperty("LowDefinition", ld); if (smf != "") { SetProperty("ShadowModelFor", smf); diff --git a/xLights/models/MatrixModel.h b/xLights/models/MatrixModel.h index a626bdbb88..53ca2a0a69 100644 --- a/xLights/models/MatrixModel.h +++ b/xLights/models/MatrixModel.h @@ -50,5 +50,6 @@ class MatrixModel : public ModelWithScreenLocation bool vMatrix = false; bool _alternateNodes = false; + bool _noZig = false; private: }; diff --git a/xLights/models/Model.cpp b/xLights/models/Model.cpp index 9de68035a4..f7e0ac39a9 100644 --- a/xLights/models/Model.cpp +++ b/xLights/models/Model.cpp @@ -8,53 +8,54 @@ * License: https://github.com/smeighan/xLights/blob/master/License.txt **************************************************************/ -#include -#include -#include -#include #include +#include #include +#include +#include #include +#include +#include #include -#include +#include "CachedFileDownloader.h" +#include "CustomModel.h" #include "Model.h" -#include "ModelManager.h" #include "ModelGroup.h" -#include "../xLightsApp.h" -#include "../xLightsMain.h" //for Preview and Other model collections -#include "../xLightsXmlFile.h" +#include "ModelManager.h" +#include "ModelScreenLocation.h" +#include "RulerObject.h" +#include "SubModel.h" #include "../Color.h" #include "../DimmingCurve.h" -#include "../StrandNodeNamesDialog.h" -#include "../ModelFaceDialog.h" -#include "../ModelStateDialog.h" +#include "../EditAliasesDialog.h" +#include "../ExternalHooks.h" #include "../ModelChainDialog.h" #include "../ModelDimmingCurveDialog.h" +#include "../ModelFaceDialog.h" +#include "../ModelPreview.h" +#include "../ModelStateDialog.h" +#include "../Pixels.h" #include "../StartChannelDialog.h" +#include "../StrandNodeNamesDialog.h" #include "../SubModelsDialog.h" -#include "../outputs/Output.h" -#include "../outputs/OutputManager.h" -#include "../outputs/IPOutput.h" -#include "../outputs/Controller.h" -#include "../outputs/ControllerSerial.h" -#include "../VendorModelDialog.h" -#include "../ModelPreview.h" -#include "ModelScreenLocation.h" -#include "SubModel.h" #include "../UtilFunctions.h" -#include "../xLightsVersion.h" +#include "../VendorModelDialog.h" #include "../controllers/ControllerCaps.h" -#include "../Pixels.h" -#include "../ExternalHooks.h" -#include "CustomModel.h" -#include "RulerObject.h" +#include "../outputs/Controller.h" +#include "../outputs/ControllerSerial.h" +#include "../outputs/IPOutput.h" +#include "../outputs/Output.h" +#include "../outputs/OutputManager.h" #include "../utils/ip_utils.h" +#include "../xLightsApp.h" +#include "../xLightsMain.h" //for Preview and Other model collections +#include "../xLightsVersion.h" +#include "../xLightsXmlFile.h" #include #include "../xSchedule/wxJSON/jsonreader.h" -#include "CachedFileDownloader.h" #include @@ -72,24 +73,25 @@ static const char* NODE_TYPE_VLUES[] = { "4 Channel RGBW", "4 Channel WRGB", "Strobes", "Single Color", "Single Color Intensity", "Superstring", "WRGB Nodes", "WRBG Nodes", "WGBR Nodes", "WGRB Nodes", "WBRG Nodes", "WBGR Nodes", "RGBW Nodes", - "RBGW Nodes", "GBRW Nodes", "GRBW Nodes", "BRGW Nodes", "BGRW Nodes" + "RBGW Nodes", "GBRW Nodes", "GRBW Nodes", "BRGW Nodes", "BGRW Nodes" }; static wxArrayString NODE_TYPES(26, NODE_TYPE_VLUES); -static const char *RGBW_HANDLING_VALUES[] = {"R=G=B -> W", "RGB Only", "White Only", "Advanced", "White On All"}; +static const char* RGBW_HANDLING_VALUES[] = { "R=G=B -> W", "RGB Only", "White Only", "Advanced", "White On All" }; static wxArrayString RGBW_HANDLING(5, RGBW_HANDLING_VALUES); -static const char *PIXEL_STYLES_VALUES[] = {"Square", "Smooth", "Solid Circle", "Blended Circle"}; +static const char* PIXEL_STYLES_VALUES[] = { "Square", "Smooth", "Solid Circle", "Blended Circle" }; static wxArrayString PIXEL_STYLES(4, PIXEL_STYLES_VALUES); -static const char *CONTROLLER_DIRECTION_VALUES[] = {"Forward", "Reverse"}; +static const char* CONTROLLER_DIRECTION_VALUES[] = { "Forward", "Reverse" }; static wxArrayString CONTROLLER_DIRECTION(2, CONTROLLER_DIRECTION_VALUES); -static const char *CONTROLLER_COLORORDER_VALUES[] = { +static const char* CONTROLLER_COLORORDER_VALUES[] = { "RGB", "RBG", "GBR", "GRB", "BRG", "BGR", "RGBW", "RBGW", "GBRW", "GRBW", "BRGW", "BGRW", - "WRGB", "WRBG", "WGBR", "WGRB", "WBRG", "WBGR"}; -static wxArrayString CONTROLLER_COLORORDER(18, CONTROLLER_COLORORDER_VALUES); + "WRGB", "WRBG", "WGBR", "WGRB", "WBRG", "WBGR" +}; +wxArrayString Model::CONTROLLER_COLORORDER(18, CONTROLLER_COLORORDER_VALUES); static wxArrayString LAYOUT_GROUPS; static wxArrayString CONTROLLERS; @@ -104,7 +106,7 @@ static const std::string HORIZ_PER_STRAND("Horizontal Per Strand"); static const std::string PER_PREVIEW_NO_OFFSET("Per Preview No Offset"); -const std::vector Model::DEFAULT_BUFFER_STYLES {DEFAULT, PER_PREVIEW, SINGLE_LINE, AS_PIXEL}; +const std::vector Model::DEFAULT_BUFFER_STYLES{ DEFAULT, PER_PREVIEW, SINGLE_LINE, AS_PIXEL }; static void clearUnusedProtocolProperties(wxXmlNode* node) { @@ -134,8 +136,8 @@ static const std::string MODEL_PREVIEW_CACHE_3D("ModelPreviewCache2D"); static const std::string LAYOUT_PREVIEW_CACHE_2D("LayoutPreviewCache3D"); static const std::string LAYOUT_PREVIEW_CACHE_3D("LayoutPreviewCache2D"); - -Model::Model(const ModelManager& manager) : modelManager(manager) +Model::Model(const ModelManager& manager) : + modelManager(manager) { } @@ -155,17 +157,17 @@ static const std::string CLICK_TO_EDIT("--Click To Edit--"); class StrandNodeNamesDialogAdapter : public wxPGEditorDialogAdapter { public: - StrandNodeNamesDialogAdapter(const Model* model) - : wxPGEditorDialogAdapter(), m_model(model) + StrandNodeNamesDialogAdapter(const Model* model) : + wxPGEditorDialogAdapter(), m_model(model) { } virtual bool DoShowDialog(wxPropertyGrid* propGrid, - wxPGProperty* WXUNUSED(property)) override + wxPGProperty* WXUNUSED(property)) override { StrandNodeNamesDialog dlg(propGrid); dlg.Setup(m_model, - m_model->GetModelXml()->GetAttribute("NodeNames").ToStdString(), - m_model->GetModelXml()->GetAttribute("StrandNames").ToStdString()); + m_model->GetModelXml()->GetAttribute("NodeNames").ToStdString(), + m_model->GetModelXml()->GetAttribute("StrandNames").ToStdString()); if (dlg.ShowModal() == wxID_OK) { m_model->GetModelXml()->DeleteAttribute("NodeNames"); m_model->GetModelXml()->DeleteAttribute("StrandNames"); @@ -177,6 +179,7 @@ class StrandNodeNamesDialogAdapter : public wxPGEditorDialogAdapter } return false; } + protected: const Model* m_model; }; @@ -189,7 +192,7 @@ class FacesDialogAdapter : public wxPGEditorDialogAdapter { } virtual bool DoShowDialog(wxPropertyGrid* propGrid, - wxPGProperty* WXUNUSED(property)) override + wxPGProperty* WXUNUSED(property)) override { ModelFaceDialog dlg(propGrid, _outputManager); dlg.SetFaceInfo(m_model, m_model->faceInfo); @@ -202,20 +205,44 @@ class FacesDialogAdapter : public wxPGEditorDialogAdapter } return false; } + protected: Model* m_model = nullptr; OutputManager* _outputManager = nullptr; }; +class AliasDialogAdapter : public wxPGEditorDialogAdapter +{ +public: + AliasDialogAdapter(Model* model) : + wxPGEditorDialogAdapter(), m_model(model) + { + } + virtual bool DoShowDialog(wxPropertyGrid* propGrid, + wxPGProperty* WXUNUSED(property)) override + { + EditAliasesDialog dlg(propGrid, m_model); + if (dlg.ShowModal() == wxID_OK) { + wxVariant v(CLICK_TO_EDIT); + SetValue(v); + return true; + } + return false; + } + +protected: + Model* m_model = nullptr; +}; + class StatesDialogAdapter : public wxPGEditorDialogAdapter { public: - StatesDialogAdapter(Model* model, OutputManager* om) - : wxPGEditorDialogAdapter(), m_model(model), _outputManager(om) + StatesDialogAdapter(Model* model, OutputManager* om) : + wxPGEditorDialogAdapter(), m_model(model), _outputManager(om) { } virtual bool DoShowDialog(wxPropertyGrid* propGrid, - wxPGProperty* WXUNUSED(property)) override + wxPGProperty* WXUNUSED(property)) override { ModelStateDialog dlg(propGrid, _outputManager); dlg.SetStateInfo(m_model, m_model->stateInfo); @@ -228,14 +255,15 @@ class StatesDialogAdapter : public wxPGEditorDialogAdapter } return false; } + protected: Model* m_model = nullptr; OutputManager* _outputManager = nullptr; }; -std::map > Model::GetDimmingInfo() const +std::map> Model::GetDimmingInfo() const { - std::map > dimmingInfo; + std::map> dimmingInfo; wxXmlNode* f = GetModelXml()->GetChildren(); while (f != nullptr) { if ("dimmingCurve" == f->GetName()) { @@ -259,15 +287,17 @@ std::map > Model::GetDimmingInfo class DimmingCurveDialogAdapter : public wxPGEditorDialogAdapter { public: - DimmingCurveDialogAdapter(const Model *model) - : wxPGEditorDialogAdapter(), m_model(model) { + DimmingCurveDialogAdapter(const Model* model) : + wxPGEditorDialogAdapter(), m_model(model) + { } virtual bool DoShowDialog(wxPropertyGrid* propGrid, - wxPGProperty* WXUNUSED(property) ) override { + wxPGProperty* WXUNUSED(property)) override + { ModelDimmingCurveDialog dlg(propGrid); auto dimmingInfo = m_model->GetDimmingInfo(); - if(dimmingInfo.empty()) { - wxString b = m_model->GetModelXml()->GetAttribute("ModelBrightness","0"); + if (dimmingInfo.empty()) { + wxString b = m_model->GetModelXml()->GetAttribute("ModelBrightness", "0"); if (b.empty()) { b = "0"; } @@ -278,7 +308,7 @@ class DimmingCurveDialogAdapter : public wxPGEditorDialogAdapter if (dlg.ShowModal() == wxID_OK) { dimmingInfo.clear(); dlg.Update(dimmingInfo); - wxXmlNode *f1 = m_model->GetModelXml()->GetChildren(); + wxXmlNode* f1 = m_model->GetModelXml()->GetChildren(); while (f1 != nullptr) { if ("dimmingCurve" == f1->GetName()) { m_model->GetModelXml()->RemoveChild(f1); @@ -288,10 +318,10 @@ class DimmingCurveDialogAdapter : public wxPGEditorDialogAdapter f1 = f1->GetNext(); } } - f1 = new wxXmlNode(wxXML_ELEMENT_NODE , "dimmingCurve"); + f1 = new wxXmlNode(wxXML_ELEMENT_NODE, "dimmingCurve"); m_model->GetModelXml()->AddChild(f1); for (const auto& it : dimmingInfo) { - wxXmlNode *dc = new wxXmlNode(wxXML_ELEMENT_NODE , it.first); + wxXmlNode* dc = new wxXmlNode(wxXML_ELEMENT_NODE, it.first); f1->AddChild(dc); for (const auto& it2 : it.second) { dc->AddAttribute(it2.first, it2.second); @@ -303,18 +333,20 @@ class DimmingCurveDialogAdapter : public wxPGEditorDialogAdapter } return false; } + protected: - const Model *m_model; + const Model* m_model; }; class SubModelsDialogAdapter : public wxPGEditorDialogAdapter { public: - SubModelsDialogAdapter(Model *model, OutputManager* om) : + SubModelsDialogAdapter(Model* model, OutputManager* om) : wxPGEditorDialogAdapter(), m_model(model), _outputManager(om) { } virtual bool DoShowDialog(wxPropertyGrid* propGrid, - wxPGProperty* WXUNUSED(property) ) override { + wxPGProperty* WXUNUSED(property)) override + { SubModelsDialog dlg(propGrid, _outputManager); dlg.Setup(m_model); if (dlg.ShowModal() == wxID_OK) { @@ -323,7 +355,7 @@ class SubModelsDialogAdapter : public wxPGEditorDialogAdapter SetValue(v); return true; } - if (dlg.ReloadLayout) {//force grid to reload + if (dlg.ReloadLayout) { // force grid to reload wxCommandEvent eventForceRefresh(EVT_FORCE_SEQUENCER_REFRESH); wxPostEvent(m_model->GetModelManager().GetXLightsFrame(), eventForceRefresh); m_model->AddASAPWork(OutputModelManager::WORK_RELOAD_ALLMODELS, "Model::SubModelsDialog::SubModels"); @@ -332,19 +364,22 @@ class SubModelsDialogAdapter : public wxPGEditorDialogAdapter } return false; } + protected: - Model *m_model = nullptr; + Model* m_model = nullptr; OutputManager* _outputManager = nullptr; }; class ModelChainDialogAdapter : public wxPGEditorDialogAdapter { public: - ModelChainDialogAdapter(Model *model) - : wxPGEditorDialogAdapter(), m_model(model) { + ModelChainDialogAdapter(Model* model) : + wxPGEditorDialogAdapter(), m_model(model) + { } virtual bool DoShowDialog(wxPropertyGrid* propGrid, - wxPGProperty* property) override { + wxPGProperty* property) override + { ModelChainDialog dlg(propGrid); dlg.Set(m_model, m_model->GetModelManager()); if (dlg.ShowModal() == wxID_OK) { @@ -354,14 +389,15 @@ class ModelChainDialogAdapter : public wxPGEditorDialogAdapter } return false; } + protected: - Model *m_model; + Model* m_model = nullptr; }; class PopupDialogProperty : public wxStringProperty { public: - PopupDialogProperty(Model *m, + PopupDialogProperty(Model* m, OutputManager* om, const wxString& label, const wxString& name, @@ -371,11 +407,13 @@ class PopupDialogProperty : public wxStringProperty { } // Set editor to have button - virtual const wxPGEditor* DoGetEditorClass() const override { + virtual const wxPGEditor* DoGetEditorClass() const override + { return wxPGEditor_TextCtrlAndButton; } // Set what happens on button click - virtual wxPGEditorDialogAdapter* GetEditorDialog() const override { + virtual wxPGEditorDialogAdapter* GetEditorDialog() const override + { switch (m_tp) { case 1: return new StrandNodeNamesDialogAdapter(m_model); @@ -387,25 +425,30 @@ class PopupDialogProperty : public wxStringProperty return new StatesDialogAdapter(m_model, _outputManager); case 5: return new SubModelsDialogAdapter(m_model, _outputManager); + case 6: + return new AliasDialogAdapter(m_model); default: break; } return nullptr; } + protected: - Model *m_model = nullptr; + Model* m_model = nullptr; OutputManager* _outputManager = nullptr; - int m_tp; + int m_tp = 0; }; class StartChannelDialogAdapter : public wxPGEditorDialogAdapter { public: - StartChannelDialogAdapter(Model *model, std::string preview) - : wxPGEditorDialogAdapter(), m_model(model), _preview(preview) { + StartChannelDialogAdapter(Model* model, std::string preview) : + wxPGEditorDialogAdapter(), m_model(model), _preview(preview) + { } virtual bool DoShowDialog(wxPropertyGrid* propGrid, - wxPGProperty* property) override { + wxPGProperty* property) override + { StartChannelDialog dlg(propGrid); dlg.Set(property->GetValue().GetString(), m_model->GetModelManager(), _preview, m_model); if (dlg.ShowModal() == wxID_OK) { @@ -415,8 +458,9 @@ class StartChannelDialogAdapter : public wxPGEditorDialogAdapter } return false; } + protected: - Model *m_model = nullptr; + Model* m_model = nullptr; std::string _preview; }; @@ -454,22 +498,26 @@ class StartChannelProperty : public wxStringProperty class ModelChainProperty : public wxStringProperty { public: - ModelChainProperty(Model *m, - const wxString& label, - const wxString& name, - const wxString& value) - : wxStringProperty(label, name, value), m_model(m) { + ModelChainProperty(Model* m, + const wxString& label, + const wxString& name, + const wxString& value) : + wxStringProperty(label, name, value), m_model(m) + { } // Set editor to have button - virtual const wxPGEditor* DoGetEditorClass() const override { + virtual const wxPGEditor* DoGetEditorClass() const override + { return wxPGEditor_TextCtrlAndButton; } // Set what happens on button click - virtual wxPGEditorDialogAdapter* GetEditorDialog() const override { + virtual wxPGEditorDialogAdapter* GetEditorDialog() const override + { return new ModelChainDialogAdapter(m_model); } + protected: - Model *m_model = nullptr; + Model* m_model = nullptr; }; wxArrayString Model::GetLayoutGroups(const ModelManager& mm) @@ -480,13 +528,10 @@ wxArrayString Model::GetLayoutGroups(const ModelManager& mm) lg.push_back("Unassigned"); wxXmlNode* layouts_node = mm.GetLayoutsNode(); - for (wxXmlNode* e = layouts_node->GetChildren(); e != nullptr; e = e->GetNext()) - { - if (e->GetName() == "layoutGroup") - { + for (wxXmlNode* e = layouts_node->GetChildren(); e != nullptr; e = e->GetNext()) { + if (e->GetName() == "layoutGroup") { wxString grp_name = e->GetAttribute("name"); - if (!grp_name.IsEmpty()) - { + if (!grp_name.IsEmpty()) { lg.push_back(grp_name.ToStdString()); } } @@ -495,16 +540,27 @@ wxArrayString Model::GetLayoutGroups(const ModelManager& mm) return lg; } -void Model::Rename(std::string const& newName) { +void Model::Rename(std::string const& newName) +{ + auto oldname = ModelXml->GetAttribute("name", ""); + name = Trim(newName); ModelXml->DeleteAttribute("name"); ModelXml->AddAttribute("name", name); + + if (oldname != "") { + if (wxMessageBox("Would you like to save the old name as an alias for this prop. This could be useful if you have sequences already sequenced against this prop using the old name.", "Save old name as alias", wxYES_NO | wxICON_QUESTION, GetModelManager().GetXLightsFrame()) == wxYES) { + AddAlias("oldname:" + oldname); + } + } } -void Model::SetStartChannel(std::string const& startChannel) { - //wxASSERT(!StartsWith(startChannel, "!:")); +void Model::SetStartChannel(std::string const& startChannel) +{ + // wxASSERT(!StartsWith(startChannel, "!:")); - if (startChannel == ModelXml->GetAttribute("StartChannel", "xyzzy_kw")) return; + if (startChannel == ModelXml->GetAttribute("StartChannel", "xyzzy_kw")) + return; ModelXml->DeleteAttribute("StartChannel"); ModelXml->AddAttribute("StartChannel", startChannel); @@ -517,25 +573,22 @@ void Model::SetStartChannel(std::string const& startChannel) { IncrementChangeCount(); } -void Model::SetProperty(wxString const& property, wxString const& value, bool apply) { - if (ModelXml->HasAttribute(property)) - { +void Model::SetProperty(wxString const& property, wxString const& value, bool apply) +{ + if (ModelXml->HasAttribute(property)) { ModelXml->DeleteAttribute(property); ModelXml->AddAttribute(property, value); - } - else - { + } else { ModelXml->AddAttribute(property, value); } - if (apply) - { + if (apply) { modelManager.GetXLightsFrame()->AbortRender(); SetFromXml(ModelXml); } } -void Model::UpdateProperties(wxPropertyGridInterface* grid, OutputManager* outputManager) { - +void Model::UpdateProperties(wxPropertyGridInterface* grid, OutputManager* outputManager) +{ UpdateTypeProperties(grid); if (grid->GetPropertyByName("Controller") != nullptr) { @@ -544,14 +597,12 @@ void Model::UpdateProperties(wxPropertyGridInterface* grid, OutputManager* outpu if (HasOneString(DisplayAs) && grid->GetPropertyByName("ModelStartChannel") != nullptr) { grid->GetPropertyByName("ModelStartChannel")->Enable(GetControllerName() == "" || _controller == 0); - } - else { + } else { if (grid->GetPropertyByName("ModelIndividualStartChannels") != nullptr) { grid->GetPropertyByName("ModelIndividualStartChannels")->Enable(parm1 > 1 && (GetControllerName() == "" || _controller == 0)); if (parm1 > 1 && (GetControllerName() != "" && _controller != 0)) { grid->GetPropertyByName("ModelIndividualStartChannels")->SetHelpString("Individual start channels cannot be set if you have assigned a model to a controller rather than using start channels."); - } - else { + } else { grid->GetPropertyByName("ModelIndividualStartChannels")->SetHelpString(""); } } @@ -574,12 +625,10 @@ void Model::UpdateProperties(wxPropertyGridInterface* grid, OutputManager* outpu } if (NODE_TYPES[i] == "Node Single Color") { grid->GetPropertyByName("ModelStringType")->SetHelpString("This represents a string of single color LEDS which are individually controlled. These are very uncommon."); - } - else { + } else { grid->GetPropertyByName("ModelStringType")->SetHelpString(""); } - } - else { + } else { if (grid->GetPropertyByName("ModelStringColor") != nullptr) { grid->GetPropertyByName("ModelStringColor")->Enable(false); } @@ -593,7 +642,8 @@ void Model::UpdateProperties(wxPropertyGridInterface* grid, OutputManager* outpu void Model::ColourClashingChains(wxPGProperty* p) { - if (p == nullptr) return; + if (p == nullptr) + return; std::string tip; if (GetControllerName() != "" && _controller != 0 && GetControllerProtocol() != "" && GetControllerPort() != 0 && p->IsEnabled()) { @@ -614,7 +664,7 @@ uint32_t Model::ApplyLowDefinition(uint32_t val) const { if (_lowDefFactor == 100 || !SupportsLowDefinitionRender() || !GetModelManager().GetXLightsFrame()->IsLowDefinitionRender()) return val; - return (val * _lowDefFactor) / 100; + return (val * _lowDefFactor) / 100; } std::string Model::GetPixelStyleDescription(PIXEL_STYLE pixelStyle) @@ -630,10 +680,10 @@ int Model::GetNumPhysicalStrings() const int ts = GetSmartTs(); if (ts <= 1) { return parm1; - } - else { + } else { int strings = parm1 / ts; - if (strings == 0) strings = 1; + if (strings == 0) + strings = 1; return strings; } } @@ -641,7 +691,8 @@ int Model::GetNumPhysicalStrings() const ControllerCaps* Model::GetControllerCaps() const { auto c = GetController(); - if (c == nullptr) return nullptr; + if (c == nullptr) + return nullptr; return c->GetControllerCaps(); } @@ -655,18 +706,109 @@ Controller* Model::GetController() const } if (controller == "") { int32_t start; - Controller *cp = modelManager.GetXLightsFrame()->GetOutputManager()->GetController(GetFirstChannel() + 1, start); + Controller* cp = modelManager.GetXLightsFrame()->GetOutputManager()->GetController(GetFirstChannel() + 1, start); if (cp != nullptr) { return cp; } } - if (controller == "") return nullptr; + if (controller == "") + return nullptr; return modelManager.GetXLightsFrame()->GetOutputManager()->GetController(controller); } +bool Model::IsAlias(const std::string& alias, bool oldnameOnly) const +{ + for (auto x = ModelXml->GetChildren(); x != nullptr; x = x->GetNext()) { + if (x->GetName() == "Aliases") { + for (auto xx = x->GetChildren(); xx != nullptr; xx = xx->GetNext()) { + if ((!oldnameOnly && Lower(alias) == xx->GetAttribute("name").Lower()) || Lower("oldname:" + alias) == xx->GetAttribute("name").Lower()) { + return true; + } + } + } + } + return false; +} + +void Model::AddAlias(const std::string& alias) +{ + if (IsAlias(alias)) + return; + for (auto x = ModelXml->GetChildren(); x != nullptr; x = x->GetNext()) { + if (x->GetName() == "Aliases") { + auto n = new wxXmlNode(wxXmlNodeType::wxXML_ELEMENT_NODE, "alias"); + n->AddAttribute("name", Lower(alias)); + x->AddChild(n); + IncrementChangeCount(); + return; + } + } + auto aliases = new wxXmlNode(wxXmlNodeType::wxXML_ELEMENT_NODE, "Aliases"); + auto n = new wxXmlNode(wxXmlNodeType::wxXML_ELEMENT_NODE, "alias"); + n->AddAttribute("name", Lower(alias)); + aliases->AddChild(n); + IncrementChangeCount(); + + ModelXml->AddChild(aliases); +} + +void Model::DeleteAlias(const std::string& alias) +{ + while (IsAlias(alias)) { // while should not be required ... but just in case it ever ends up there more than once + for (auto x = ModelXml->GetChildren(); x != nullptr; x = x->GetNext()) { + if (x->GetName() == "Aliases") { + for (auto xx = x->GetChildren(); xx != nullptr; xx = xx->GetNext()) { + if (Lower(alias) == xx->GetContent().Lower()) { + x->RemoveChild(xx); + IncrementChangeCount(); + return; + } + } + } + } + } +} + +std::list Model::GetAliases() const +{ + std::list aliases; + + for (auto x = ModelXml->GetChildren(); x != nullptr; x = x->GetNext()) { + if (x->GetName() == "Aliases") { + for (auto xx = x->GetChildren(); xx != nullptr; xx = xx->GetNext()) { + aliases.push_back(xx->GetAttribute("name")); + } + } + } + + return aliases; +} + +void Model::SetAliases(std::list& aliases) +{ + AddAlias("dummy"); // this ensures the owning element exists + + for (auto x = ModelXml->GetChildren(); x != nullptr; x = x->GetNext()) { + if (x->GetName() == "Aliases") { + while (x->GetChildren() != nullptr) + x->RemoveChild(x->GetChildren()); + + for (const auto& it : aliases) { + auto n = new wxXmlNode(wxXmlNodeType::wxXML_ELEMENT_NODE, "alias"); + n->AddAttribute("name", Lower(it)); + x->AddChild(n); + } + } + } + IncrementChangeCount(); +} + void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputManager) { + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + wxStopWatch sw; + LAYOUT_GROUPS = Model::GetLayoutGroups(modelManager); wxPGProperty* sp; @@ -707,16 +849,14 @@ void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputMa if (HasOneString(DisplayAs)) { p = grid->Append(new StartChannelProperty(this, 0, "Start Channel", "ModelStartChannel", ModelXml->GetAttribute("StartChannel", "1"), modelManager.GetXLightsFrame()->GetSelectedLayoutPanelPreview())); p->Enable(GetControllerName() == "" || _controller == 0); - } - else { + } else { bool hasIndiv = ModelXml->GetAttribute("Advanced", "0") == "1"; p = grid->Append(new wxBoolProperty("Indiv Start Chans", "ModelIndividualStartChannels", hasIndiv)); p->SetAttribute("UseCheckbox", true); p->Enable(parm1 > 1 && (GetControllerName() == "" || _controller == 0)); if (parm1 > 1 && (GetControllerName() != "" && _controller != 0)) { p->SetHelpString("Individual start channels cannot be set if you have assigned a model to a controller rather than using start channels."); - } - else { + } else { p->SetHelpString(""); } sp = grid->AppendIn(p, new StartChannelProperty(this, 0, "Start Channel", "ModelStartChannel", ModelXml->GetAttribute("StartChannel", "1"), modelManager.GetXLightsFrame()->GetSelectedLayoutPanelPreview())); @@ -734,13 +874,11 @@ void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputMa if (x == 0) { sp->SetLabel(nm); sp->SetValue(val); - } - else { + } else { sp = grid->AppendIn(p, new StartChannelProperty(this, x, nm, nm, val, modelManager.GetXLightsFrame()->GetSelectedLayoutPanelPreview())); } } - } - else { + } else { // remove per strand start channels if individual isnt selected for (uint32_t x = 0; x < MOST_STRINGS_WE_EXPECT; ++x) { wxString nm = StartChanAttrName(x); @@ -772,7 +910,7 @@ void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputMa grid->Append(new wxEnumProperty("Shadow Model For", "ShadowModelFor", OTHERMODELLIST, wxArrayInt(), shadowModelFor)); int layout_group_number = 0; - for (int grp = 0; grp < LAYOUT_GROUPS.Count(); grp++) { + for (int grp = 0; grp < LAYOUT_GROUPS.Count(); ++grp) { if (LAYOUT_GROUPS[grp] == layout_group) { layout_group_number = grp; break; @@ -792,6 +930,9 @@ void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputMa grid->LimitPropertyEditing(p); p = grid->Append(new PopupDialogProperty(this, outputManager, "SubModels", "SubModels", CLICK_TO_EDIT, 5)); grid->LimitPropertyEditing(p); + p = grid->Append(new PopupDialogProperty(this, outputManager, "Aliases", "Aliases", CLICK_TO_EDIT, 6)); + grid->LimitPropertyEditing(p); + p->SetHelpString("Aliases are used in mapping to provide alternate names for this model which might match a model in a sequence you are importing from. To use it use the Auto Map button."); auto modelGroups = modelManager.GetGroupsContainingModel(this); if (modelGroups.size() > 0) { @@ -820,32 +961,26 @@ void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputMa } grid->AppendIn(p, new wxEnumProperty("String Type", "ModelStringType", NODE_TYPES, wxArrayInt(), i)); if (NODE_TYPES[i] == "Single Color" || NODE_TYPES[i] == "Single Color Intensity" || NODE_TYPES[i] == "Node Single Color") { - //get the color + // get the color wxColor v; if (StringType == "Single Color Red") { v = *wxRED; - } - else if (StringType == "Single Color Green" || StringType == "G") { + } else if (StringType == "Single Color Green" || StringType == "G") { v = *wxGREEN; - } - else if (StringType == "Single Color Blue" || StringType == "B") { + } else if (StringType == "Single Color Blue" || StringType == "B") { v = *wxBLUE; - } - else if (StringType == "Single Color White" || StringType == "W") { + } else if (StringType == "Single Color White" || StringType == "W") { v = *wxWHITE; - } - else if (StringType == "Single Color Custom" || StringType == "Single Color Intensity" || StringType == "Node Single Color") { + } else if (StringType == "Single Color Custom" || StringType == "Single Color Intensity" || StringType == "Node Single Color") { v = customColor.asWxColor(); - } - else if (StringType[0] == '#') { + } else if (StringType[0] == '#') { v = xlColor(StringType).asWxColor(); } grid->AppendIn(p, new wxColourProperty("Color", "ModelStringColor", v)); if (NODE_TYPES[i] == "Node Single Color") { grid->GetPropertyByName("ModelStringType")->SetHelpString("This represents a string of single color LEDS which are individually controlled. These are very uncommon."); } - } - else if (NODE_TYPES[i] == "Superstring") { + } else if (NODE_TYPES[i] == "Superstring") { if (superStringColours.size() == 0) { superStringColours.push_back(xlRED); SaveSuperStringColours(); @@ -857,8 +992,7 @@ void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputMa for (int i = 0; i < superStringColours.size(); ++i) { grid->AppendIn(p, new wxColourProperty(wxString::Format("Colour %d", i + 1), wxString::Format("SuperStringColour%d", i), superStringColours[i].asWxColor())); } - } - else { + } else { sp = grid->AppendIn(p, new wxColourProperty("Color", "ModelStringColor", *wxRED)); sp->Enable(false); } @@ -887,12 +1021,16 @@ void Model::AddProperties(wxPropertyGridInterface* grid, OutputManager* outputMa grid->AppendIn(p, new wxColourProperty("Tag Color", "ModelTagColour", modelTagColour)); UpdateControllerProperties(grid); DisableUnusedProperties(grid); + + if (sw.Time() > 500) + logger_base.debug(" Model::AddProperties took %lums", sw.Time()); } void Model::ClearIndividualStartChannels() { // dont clear custom models - if (IsCustom()) return; + if (IsCustom()) + return; ModelXml->DeleteAttribute("Advanced"); // remove per strand start channels if individual isnt selected @@ -905,10 +1043,10 @@ void Model::ClearIndividualStartChannels() void Model::GetControllerProtocols(wxArrayString& cp, int& idx) { auto caps = GetControllerCaps(); - Controller *c = GetController(); + Controller* c = GetController(); wxString protocol = GetControllerProtocol(); if (c) { - ControllerSerial *cs = dynamic_cast(c); + ControllerSerial* cs = dynamic_cast(c); if (cs) { wxString cprotocol = cs->GetProtocol(); if (cprotocol != protocol) { @@ -947,7 +1085,8 @@ void Model::GetControllerProtocols(wxArrayString& cp, int& idx) np = ChooseBestControllerSerial(controllerProtocols, protocol); } } - if (protocol != np) SetControllerProtocol(np); + if (protocol != np) + SetControllerProtocol(np); } // now work out the index @@ -964,8 +1103,8 @@ void Model::GetControllerProtocols(wxArrayString& cp, int& idx) wxArrayString Model::GetSmartRemoteValues(int smartRemoteCount) { wxArrayString res; - //res.push_back("None"); - for (int i = 0; i < smartRemoteCount; i++) { + // res.push_back("None"); + for (int i = 0; i < smartRemoteCount; ++i) { res.push_back(wxString((char)(65 + i))); } return res; @@ -973,7 +1112,6 @@ wxArrayString Model::GetSmartRemoteValues(int smartRemoteCount) void Model::AddControllerProperties(wxPropertyGridInterface* grid) { - auto caps = GetControllerCaps(); wxString protocol = GetControllerProtocol(); @@ -1008,8 +1146,7 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) if (caps != nullptr) { smartRemoteCount = caps->GetSmartRemoteCount(); } - if (smartRemoteCount != 0) - { + if (smartRemoteCount != 0) { int sr = GetSmartRemote(); sp = grid->AppendIn(p, new wxBoolProperty("Use Smart Remote", "UseSmartRemote", sr)); @@ -1025,8 +1162,7 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) srlist.Add(typ); } grid->AppendIn(p, new wxEnumProperty("Smart Remote Type", "SmartRemoteType", srlist, wxArrayInt(), GetSmartRemoteTypeIndex(GetSmartRemoteType()))); - } - else { + } else { std::string type = GetSmartRemoteType(); auto smt = grid->AppendIn(p, new wxStringProperty("Smart Remote Type", "SmartRemoteType", type)); smt->ChangeFlag(wxPG_PROP_READONLY, true); @@ -1035,10 +1171,9 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) } wxArrayString srv = GetSmartRemoteValues(smartRemoteCount); - grid->AppendIn(p, new wxEnumProperty("Smart Remote", "SmartRemote", srv, wxArrayInt(), sr-1)); + grid->AppendIn(p, new wxEnumProperty("Smart Remote", "SmartRemote", srv, wxArrayInt(), sr - 1)); - if (GetNumPhysicalStrings() > 1 ) - { + if (GetNumPhysicalStrings() > 1) { sp = grid->AppendIn(p, new wxUIntProperty("Max Cascade Remotes", "MaxCascadeRemotes", GetSRMaxCascade())); sp->SetAttribute("Min", 1); sp->SetAttribute("Max", smartRemoteCount); @@ -1067,18 +1202,16 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) sp->SetAttribute("Min", 1); if (caps == nullptr) { sp->SetAttribute("Max", 512); - } - else { + } else { sp->SetAttribute("Max", caps->GetMaxSerialPortChannels()); } sp->SetEditor("SpinCtrl"); } else if (IsPixelProtocol()) { - if (caps == nullptr || caps->SupportsPixelPortNullPixels()) { sp = grid->AppendIn(p, new wxBoolProperty("Set Start Null Pixels", "ModelControllerConnectionPixelSetNullNodes", node->HasAttribute("nullNodes"))); sp->SetAttribute("UseCheckbox", true); auto sp2 = grid->AppendIn(sp, new wxUIntProperty("Start Null Pixels", "ModelControllerConnectionPixelNullNodes", - wxAtoi(GetControllerConnection()->GetAttribute("nullNodes", "0")))); + wxAtoi(GetControllerConnection()->GetAttribute("nullNodes", "0")))); sp2->SetAttribute("Min", 0); sp2->SetAttribute("Max", 100); sp2->SetEditor("SpinCtrl"); @@ -1092,7 +1225,7 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) sp = grid->AppendIn(p, new wxBoolProperty("Set End Null Pixels", "ModelControllerConnectionPixelSetEndNullNodes", node->HasAttribute("endNullNodes"))); sp->SetAttribute("UseCheckbox", true); auto sp2 = grid->AppendIn(sp, new wxUIntProperty("End Null Pixels", "ModelControllerConnectionPixelEndNullNodes", - wxAtoi(GetControllerConnection()->GetAttribute("endNullNodes", "0")))); + wxAtoi(GetControllerConnection()->GetAttribute("endNullNodes", "0")))); sp2->SetAttribute("Min", 0); sp2->SetAttribute("Max", 100); sp2->SetEditor("SpinCtrl"); @@ -1106,7 +1239,7 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) sp = grid->AppendIn(p, new wxBoolProperty("Set Brightness", "ModelControllerConnectionPixelSetBrightness", node->HasAttribute("brightness"))); sp->SetAttribute("UseCheckbox", true); auto sp2 = grid->AppendIn(sp, new wxUIntProperty("Brightness", "ModelControllerConnectionPixelBrightness", - wxAtoi(GetControllerConnection()->GetAttribute("brightness", "100")))); + wxAtoi(GetControllerConnection()->GetAttribute("brightness", "100")))); sp2->SetAttribute("Min", 0); sp2->SetAttribute("Max", 100); sp2->SetEditor("SpinCtrl"); @@ -1147,7 +1280,7 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) sp = grid->AppendIn(p, new wxBoolProperty("Set Pixel Direction", "ModelControllerConnectionPixelSetDirection", node->HasAttribute("reverse"))); sp->SetAttribute("UseCheckbox", true); auto sp2 = grid->AppendIn(sp, new wxEnumProperty("Direction", "ModelControllerConnectionPixelDirection", CONTROLLER_DIRECTION, wxArrayInt(), - wxAtoi(GetControllerConnection()->GetAttribute("reverse", "0")))); + wxAtoi(GetControllerConnection()->GetAttribute("reverse", "0")))); if (!node->HasAttribute("reverse")) { grid->DisableProperty(sp2); grid->Collapse(sp); @@ -1186,7 +1319,7 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) sp = grid->AppendIn(p, new wxBoolProperty("Set Smart Ts", "ModelControllerConnectionPixelSetTs", node->HasAttribute("ts"))); sp->SetAttribute("UseCheckbox", true); auto sp2 = grid->AppendIn(sp, new wxUIntProperty("Smart Ts", "ModelControllerConnectionPixelTs", - GetSmartTs())); + GetSmartTs())); sp2->SetAttribute("Min", 0); sp2->SetAttribute("Max", 20); sp2->SetEditor("SpinCtrl"); @@ -1198,8 +1331,8 @@ void Model::AddControllerProperties(wxPropertyGridInterface* grid) } } -void Model::UpdateControllerProperties(wxPropertyGridInterface* grid) { - +void Model::UpdateControllerProperties(wxPropertyGridInterface* grid) +{ auto caps = GetControllerCaps(); auto p = grid->GetPropertyByName("ModelControllerConnectionPort"); @@ -1222,8 +1355,7 @@ void Model::UpdateControllerProperties(wxPropertyGridInterface* grid) { if (GetControllerName() != "" && _controller != 0 && (GetControllerPort() == 0 || GetControllerProtocol() == "")) { p->SetHelpString("When using controller name instead of start channels then protocol must be specified."); p->SetBackgroundColour(*wxRED); - } - else { + } else { p->SetHelpString(""); grid->GetPropertyByName("ModelControllerConnectionProtocol")->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX)); } @@ -1235,13 +1367,11 @@ void Model::UpdateControllerProperties(wxPropertyGridInterface* grid) { wxXmlNode* node = GetControllerConnection(); if (IsPixelProtocol()) { - if (grid->GetPropertyByName("ModelControllerConnectionPixelSetNullNodes") != nullptr) - { + if (grid->GetPropertyByName("ModelControllerConnectionPixelSetNullNodes") != nullptr) { if (!node->HasAttribute("nullNodes")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetNullNodes")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetNullNodes.ModelControllerConnectionPixelNullNodes")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetNullNodes")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetNullNodes.ModelControllerConnectionPixelNullNodes")->Enable(); } @@ -1251,68 +1381,57 @@ void Model::UpdateControllerProperties(wxPropertyGridInterface* grid) { if (!node->HasAttribute("endNullNodes")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetEndNullNodes")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetEndNullNodes.ModelControllerConnectionPixelEndNullNodes")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetEndNullNodes")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetEndNullNodes.ModelControllerConnectionPixelEndNullNodes")->Enable(); } } - if (grid->GetPropertyByName("ModelControllerConnectionPixelSetBrightness") != nullptr) - { + if (grid->GetPropertyByName("ModelControllerConnectionPixelSetBrightness") != nullptr) { if (!node->HasAttribute("brightness")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetBrightness")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetBrightness.ModelControllerConnectionPixelBrightness")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetBrightness")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetBrightness.ModelControllerConnectionPixelBrightness")->Enable(); } } - if (grid->GetPropertyByName("ModelControllerConnectionPixelSetGamma") != nullptr) - { + if (grid->GetPropertyByName("ModelControllerConnectionPixelSetGamma") != nullptr) { if (!node->HasAttribute("gamma")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetGamma")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetGamma.ModelControllerConnectionPixelGamma")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetGamma")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetGamma.ModelControllerConnectionPixelGamma")->Enable(); } } - if (grid->GetPropertyByName("ModelControllerConnectionPixelSetColorOrder") != nullptr) - { + if (grid->GetPropertyByName("ModelControllerConnectionPixelSetColorOrder") != nullptr) { if (!node->HasAttribute("colorOrder")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetColorOrder")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetColorOrder.ModelControllerConnectionPixelColorOrder")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetColorOrder")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetColorOrder.ModelControllerConnectionPixelColorOrder")->Enable(); } } - if (grid->GetPropertyByName("ModelControllerConnectionPixelSetDirection") != nullptr) - { + if (grid->GetPropertyByName("ModelControllerConnectionPixelSetDirection") != nullptr) { if (!node->HasAttribute("reverse")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetDirection")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetDirection.ModelControllerConnectionPixelDirection")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetDirection")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetDirection.ModelControllerConnectionPixelDirection")->Enable(); } } - if (grid->GetPropertyByName("ModelControllerConnectionPixelSetGroupCount") != nullptr) - { + if (grid->GetPropertyByName("ModelControllerConnectionPixelSetGroupCount") != nullptr) { if (!node->HasAttribute("groupCount")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetGroupCount")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetGroupCount.ModelControllerConnectionPixelGroupCount")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetGroupCount")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetGroupCount.ModelControllerConnectionPixelGroupCount")->Enable(); } @@ -1332,8 +1451,7 @@ void Model::UpdateControllerProperties(wxPropertyGridInterface* grid) { if (!node->HasAttribute("ts")) { grid->GetPropertyByName("ModelControllerConnectionPixelSetTs")->SetExpanded(false); grid->GetPropertyByName("ModelControllerConnectionPixelSetTs.ModelControllerConnectionPixelTs")->Enable(false); - } - else { + } else { grid->GetPropertyByName("ModelControllerConnectionPixelSetTs")->SetExpanded(true); grid->GetPropertyByName("ModelControllerConnectionPixelSetTs.ModelControllerConnectionPixelTs")->Enable(); } @@ -1342,24 +1460,21 @@ void Model::UpdateControllerProperties(wxPropertyGridInterface* grid) { grid->RefreshGrid(); } -static wxString GetColorString(wxPGProperty *p, xlColor &xc) { +static wxString GetColorString(wxPGProperty* p, xlColor& xc) +{ wxString tp = "Single Color Custom"; if (p != nullptr) { wxColour c; c << p->GetValue(); if (c == *wxRED) { tp = "Single Color Red"; - } - else if (c == *wxBLUE) { + } else if (c == *wxBLUE) { tp = "Single Color Blue"; - } - else if (c == *wxGREEN) { + } else if (c == *wxGREEN) { tp = "Single Color Green"; - } - else if (c == *wxWHITE) { + } else if (c == *wxWHITE) { tp = "Single Color White"; - } - else { + } else { xc = c; } } @@ -1376,15 +1491,15 @@ wxString Model::GetIndividualStartChannel(size_t s) const return ModelXml->GetAttribute(StartChanAttrName(s), ""); } -int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEvent& event) { +int Model::OnPropertyGridChange(wxPropertyGridInterface* grid, wxPropertyGridEvent& event) +{ static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); auto caps = GetControllerCaps(); modelManager.GetXLightsFrame()->AddTraceMessage("Model::OnPropertyGridChange : " + event.GetPropertyName() + " : " + (event.GetValue().GetType() == "string" ? event.GetValue().GetString() : "N/A") + " : " + (event.GetValue().GetType() == "long" ? wxString::Format("%ld", event.GetValue().GetLong()) : "N/A")); - if (HandleLayerSizePropertyChange(grid, event)) - { + if (HandleLayerSizePropertyChange(grid, event)) { return 0; } @@ -1448,36 +1563,26 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return 0; } else if (event.GetPropertyName() == "ModelChain") { std::string modelChain = event.GetValue().GetString(); - if (modelChain == "Beginning") - { + if (modelChain == "Beginning") { modelChain = ""; } SetModelChain(modelChain); - if (modelChain != "") - { + if (modelChain != "") { ModelXml->DeleteAttribute("Advanced"); AdjustStringProperties(grid, parm1); - if (grid->GetPropertyByName("ModelStartChannel") != nullptr) - { + if (grid->GetPropertyByName("ModelStartChannel") != nullptr) { grid->GetPropertyByName("ModelStartChannel")->SetValue(ModelXml->GetAttribute("StartChannel", "1")); grid->GetPropertyByName("ModelStartChannel")->Enable(false); - } - else if (grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel") != nullptr) - { + } else if (grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel") != nullptr) { grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel")->Enable(false); grid->GetPropertyByName("ModelIndividualStartChannels")->Enable(false); grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel")->SetValue(ModelXml->GetAttribute("StartChannel", "1")); } - } - else - { + } else { SetStartChannel("1"); - if (grid->GetPropertyByName("ModelStartChannel") != nullptr) - { + if (grid->GetPropertyByName("ModelStartChannel") != nullptr) { grid->GetPropertyByName("ModelStartChannel")->Enable(); - } - else if (grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel") != nullptr) - { + } else if (grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel") != nullptr) { grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel")->Enable(); grid->GetPropertyByName("ModelIndividualStartChannels")->Enable(); } @@ -1490,15 +1595,13 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::OnPropertyGridChange::ModelChain"); AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::OnPropertyGridChange::ModelChain"); return 0; - } - else if (event.GetPropertyName() == "ShadowModelFor") { + } else if (event.GetPropertyName() == "ShadowModelFor") { if (GetShadowModelFor() != OTHERMODELLIST[event.GetValue().GetInteger()]) { SetShadowModelFor(OTHERMODELLIST[event.GetValue().GetInteger()]); } AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::Controller"); return 0; - } - else if (event.GetPropertyName() == "Controller") { + } else if (event.GetPropertyName() == "Controller") { if (GetControllerName() != CONTROLLERS[event.GetValue().GetInteger()]) { SetControllerName(CONTROLLERS[event.GetValue().GetInteger()]); if (GetControllerPort() != 0 && IsPixelProtocol()) { @@ -1539,7 +1642,6 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::OnPropertyGridChange::Controller"); return 0; } else if (event.GetPropertyName() == "ModelControllerConnectionPort") { - bool protocolChanged = false; if (GetControllerPort() != event.GetValue().GetLong()) { SetControllerPort(event.GetValue().GetLong()); @@ -1596,8 +1698,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve SetActive(event.GetValue().GetBool()); IncrementChangeCount(); return 0; - } - else if (event.GetPropertyName() == "UseSmartRemote") { + } else if (event.GetPropertyName() == "UseSmartRemote") { auto usr = event.GetValue().GetBool(); if (!usr) { SetSmartRemote(0); @@ -1637,8 +1738,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve if (GetControllerName() != "" && _controller != 0) { if (grid->GetPropertyByName("ModelStartChannel") != nullptr) { grid->GetPropertyByName("ModelStartChannel")->SetValue(ModelXml->GetAttribute("StartChannel", "1")); - } - else if (grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel") != nullptr) { + } else if (grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel") != nullptr) { grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel")->SetValue(ModelXml->GetAttribute("StartChannel", "1")); } } @@ -1655,7 +1755,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve } } if ( - //FIXME-Matrix + // FIXME-Matrix (::IsSerialProtocol(newProtocol) && ::IsPixelProtocol(oldProtocol)) || (::IsSerialProtocol(oldProtocol) && ::IsPixelProtocol(newProtocol)) || (oldProtocol == "" && newProtocol != "") || @@ -1673,7 +1773,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return 0; } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetBrightness") { GetControllerConnection()->DeleteAttribute("brightness"); - wxPGProperty *prop = grid->GetFirstChild(event.GetProperty()); + wxPGProperty* prop = grid->GetFirstChild(event.GetProperty()); grid->EnableProperty(prop, event.GetValue().GetBool()); if (event.GetValue().GetBool()) { GetControllerConnection()->AddAttribute("brightness", "100"); @@ -1699,7 +1799,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return 0; } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetGamma") { GetControllerConnection()->DeleteAttribute("gamma"); - wxPGProperty *prop = grid->GetFirstChild(event.GetProperty()); + wxPGProperty* prop = grid->GetFirstChild(event.GetProperty()); grid->EnableProperty(prop, event.GetValue().GetBool()); if (event.GetValue().GetBool()) { GetControllerConnection()->AddAttribute("gamma", "1.0"); @@ -1723,7 +1823,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return 0; } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetDirection") { GetControllerConnection()->DeleteAttribute("reverse"); - wxPGProperty *prop = grid->GetFirstChild(event.GetProperty()); + wxPGProperty* prop = grid->GetFirstChild(event.GetProperty()); grid->EnableProperty(prop, event.GetValue().GetBool()); if (event.GetValue().GetBool()) { GetControllerConnection()->AddAttribute("reverse", "0"); @@ -1749,7 +1849,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return 0; } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetColorOrder") { GetControllerConnection()->DeleteAttribute("colorOrder"); - wxPGProperty *prop = grid->GetFirstChild(event.GetProperty()); + wxPGProperty* prop = grid->GetFirstChild(event.GetProperty()); grid->EnableProperty(prop, event.GetValue().GetBool()); if (event.GetValue().GetBool()) { GetControllerConnection()->AddAttribute("colorOrder", "RGB"); @@ -1773,7 +1873,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return 0; } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetNullNodes") { GetControllerConnection()->DeleteAttribute("nullNodes"); - wxPGProperty *prop = grid->GetFirstChild(event.GetProperty()); + wxPGProperty* prop = grid->GetFirstChild(event.GetProperty()); grid->EnableProperty(prop, event.GetValue().GetBool()); if (event.GetValue().GetBool()) { GetControllerConnection()->AddAttribute("nullNodes", "0"); @@ -1795,8 +1895,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve GetControllerConnection()->AddAttribute("endNullNodes", "0"); prop->SetValueFromInt(0); grid->Expand(event.GetProperty()); - } - else { + } else { grid->Collapse(event.GetProperty()); } AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelControllerConnectionPixelSetEndNullNodes"); @@ -1814,7 +1913,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::OnPropertyGridChange::ModelControllerConnectionPixelNullNodes"); AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::OnPropertyGridChange::ModelControllerConnectionPixelNullNodes"); return 0; - } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetEndNullNodes.ModelControllerConnectionPixelEndNullNodes") { + } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetEndNullNodes.ModelControllerConnectionPixelEndNullNodes") { GetControllerConnection()->DeleteAttribute("endNullNodes"); if (event.GetValue().GetLong() >= 0) { GetControllerConnection()->AddAttribute("endNullNodes", wxString::Format("%i", (int)event.GetValue().GetLong())); @@ -1826,7 +1925,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return 0; } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetGroupCount") { GetControllerConnection()->DeleteAttribute("groupCount"); - wxPGProperty *prop = grid->GetFirstChild(event.GetProperty()); + wxPGProperty* prop = grid->GetFirstChild(event.GetProperty()); grid->EnableProperty(prop, event.GetValue().GetBool()); if (event.GetValue().GetBool()) { GetControllerConnection()->AddAttribute("groupCount", "0"); @@ -1884,8 +1983,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve GetControllerConnection()->AddAttribute("ts", "0"); prop->SetValueFromInt(0); grid->Expand(event.GetProperty()); - } - else { + } else { grid->Collapse(event.GetProperty()); } AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelControllerConnectionPixelSetTs"); @@ -1893,8 +1991,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::OnPropertyGridChange::ModelControllerConnectionPixelSetTs"); AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::OnPropertyGridChange::ModelControllerConnectionPixelSetTs"); return 0; - } - else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetTs.ModelControllerConnectionPixelTs") { + } else if (event.GetPropertyName() == "ModelControllerConnectionPixelSetTs.ModelControllerConnectionPixelTs") { GetControllerConnection()->DeleteAttribute("ts"); if (event.GetValue().GetLong() >= 0) { GetControllerConnection()->AddAttribute("ts", wxString::Format("%i", (int)event.GetValue().GetLong())); @@ -1904,8 +2001,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::OnPropertyGridChange::ModelControllerConnectionPixelTs"); AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::OnPropertyGridChange::ModelControllerConnectionPixelTs"); return 0; - } - else if (event.GetPropertyName() == "SubModels") { + } else if (event.GetPropertyName() == "SubModels") { // We cant know which subModels changed so increment all their change counts to ensure anything using them knows they may have changed for (auto& it : GetSubModels()) { it->IncrementChangeCount(); @@ -1921,22 +2017,20 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve } else if (event.GetPropertyName() == "Description") { description = event.GetValue().GetString(); ModelXml->DeleteAttribute("Description"); - if (description != "") - { + if (description != "") { ModelXml->AddAttribute("Description", XmlSafe(description)); } IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::Description"); return 0; } else if (event.GetPropertyName() == "ModelFaces") { - wxXmlNode *f = ModelXml->GetChildren(); + wxXmlNode* f = ModelXml->GetChildren(); while (f != nullptr) { if ("faceInfo" == f->GetName()) { ModelXml->RemoveChild(f); delete f; f = ModelXml->GetChildren(); - } - else { + } else { f = f->GetNext(); } } @@ -1944,16 +2038,14 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelFaces"); return 0; - } - else if (event.GetPropertyName() == "ModelStates") { + } else if (event.GetPropertyName() == "ModelStates") { wxXmlNode* f = ModelXml->GetChildren(); while (f != nullptr) { if ("stateInfo" == f->GetName()) { ModelXml->RemoveChild(f); delete f; f = ModelXml->GetChildren(); - } - else { + } else { f = f->GetNext(); } } @@ -1961,6 +2053,9 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelStates"); return 0; + } else if (event.GetPropertyName() == "Aliases") { + AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::Aliases"); + return 0; } else if (event.GetPropertyName().StartsWith("SuperStringColours")) { IncrementChangeCount(); SetSuperStringColours(event.GetValue().GetLong()); @@ -1972,27 +2067,25 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve IncrementChangeCount(); SetSuperStringColour(index, c); return 0; - } else if (event.GetPropertyName() == "ModelStringColor" - || event.GetPropertyName() == "ModelStringType" - || event.GetPropertyName() == "ModelRGBWHandling") { - wxPGProperty *p2 = grid->GetPropertyByName("ModelStringType"); + } else if (event.GetPropertyName() == "ModelStringColor" || event.GetPropertyName() == "ModelStringType" || event.GetPropertyName() == "ModelRGBWHandling") { + wxPGProperty* p2 = grid->GetPropertyByName("ModelStringType"); int i = p2->GetValue().GetLong(); ModelXml->DeleteAttribute("StringType"); ModelXml->DeleteAttribute("RGBWHandling"); - if (NODE_TYPES[i] == "Single Color"|| NODE_TYPES[i] == "Single Color Intensity" || NODE_TYPES[i] == "Node Single Color") { - wxPGProperty *p = grid->GetPropertyByName("ModelStringColor"); + if (NODE_TYPES[i] == "Single Color" || NODE_TYPES[i] == "Single Color Intensity" || NODE_TYPES[i] == "Node Single Color") { + wxPGProperty* p = grid->GetPropertyByName("ModelStringColor"); xlColor c; wxString tp = GetColorString(p, c); if (NODE_TYPES[i] == "Single Color Intensity") { tp = "Single Color Intensity"; - } - else if (NODE_TYPES[i] == "Node Single Color" && p != nullptr) { + } else if (NODE_TYPES[i] == "Node Single Color" && p != nullptr) { tp = "Node Single Color"; wxColor cc; cc << p->GetValue(); c = cc; } - if (p != nullptr) p->Enable(); + if (p != nullptr) + p->Enable(); if (tp == "Single Color Custom" || tp == "Single Color Intensity" || tp == "Node Single Color") { ModelXml->DeleteAttribute("CustomColor"); xlColor xc = c; @@ -2010,8 +2103,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::OnPropertyGridChange::ModelStringType"); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelStringType"); - if (event.GetPropertyName() == "ModelStringType") - { + if (event.GetPropertyName() == "ModelStringType") { AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "Model::OnPropertyGridChange::ModelStringType"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::OnPropertyGridChange::ModelStringType"); AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "Model::OnPropertyGridChange::ModelStringType"); @@ -2020,11 +2112,9 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve } return 0; } else if (event.GetPropertyName() == "ModelStartChannel" || event.GetPropertyName() == "ModelIndividualStartChannels.ModelStartChannel") { - wxString val = event.GetValue().GetString(); - if ((val.StartsWith("@") || val.StartsWith("#") || val.StartsWith(">") || val.StartsWith("!")) && !val.Contains(":")) - { + if ((val.StartsWith("@") || val.StartsWith("#") || val.StartsWith(">") || val.StartsWith("!")) && !val.Contains(":")) { val = val + ":1"; event.GetProperty()->SetValue(val); } @@ -2038,7 +2128,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve } IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelStartChannel"); - //AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "Model::OnPropertyGridChange::ModelStartChannel"); + // AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "Model::OnPropertyGridChange::ModelStartChannel"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::OnPropertyGridChange::ModelStartChannel"); AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "Model::OnPropertyGridChange::ModelStartChannel"); AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::OnPropertyGridChange::ModelStartChannel"); @@ -2048,23 +2138,23 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve int c = Model::HasOneString(DisplayAs) ? 1 : parm1; if (event.GetValue().GetBool()) { ModelXml->AddAttribute("Advanced", "1"); - for (int x = 0; x < c; x++) { + for (int x = 0; x < c; ++x) { if (ModelXml->GetAttribute(StartChanAttrName(x)) == "") { ModelXml->DeleteAttribute(StartChanAttrName(x)); ModelXml->AddAttribute(StartChanAttrName(x), - ComputeStringStartChannel(x)); + ComputeStringStartChannel(x)); } } } else { // overkill but just delete any that are there - for (int x = 0; x < MOST_STRINGS_WE_EXPECT; x++) { + for (int x = 0; x < MOST_STRINGS_WE_EXPECT; ++x) { ModelXml->DeleteAttribute(StartChanAttrName(x)); } wxASSERT(!ModelXml->HasAttribute(StartChanAttrName(MOST_STRINGS_WE_EXPECT))); } // Not sure if i can just remove these - //RecalcStartChannels(); - //AdjustStringProperties(grid, parm1); + // RecalcStartChannels(); + // AdjustStringProperties(grid, parm1); IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelIndividualStartChannels"); AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "Model::OnPropertyGridChange::ModelIndividualStartChannels"); @@ -2077,8 +2167,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve str = str.SubString(str.Find(".") + 1, str.length()); wxString val = event.GetValue().GetString(); - if ((val.StartsWith("@") || val.StartsWith("#") || val.StartsWith(">") || val.StartsWith("!")) && !val.Contains(":")) - { + if ((val.StartsWith("@") || val.StartsWith("#") || val.StartsWith(">") || val.StartsWith("!")) && !val.Contains(":")) { val = val + ":1"; event.GetProperty()->SetValue(val); } @@ -2087,7 +2176,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve ModelXml->AddAttribute(str, val); IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::OnPropertyGridChange::ModelIndividualStartChannels2"); - //AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "Model::OnPropertyGridChange::ModelIndividualStartChannels2"); + // AddASAPWork(OutputModelManager::WORK_RELOAD_PROPERTYGRID, "Model::OnPropertyGridChange::ModelIndividualStartChannels2"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::OnPropertyGridChange::ModelIndividualStartChannels2"); AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "Model::OnPropertyGridChange::ModelIndividualStartChannels2"); AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::OnPropertyGridChange::ModelIndividualStartChannels2"); @@ -2101,7 +2190,7 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve AddASAPWork(OutputModelManager::WORK_RELOAD_ALLMODELS, "Model::OnPropertyGridChange::ModelLayoutGroup"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::OnPropertyGridChange::ModelLayoutGroup"); AddASAPWork(OutputModelManager::WORK_REDRAW_LAYOUTPREVIEW, "Model::OnPropertyGridChange::ModelLayoutGroup"); - //AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::OnPropertyGridChange::ModelLayoutGroup"); + // AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::OnPropertyGridChange::ModelLayoutGroup"); return 0; } @@ -2113,9 +2202,10 @@ int Model::OnPropertyGridChange(wxPropertyGridInterface *grid, wxPropertyGridEve return i; } -void Model::AdjustStringProperties(wxPropertyGridInterface *grid, int newNum) { - wxPropertyGrid *pg = static_cast(grid); - wxPGProperty *p = grid->GetPropertyByName("ModelIndividualStartChannels"); +void Model::AdjustStringProperties(wxPropertyGridInterface* grid, int newNum) +{ + wxPropertyGrid* pg = static_cast(grid); + wxPGProperty* p = grid->GetPropertyByName("ModelIndividualStartChannels"); if (p != nullptr) { pg->Freeze(); p->Enable(GetControllerName() == "" || _controller == 0); @@ -2125,7 +2215,7 @@ void Model::AdjustStringProperties(wxPropertyGridInterface *grid, int newNum) { while (count > newNum) { count--; wxString nm = StartChanAttrName(count); - wxPGProperty *sp = grid->GetPropertyByName("ModelIndividualStartChannels." + nm); + wxPGProperty* sp = grid->GetPropertyByName("ModelIndividualStartChannels." + nm); if (sp != nullptr) { grid->DeleteProperty(sp); } @@ -2145,21 +2235,19 @@ void Model::AdjustStringProperties(wxPropertyGridInterface *grid, int newNum) { } } else if (p->GetChildCount() > 1) { int count = p->GetChildCount(); - for (int x = 1; x < count; x++) { + for (int x = 1; x < count; ++x) { wxString nm = StartChanAttrName(x); - wxPGProperty *sp = grid->GetPropertyByName("ModelIndividualStartChannels." + nm); + wxPGProperty* sp = grid->GetPropertyByName("ModelIndividualStartChannels." + nm); if (sp != nullptr) { grid->DeleteProperty(sp); } } } - wxPGProperty *sp = grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel"); - if (sp != nullptr) - { + wxPGProperty* sp = grid->GetPropertyByName("ModelIndividualStartChannels.ModelStartChannel"); + if (sp != nullptr) { if (adv) { sp->SetLabel(StartChanAttrName(0)); - } - else { + } else { sp->SetLabel("Start Channel"); } } @@ -2169,7 +2257,8 @@ void Model::AdjustStringProperties(wxPropertyGridInterface *grid, int newNum) { } } -void Model::ParseFaceInfo(wxXmlNode *f, std::map > &faceInfo) { +void Model::ParseFaceInfo(wxXmlNode* f, std::map>& faceInfo) +{ std::string name = f->GetAttribute("Name", "SingleNode").ToStdString(); std::string type = f->GetAttribute("Type", "SingleNode").ToStdString(); if (name == "") { @@ -2186,23 +2275,18 @@ void Model::ParseFaceInfo(wxXmlNode *f, std::mapDeleteAttribute("Type"); f->AddAttribute("Type", type); } - wxXmlAttribute *att = f->GetAttributes(); + wxXmlAttribute* att = f->GetAttributes(); while (att != nullptr) { - if (att->GetName() != "Name") - { - if (att->GetName().Left(5) == "Mouth" || att->GetName().Left(4) == "Eyes") - { - if (type == "Matrix") - { + if (att->GetName() != "Name") { + if (att->GetName().Left(5) == "Mouth" || att->GetName().Left(4) == "Eyes") { + if (type == "Matrix") { faceInfo[name][att->GetName().ToStdString()] = FixFile("", att->GetValue()); - if (att->GetValue() != faceInfo[name][att->GetName().ToStdString()]) att->SetValue(faceInfo[name][att->GetName().ToStdString()]); - } - else { + if (att->GetValue() != faceInfo[name][att->GetName().ToStdString()]) + att->SetValue(faceInfo[name][att->GetName().ToStdString()]); + } else { faceInfo[name][att->GetName().ToStdString()] = att->GetValue(); } - } - else - { + } else { faceInfo[name][att->GetName().ToStdString()] = att->GetValue(); } } @@ -2210,10 +2294,11 @@ void Model::ParseFaceInfo(wxXmlNode *f, std::map > &faceInfo) { +void Model::WriteFaceInfo(wxXmlNode* rootXml, const std::map>& faceInfo) +{ if (!faceInfo.empty()) { for (const auto& it : faceInfo) { - wxXmlNode *f = new wxXmlNode(rootXml, wxXML_ELEMENT_NODE , "faceInfo"); + wxXmlNode* f = new wxXmlNode(rootXml, wxXML_ELEMENT_NODE, "faceInfo"); std::string name = it.first; f->AddAttribute("Name", name); for (const auto& it2 : it.second) { @@ -2345,7 +2430,7 @@ void Model::UpdateFaceInfoNodes() } start--; end--; - for (int n = start; n <= end; n++) { + for (int n = start; n <= end; ++n) { nodes.push_back(n); } } @@ -2384,7 +2469,7 @@ void Model::UpdateStateInfoNodes() } start--; end--; - for (int n = start; n <= end; n++) { + for (int n = start; n <= end; ++n) { nodes.push_back(n); } } @@ -2411,7 +2496,7 @@ void Model::ParseStateInfo(wxXmlNode* f, std::mapDeleteAttribute("Type"); f->AddAttribute("Type", type); } - wxXmlAttribute *att = f->GetAttributes(); + wxXmlAttribute* att = f->GetAttributes(); while (att != nullptr) { if (att->GetName() != "Name") { if (att->GetValue() != "") { // we only save non default values to keep xml file small @@ -2422,16 +2507,15 @@ void Model::ParseStateInfo(wxXmlNode* f, std::map > &stateInfo, bool forceCustom) { +void Model::WriteStateInfo(wxXmlNode* rootXml, const std::map>& stateInfo, bool forceCustom) +{ if (!stateInfo.empty()) { for (const auto& it : stateInfo) { std::string name = it.first; - if (wxString(name).Trim(true).Trim(false) != "") - { - wxXmlNode *f = new wxXmlNode(rootXml, wxXML_ELEMENT_NODE, "stateInfo"); + if (wxString(name).Trim(true).Trim(false) != "") { + wxXmlNode* f = new wxXmlNode(rootXml, wxXML_ELEMENT_NODE, "stateInfo"); f->AddAttribute("Name", name); - if (forceCustom) - { + if (forceCustom) { f->AddAttribute("CustomColors", "1"); } for (const auto& it2 : it.second) { @@ -2451,8 +2535,7 @@ wxString Model::SerialiseState() const for (const auto& it : stateInfo) { res += " GetAttribute("models"); - if (grpModels.length() == 0) return; + if (grpModels.length() == 0) + return; modelManager.GetXLightsFrame()->AllModels.AddModelGroups(n, w, h, name, merge, ask); } -std::string Model::ComputeStringStartChannel(int i) { +std::string Model::ComputeStringStartChannel(int i) +{ if (i == 0) { return ModelXml->GetAttribute("StartChannel", "1").ToStdString(); } wxString existingStartChannelAsString = ModelXml->GetAttribute(StartChanAttrName(i)); - if (existingStartChannelAsString != "") - { + if (existingStartChannelAsString != "") { return existingStartChannelAsString; } @@ -2504,7 +2588,7 @@ std::string Model::ComputeStringStartChannel(int i) { wxString priorStringStartChannelAsString = ModelXml->GetAttribute(StartChanAttrName(i - 1)); int priorLength = CalcCannelsPerString(); // This will be required once custom model supports multiple strings ... working on that - //if (DisplayAs == "Custom") + // if (DisplayAs == "Custom") //{ // priorLength = GetStrandLength(i - 1) * GetChanCountPerNode(); //} @@ -2512,38 +2596,25 @@ std::string Model::ComputeStringStartChannel(int i) { int32_t startChannel = priorStringStartChannel + priorLength; if (stch.Contains(":")) { auto comps = wxSplit(priorStringStartChannelAsString, ':'); - if (comps[0].StartsWith("#")) - { + if (comps[0].StartsWith("#")) { int32_t ststch; Output* o = modelManager.GetOutputManager()->GetOutput(startChannel, ststch); - if (comps.size() == 2) - { - if (o != nullptr) - { + if (comps.size() == 2) { + if (o != nullptr) { return wxString::Format("#%i:%d", o->GetUniverse(), ststch).ToStdString(); - } - else - { + } else { return wxString::Format("%d", startChannel); } - } - else - { - if (o != nullptr) - { + } else { + if (o != nullptr) { return wxString::Format("%s:%i:%d", comps[0], o->GetUniverse(), ststch).ToStdString(); - } - else - { + } else { return wxString::Format("%d", startChannel); } } - } - else if (comps[0].StartsWith(">") || comps[0].StartsWith("@") || comps[0].StartsWith("!") ) - { + } else if (comps[0].StartsWith(">") || comps[0].StartsWith("@") || comps[0].StartsWith("!")) { return wxString::Format("%s:%d", comps[0], wxAtol(comps[1]) + priorLength); - } - else { + } else { // This used to be on:sc but this is no longer supported return wxString::Format("%d", startChannel); } @@ -2551,15 +2622,17 @@ std::string Model::ComputeStringStartChannel(int i) { return wxString::Format("%d", startChannel); } -int Model::GetNumStrands() const { +int Model::GetNumStrands() const +{ return 1; } -bool Model::ModelRenamed(const std::string &oldName, const std::string &newName) { +bool Model::ModelRenamed(const std::string& oldName, const std::string& newName) +{ bool changed = false; - std::string sc = ModelXml->GetAttribute("StartChannel","1").ToStdString(); + std::string sc = ModelXml->GetAttribute("StartChannel", "1").ToStdString(); if ((sc[0] == '@' || sc[0] == '<' || sc[0] == '>') && sc.size() > 1) { - std::string mn = sc.substr(1, sc.find(':')-1); + std::string mn = sc.substr(1, sc.find(':') - 1); if (mn == oldName) { sc = sc[0] + newName + sc.substr(sc.find(':'), sc.size()); ModelXml->DeleteAttribute("StartChannel"); @@ -2574,19 +2647,18 @@ bool Model::ModelRenamed(const std::string &oldName, const std::string &newName) } std::string mc = ModelXml->GetAttribute("ModelChain", "").ToStdString(); - if (mc == ">" + oldName) - { + if (mc == ">" + oldName) { ModelXml->DeleteAttribute("ModelChain"); ModelXml->AddAttribute("ModelChain", ">" + newName); changed = true; } - for (size_t i=0; iHasAttribute(tempstr)) { sc = ModelXml->GetAttribute(tempstr, "1").ToStdString(); if ((sc[0] == '@' || sc[0] == '<' || sc[0] == '>') && sc.size() > 1) { - std::string mn = sc.substr(1, sc.find(':')-1); + std::string mn = sc.substr(1, sc.find(':') - 1); if (mn == oldName) { sc = sc[0] + newName + sc.substr(sc.find(':'), sc.size()); ModelXml->DeleteAttribute(tempstr); @@ -2612,52 +2684,43 @@ bool Model::IsValidStartChannelString() const sc = ModelXml->GetAttribute("StartChannel").Trim(true).Trim(false); } - if (sc.IsNumber() && wxAtol(sc) > 0 && ! sc.Contains('.')) return true; // absolule + if (sc.IsNumber() && wxAtol(sc) > 0 && !sc.Contains('.')) + return true; // absolule - if (!sc.Contains(':')) return false; // all other formats need a colon + if (!sc.Contains(':')) + return false; // all other formats need a colon wxArrayString parts = wxSplit(sc, ':'); - if (parts.size() > 3) return false; + if (parts.size() > 3) + return false; - if (parts[0][0] == '#') - { - if (parts.size() == 2) - { + if (parts[0][0] == '#') { + if (parts.size() == 2) { Output* o = modelManager.GetOutputManager()->GetOutput(wxAtoi(parts[0].substr(1)), ""); if (o != nullptr && - (parts[1].Trim(true).Trim(false).IsNumber() && wxAtol(parts[1]) > 0 && !parts[1].Contains('.'))) - { + (parts[1].Trim(true).Trim(false).IsNumber() && wxAtol(parts[1]) > 0 && !parts[1].Contains('.'))) { return true; } - } - else if (parts.size() == 3) - { + } else if (parts.size() == 3) { wxString ip = parts[0].substr(1); Output* o = modelManager.GetOutputManager()->GetOutput(wxAtoi(parts[1]), ip.ToStdString()); if (ip_utils::IsIPValidOrHostname(ip.ToStdString()) && o != nullptr && - (parts[2].Trim(true).Trim(false).IsNumber() && wxAtol(parts[2]) > 0 && !parts[2].Contains('.'))) - { + (parts[2].Trim(true).Trim(false).IsNumber() && wxAtol(parts[2]) > 0 && !parts[2].Contains('.'))) { return true; } } - } - else if (parts[0][0] == '>' || parts[0][0] == '@') - { + } else if (parts[0][0] == '>' || parts[0][0] == '@') { if ((parts.size() == 2) && (parts[0].Trim(true).Trim(false).substr(1) != GetName()) && // self referencing - (parts[1].Trim(true).Trim(false).IsNumber() && wxAtol(parts[1]) > 0 && !parts[1].Contains('.'))) - { + (parts[1].Trim(true).Trim(false).IsNumber() && wxAtol(parts[1]) > 0 && !parts[1].Contains('.'))) { // dont bother checking the model name ... other processes will check for that return true; } - } - else if (parts[0][0] == '!') - { + } else if (parts[0][0] == '!') { if ((parts.size() == 2) && (modelManager.GetOutputManager()->GetController(Trim(parts[0].substr(1))) != nullptr) && - (parts[1].Trim(true).Trim(false).IsNumber() && wxAtol(parts[1]) > 0 && !parts[1].Contains('.'))) - { + (parts[1].Trim(true).Trim(false).IsNumber() && wxAtol(parts[1]) > 0 && !parts[1].Contains('.'))) { return true; } } @@ -2674,21 +2737,17 @@ bool Model::UpdateStartChannelFromChannelString(std::map& m std::string dependsonmodel; ModelStartChannel = ModelXml->GetAttribute("StartChannel"); int32_t StartChannel = GetNumberFromChannelString(ModelStartChannel, valid, dependsonmodel); - while (!valid && dependsonmodel != "" && std::find(used.begin(), used.end(), dependsonmodel) == used.end()) - { + while (!valid && dependsonmodel != "" && std::find(used.begin(), used.end(), dependsonmodel) == used.end()) { Model* m = models[dependsonmodel]; - if (m != nullptr) - { + if (m != nullptr) { valid = m->UpdateStartChannelFromChannelString(models, used); } - if (valid) - { + if (valid) { StartChannel = GetNumberFromChannelString(ModelStartChannel, valid, dependsonmodel); } } - if (valid) - { + if (valid) { size_t NumberOfStrings = HasOneString(DisplayAs) ? 1 : parm1; int ChannelsPerString = CalcCannelsPerString(); SetStringStartChannels(zeroBased, NumberOfStrings, StartChannel, ChannelsPerString); @@ -2698,13 +2757,15 @@ bool Model::UpdateStartChannelFromChannelString(std::map& m return valid; } -int Model::GetNumberFromChannelString(const std::string &sc) const { +int Model::GetNumberFromChannelString(const std::string& sc) const +{ bool v = false; std::string dependsonmodel; return GetNumberFromChannelString(sc, v, dependsonmodel); } -int Model::GetNumberFromChannelString(const std::string &str, bool &valid, std::string& dependsonmodel) const { +int Model::GetNumberFromChannelString(const std::string& str, bool& valid, std::string& dependsonmodel) const +{ std::string sc(Trim(str)); valid = true; if (sc.find(":") != std::string::npos) { @@ -2715,8 +2776,7 @@ int Model::GetNumberFromChannelString(const std::string &str, bool &valid, std:: bool chain = start[0] == '>'; bool fromStart = start[0] == '@'; start = Trim(start.substr(1, start.size())); - if (start == GetName() && !CouldComputeStartChannel) - { + if (start == GetName() && !CouldComputeStartChannel) { valid = false; } else { if (start != GetName()) { @@ -2730,80 +2790,67 @@ int Model::GetNumberFromChannelString(const std::string &str, bool &valid, std:: i = stringStartChan[0]; } int res = i + returnChannel; - if (res < 1) - { + if (res < 1) { valid = false; res = 1; } return res; - } - else { + } else { int res = m->GetLastChannel() + returnChannel + 1; - if (res < 1) - { + if (res < 1) { valid = false; res = 1; } return res; } - } - else { + } else { valid = false; } } - } else if (start[0] == '!') { + } else if (start[0] == '!') { if (sc.find_first_of(':') == std::string::npos) { std::string cs = Trim(start.substr(1)); Controller* c = modelManager.GetOutputManager()->GetController(cs); - if (c != nullptr) { + if (c != nullptr && c->GetProtocol() != OUTPUT_PLAYER_ONLY) { return c->GetStartChannel() - 1 + wxAtoi(sc); } } valid = false; return 1; - } - else if (start[0] == '#') { + } else if (start[0] == '#') { wxString ss = wxString(str); wxArrayString cs = wxSplit(ss.SubString(1, ss.Length()), ':'); - if (cs.Count() == 3) - { + if (cs.Count() == 3) { // #ip:universe:channel int returnUniverse = wxAtoi(cs[1]); int returnChannel = wxAtoi(cs[2]); int res = modelManager.GetOutputManager()->GetAbsoluteChannel(cs[0].Trim(false).Trim(true).ToStdString(), returnUniverse - 1, returnChannel - 1); - if (res < 1) - { + if (res < 1) { res = 1; valid = false; } return res; - } - else if (cs.Count() == 2) - { + } else if (cs.Count() == 2) { // #universe:channel int returnChannel = wxAtoi(sc); int returnUniverse = wxAtoi(ss.SubString(1, ss.Find(":") - 1)); // find output based on universe number ... int res = modelManager.GetOutputManager()->GetAbsoluteChannel("", returnUniverse - 1, returnChannel - 1); - if (res < 1) - { + if (res < 1) { res = 1; valid = false; } return res; - } - else - { + } else { valid = false; return 1; } } } int returnChannel = wxAtoi(sc); - if (returnChannel < 1) - { + if (returnChannel < 1) { valid = false; returnChannel = 1; } @@ -2816,8 +2863,7 @@ std::list Model::ParseFaceNodes(std::string channels) std::list res; wxStringTokenizer wtkz(channels, ","); - while (wtkz.HasMoreTokens()) - { + while (wtkz.HasMoreTokens()) { wxString valstr = wtkz.GetNextToken(); int start, end; @@ -2825,9 +2871,9 @@ std::list Model::ParseFaceNodes(std::string channels) int idx = valstr.Index('-'); start = wxAtoi(valstr.Left(idx)); end = wxAtoi(valstr.Right(valstr.size() - idx - 1)); - if (end < start) std::swap(start, end); - } - else { + if (end < start) + std::swap(start, end); + } else { start = end = wxAtoi(valstr); } if (start > end) { @@ -2835,7 +2881,7 @@ std::list Model::ParseFaceNodes(std::string channels) } start--; end--; - for (int n = start; n <= end; n++) { + for (int n = start; n <= end; ++n) { res.push_back(n); } } @@ -2845,7 +2891,6 @@ std::list Model::ParseFaceNodes(std::string channels) void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) { - if (modelDimmingCurve != nullptr) { delete modelDimmingCurve; modelDimmingCurve = nullptr; @@ -2886,7 +2931,7 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) SetShadowModelFor(""); } - //this needs to be done before GetNodeChannelCount call + // this needs to be done before GetNodeChannelCount call bool found = true; int index = 0; while (found) { @@ -2894,8 +2939,7 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) auto v = ModelXml->GetAttribute(an, ""); if (v == "") { found = false; - } - else { + } else { superStringColours.push_back(wxColour(v)); } index++; @@ -2906,21 +2950,22 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) SingleChannel = (ncc == 1) && StringType != "Node Single Color"; if (SingleNode) { rgbOrder = "RGB"; - } - else if (ncc == 4 && StringType[0] == 'W') { + } else if (ncc == 4 && StringType[0] == 'W') { rgbOrder = StringType.substr(1, 4); - } - else { + } else { rgbOrder = StringType.substr(0, 3); } if (ncc == 4) { std::string s = ModelNode->GetAttribute("RGBWHandling").ToStdString(); - for (int x = 0; x < RGBW_HANDLING.size(); x++) { + for (int x = 0; x < RGBW_HANDLING.size(); ++x) { if (RGBW_HANDLING[x] == s) { rgbwHandlingType = x; } } + } else { + rgbwHandlingType = 1; // RGB } + description = UnXmlSafe(ModelNode->GetAttribute("Description")); wxString tempstr = ModelNode->GetAttribute("parm1"); @@ -2936,12 +2981,10 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) if (tempstr[0] == ',') { t2 = ""; tempstr = tempstr(1, tempstr.length()); - } - else if (tempstr.Contains(",")) { + } else if (tempstr.Contains(",")) { t2 = tempstr.SubString(0, tempstr.Find(",") - 1); tempstr = tempstr.SubString(tempstr.Find(",") + 1, tempstr.length()); - } - else { + } else { tempstr = ""; } strandNames.push_back(t2); @@ -2953,27 +2996,24 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) if (tempstr[0] == ',') { t2 = ""; tempstr = tempstr(1, tempstr.length()); - } - else if (tempstr.Contains(",")) { + } else if (tempstr.Contains(",")) { t2 = tempstr.SubString(0, tempstr.Find(",") - 1); tempstr = tempstr.SubString(tempstr.Find(",") + 1, tempstr.length()); - } - else { + } else { tempstr = ""; } nodeNames.push_back(t2); } CouldComputeStartChannel = false; - std::string dependsonmodel; + std::string dependsonmodel; int32_t StartChannel = GetNumberFromChannelString(ModelNode->GetAttribute("StartChannel", "1").ToStdString(), CouldComputeStartChannel, dependsonmodel); tempstr = ModelNode->GetAttribute("Dir"); IsLtoR = tempstr != "R"; if (ModelNode->HasAttribute("StartSide")) { tempstr = ModelNode->GetAttribute("StartSide"); isBotToTop = (tempstr == "B"); - } - else { + } else { isBotToTop = true; } customColor = xlColor(ModelNode->GetAttribute("CustomColor", "#000000").ToStdString()); @@ -3004,7 +3044,7 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) InitModel(); size_t NodeCount = GetNodeCount(); - for (size_t i = 0; i < NodeCount; i++) { + for (size_t i = 0; i < NodeCount; ++i) { Nodes[i]->sparkle = rand() % 10000; } @@ -3016,18 +3056,14 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) while (f != nullptr) { if ("faceInfo" == f->GetName()) { ParseFaceInfo(f, faceInfo); - } - else if ("stateInfo" == f->GetName()) { + } else if ("stateInfo" == f->GetName()) { ParseStateInfo(f, stateInfo); - } - else if ("dimmingCurve" == f->GetName()) { + } else if ("dimmingCurve" == f->GetName()) { dimmingCurveNode = f; modelDimmingCurve = DimmingCurve::createFromXML(f); - } - else if ("subModel" == f->GetName()) { + } else if ("subModel" == f->GetName()) { ParseSubModel(f); - } - else if ("ControllerConnection" == f->GetName()) { + } else if ("ControllerConnection" == f->GetName()) { controllerConnectionNode = f; } f = f->GetNext(); @@ -3074,7 +3110,8 @@ void Model::SetFromXml(wxXmlNode* ModelNode, bool zb) std::string Model::GetControllerConnectionString() const { - if (GetControllerProtocol() == "") return ""; + if (GetControllerProtocol() == "") + return ""; std::string ret = wxString::Format("%s:%d", GetControllerProtocol(), GetControllerPort(1)).ToStdString(); ret += GetControllerConnectionAttributeString(); @@ -3083,7 +3120,8 @@ std::string Model::GetControllerConnectionString() const std::string Model::GetControllerConnectionRangeString() const { - if (GetControllerProtocol() == "") return ""; + if (GetControllerProtocol() == "") + return ""; std::string ret = wxString::Format("%s:%d", GetControllerProtocol(), GetControllerPort(1)).ToStdString(); if (GetControllerPort(1) == 0) { ret = wxString::Format("%s", GetControllerProtocol()).ToStdString(); @@ -3106,7 +3144,8 @@ std::string Model::GetControllerConnectionPortRangeString() const return ret; } -bool compare_pairstring(const std::pair& a, const std::pair& b) { +bool compare_pairstring(const std::pair& a, const std::pair& b) +{ return a.first > b.first; } @@ -3117,9 +3156,9 @@ std::string Model::GetControllerConnectionAttributeString() const wxXmlAttribute* att = GetControllerConnection()->GetAttributes(); while (att != nullptr) { if (att->GetName() == "SmartRemote") { - props.push_back({"SmartRemote", DecodeSmartRemote(wxAtoi(att->GetValue()))}); + props.push_back({ "SmartRemote", DecodeSmartRemote(wxAtoi(att->GetValue())) }); } else if (att->GetName() != "Port" && att->GetName() != "Protocol" && att->GetName() != "SRMaxCascade" && att->GetName() != "SRCascadeOnPort" && att->GetName() != "SmartRemoteType") { - props.push_back({att->GetName(), att->GetValue()}); + props.push_back({ att->GetName(), att->GetValue() }); } att = att->GetNext(); } @@ -3136,8 +3175,7 @@ std::string Model::GetControllerConnectionAttributeString() const void Model::ReplaceIPInStartChannels(const std::string& oldIP, const std::string& newIP) { bool changed = false; - if (Contains(ModelStartChannel, oldIP)) - { + if (Contains(ModelStartChannel, oldIP)) { wxString sc(ModelStartChannel); sc.Replace(oldIP, newIP); SetStartChannel(sc); @@ -3145,12 +3183,11 @@ void Model::ReplaceIPInStartChannels(const std::string& oldIP, const std::string } size_t NumberOfStrings = HasOneString(DisplayAs) ? 1 : parm1; - for (int i = 0; i < NumberOfStrings; i++) { + for (int i = 0; i < NumberOfStrings; ++i) { auto tempstr = StartChanAttrName(i); if (ModelXml->HasAttribute(tempstr)) { wxString sc = ModelXml->GetAttribute(tempstr, ""); - if (Contains(sc, oldIP)) - { + if (Contains(sc, oldIP)) { sc.Replace(oldIP, newIP); ModelXml->DeleteAttribute(tempstr); ModelXml->AddAttribute(tempstr, sc); @@ -3158,8 +3195,7 @@ void Model::ReplaceIPInStartChannels(const std::string& oldIP, const std::string } } } - if (changed) - { + if (changed) { AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::ReplaceIPInStartChannels"); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::ReplaceIPInStartChannels"); AddASAPWork(OutputModelManager::WORK_MODELS_REWORK_STARTCHANNELS, "Model::ReplaceIPInStartChannels"); @@ -3170,28 +3206,32 @@ void Model::ReplaceIPInStartChannels(const std::string& oldIP, const std::string std::string Model::DecodeSmartRemote(int sr) { - if(sr == 0) return "None"; - return std::string (1, ('A' + sr - 1)); + if (sr == 0) + return "None"; + return std::string(1, ('A' + sr - 1)); } -wxXmlNode *Model::GetControllerConnection() const { - if (GetModelXml() == nullptr) return nullptr; +wxXmlNode* Model::GetControllerConnection() const +{ + if (GetModelXml() == nullptr) + return nullptr; - wxXmlNode *n = GetModelXml()->GetChildren(); + wxXmlNode* n = GetModelXml()->GetChildren(); while (n != nullptr) { if (n->GetName() == "ControllerConnection") { return n; } n = n->GetNext(); } - n = new wxXmlNode(wxXML_ELEMENT_NODE , "ControllerConnection"); + n = new wxXmlNode(wxXML_ELEMENT_NODE, "ControllerConnection"); GetModelXml()->AddChild(n); return n; } -void Model::RemoveSubModel(const std::string &name) { +void Model::RemoveSubModel(const std::string& name) +{ for (auto a = subModels.begin(); a != subModels.end(); ++a) { - Model *m = *a; + Model* m = *a; if (m->GetName() == name) { delete m; subModels.erase(a); @@ -3199,7 +3239,8 @@ void Model::RemoveSubModel(const std::string &name) { } } -Model *Model::GetSubModel(const std::string &name) const { +Model* Model::GetSubModel(const std::string& name) const +{ for (auto a = subModels.begin(); a != subModels.end(); ++a) { if ((*a)->GetName() == name) { return *a; @@ -3210,54 +3251,56 @@ Model *Model::GetSubModel(const std::string &name) const { std::string Model::GenerateUniqueSubmodelName(const std::string suggested) const { - if (GetSubModel(suggested) == nullptr) return suggested; + if (GetSubModel(suggested) == nullptr) + return suggested; int i = 2; - for (;;) - { + for (;;) { auto name = wxString::Format("%s_%d", suggested, i++); - if (GetSubModel(name) == nullptr) return name; + if (GetSubModel(name) == nullptr) + return name; } } -void Model::ParseSubModel(wxXmlNode *node) { +void Model::ParseSubModel(wxXmlNode* node) +{ subModels.push_back(new SubModel(this, node)); } -int Model::CalcCannelsPerString() { - int ChannelsPerString = parm2*GetNodeChannelCount(StringType); +int Model::CalcCannelsPerString() +{ + int ChannelsPerString = parm2 * GetNodeChannelCount(StringType); if (SingleChannel) - ChannelsPerString=1; + ChannelsPerString = 1; else if (SingleNode) - ChannelsPerString=GetNodeChannelCount(StringType); + ChannelsPerString = GetNodeChannelCount(StringType); return ChannelsPerString; } -void Model::SetStringStartChannels(bool zeroBased, int NumberOfStrings, int StartChannel, int ChannelsPerString) { +void Model::SetStringStartChannels(bool zeroBased, int NumberOfStrings, int StartChannel, int ChannelsPerString) +{ std::string tempstr = ModelXml->GetAttribute("Advanced", "0").ToStdString(); - bool HasIndividualStartChans=tempstr == "1"; + bool HasIndividualStartChans = tempstr == "1"; stringStartChan.clear(); stringStartChan.resize(NumberOfStrings); - for (int i=0; iHasAttribute(tempstr)) { bool b = false; std::string dependsonmodel; - stringStartChan[i] = GetNumberFromChannelString(ModelXml->GetAttribute(tempstr, "1").ToStdString(), b, dependsonmodel)-1; + stringStartChan[i] = GetNumberFromChannelString(ModelXml->GetAttribute(tempstr, "1").ToStdString(), b, dependsonmodel) - 1; CouldComputeStartChannel &= b; } else { - stringStartChan[i] = (zeroBased? 0 : StartChannel-1) + i*ChannelsPerString; + stringStartChan[i] = (zeroBased ? 0 : StartChannel - 1) + i * ChannelsPerString; } } } int Model::FindNodeAtXY(int bufx, int bufy) { - for (int i = 0; i < Nodes.size(); ++i) - { - if ((bufx == -1 || Nodes[i]->Coords[0].bufX == bufx) && (bufy == -1 || Nodes[i]->Coords[0].bufY == bufy)) - { + for (int i = 0; i < Nodes.size(); ++i) { + if ((bufx == -1 || Nodes[i]->Coords[0].bufX == bufx) && (bufy == -1 || Nodes[i]->Coords[0].bufY == bufy)) { return i; } } @@ -3265,55 +3308,60 @@ int Model::FindNodeAtXY(int bufx, int bufy) return -1; } -void Model::InitModel() { +void Model::InitModel() +{ } -void Model::GetNodeChannelValues(size_t nodenum, unsigned char *buf) { +void Model::GetNodeChannelValues(size_t nodenum, unsigned char* buf) +{ wxASSERT(nodenum < Nodes.size()); // trying to catch an error i can see in crash reports if (nodenum < Nodes.size()) { Nodes[nodenum]->GetForChannels(buf); } } -void Model::SetNodeChannelValues(size_t nodenum, const unsigned char *buf) { +void Model::SetNodeChannelValues(size_t nodenum, const unsigned char* buf) +{ wxASSERT(nodenum < Nodes.size()); // trying to catch an error i can see in crash reports if (nodenum < Nodes.size()) { Nodes[nodenum]->SetFromChannels(buf); } } -xlColor Model::GetNodeColor(size_t nodenum) const { +xlColor Model::GetNodeColor(size_t nodenum) const +{ wxASSERT(nodenum < Nodes.size()); // trying to catch an error i can see in crash reports xlColor color; if (nodenum < Nodes.size()) { Nodes[nodenum]->GetColor(color); - } - else - { + } else { color = xlWHITE; } return color; } -xlColor Model::GetNodeMaskColor(size_t nodenum) const { - if (nodenum >= Nodes.size()) return xlWHITE; // this shouldnt happen but it does if you have a custom model with no nodes in it +xlColor Model::GetNodeMaskColor(size_t nodenum) const +{ + if (nodenum >= Nodes.size()) + return xlWHITE; // this shouldnt happen but it does if you have a custom model with no nodes in it xlColor color; Nodes[nodenum]->GetMaskColor(color); return color; } -void Model::SetNodeColor(size_t nodenum, const xlColor &c) { +void Model::SetNodeColor(size_t nodenum, const xlColor& c) +{ wxASSERT(nodenum < Nodes.size()); // trying to catch an error i can see in crash reports if (nodenum < Nodes.size()) { Nodes[nodenum]->SetColor(c); } } -bool Model::IsNodeInBufferRange(size_t nodeNum, int x1, int y1, int x2, int y2) { +bool Model::IsNodeInBufferRange(size_t nodeNum, int x1, int y1, int x2, int y2) +{ if (nodeNum < Nodes.size()) { for (auto a = Nodes[nodeNum]->Coords.begin(); a != Nodes[nodeNum]->Coords.end(); ++a) { - if (a->bufX >= x1 && a->bufX <= x2 - && a->bufY >= y1 && a->bufY <= y2) { + if (a->bufX >= x1 && a->bufX <= x2 && a->bufY >= y1 && a->bufY <= y2) { return true; } } @@ -3322,26 +3370,23 @@ bool Model::IsNodeInBufferRange(size_t nodeNum, int x1, int y1, int x2, int y2) } // only valid for rgb nodes and dumb strings (not traditional strings) -wxChar Model::GetChannelColorLetter(wxByte chidx) { +wxChar Model::GetChannelColorLetter(wxByte chidx) +{ return rgbOrder[chidx]; } char Model::EncodeColour(const xlColor& c) { - if (c.red > 0 && c.green == 0 && c.blue == 0) - { + if (c.red > 0 && c.green == 0 && c.blue == 0) { return 'R'; } - if (c.red == 0 && c.green > 0 && c.blue == 0) - { + if (c.red == 0 && c.green > 0 && c.blue == 0) { return 'G'; } - if (c.red == 0 && c.green == 0 && c.blue > 0) - { + if (c.red == 0 && c.green == 0 && c.blue > 0) { return 'B'; } - if (c.red > 0 && c.red == c.green && c.red == c.blue) - { + if (c.red > 0 && c.red == c.green && c.red == c.blue) { return 'W'; } @@ -3353,7 +3398,8 @@ char Model::EncodeColour(const xlColor& c) char Model::GetAbsoluteChannelColorLetter(int32_t absoluteChannel) { int32_t fc = GetFirstChannel(); - if (absoluteChannel < fc + 1 || absoluteChannel > (int32_t)GetLastChannel() + 1) return ' '; + if (absoluteChannel < fc + 1 || absoluteChannel > (int32_t)GetLastChannel() + 1) + return ' '; if (SingleChannel) { return EncodeColour(GetNodeMaskColor(0)); @@ -3377,28 +3423,17 @@ std::string Model::GetControllerPortSortString() const std::string Model::GetStartChannelInDisplayFormat(OutputManager* outputManager) { auto s = Trim(ModelStartChannel); - if (!IsValidStartChannelString()) - { + if (!IsValidStartChannelString()) { return "(1)"; - } - else if (s[0] == '>') - { + } else if (s[0] == '>') { return s + wxString::Format(" (%u)", GetFirstChannel() + 1); - } - else if (s[0] == '@') - { + } else if (s[0] == '@') { return s + wxString::Format(" (%u)", GetFirstChannel() + 1); - } - else if (s[0] == '!') - { + } else if (s[0] == '!') { return s + wxString::Format(" (%u)", GetFirstChannel() + 1); - } - else if (s[0] == '#') - { + } else if (s[0] == '#') { return GetFirstChannelInStartChannelFormat(outputManager); - } - else - { + } else { return wxString::Format("%u", GetFirstChannel() + 1); } } @@ -3408,7 +3443,8 @@ std::string Model::GetLastChannelInStartChannelFormat(OutputManager* outputManag return GetChannelInStartChannelFormat(outputManager, GetLastChannel() + 1); } -std::string Model::GetChannelInStartChannelFormat(OutputManager* outputManager, uint32_t channel) { +std::string Model::GetChannelInStartChannelFormat(OutputManager* outputManager, uint32_t channel) +{ std::list visitedModels; visitedModels.push_back(GetName()); @@ -3416,46 +3452,33 @@ std::string Model::GetChannelInStartChannelFormat(OutputManager* outputManager, char firstChar = modelFormat[0]; bool done = false; - while (!done && (firstChar == '@' || firstChar == '>') && CountChar(modelFormat, ':') == 1) - { + while (!done && (firstChar == '@' || firstChar == '>') && CountChar(modelFormat, ':') == 1) { std::string referencedModel = Trim(modelFormat.substr(1, modelFormat.find(':') - 1)); Model* m = modelManager[referencedModel]; - if (m != nullptr && std::find(visitedModels.begin(), visitedModels.end(), referencedModel) == visitedModels.end()) - { + if (m != nullptr && std::find(visitedModels.begin(), visitedModels.end(), referencedModel) == visitedModels.end()) { modelFormat = Trim(m->ModelStartChannel); firstChar = modelFormat[0]; - } - else - { + } else { done = true; } visitedModels.push_back(referencedModel); } - if (!modelFormat.empty()) - { - if (modelFormat[0] == '#') - { + if (!modelFormat.empty()) { + if (modelFormat[0] == '#') { firstChar = '#'; - } - else if (modelFormat[0] == '!') - { + } else if (modelFormat[0] == '!') { firstChar = '!'; - } - else if (CountChar(modelFormat, ':') == 1) - { + } else if (CountChar(modelFormat, ':') == 1) { firstChar = '0'; } - } - else - { + } else { firstChar = '0'; modelFormat = "0"; } - if (firstChar == '#') - { + if (firstChar == '#') { // universe:channel int32_t startChannel; Output* output = outputManager->GetOutput(channel, startChannel); @@ -3465,45 +3488,34 @@ std::string Model::GetChannelInStartChannelFormat(OutputManager* outputManager, } // This should not be the case any more - //if (output->IsOutputCollection()) + // if (output->IsOutputCollection()) //{ // output = output->GetActualOutput(channel); // startChannel = channel - output->GetStartChannel() + 1; //} - if (CountChar(modelFormat, ':') == 1) - { + if (CountChar(modelFormat, ':') == 1) { return wxString::Format("#%d:%d (%u)", output->GetUniverse(), startChannel, channel).ToStdString(); - } - else - { + } else { std::string ip = ""; - if (output->IsIpOutput()) - { + if (output->IsIpOutput()) { ip = ((IPOutput*)output)->GetIP(); } return wxString::Format("#%s:%d:%d (%u)", ip, output->GetUniverse(), startChannel, channel).ToStdString(); } - } - else if (firstChar == '!') - { + } else if (firstChar == '!') { auto comps = wxSplit(modelFormat, ':'); auto c = outputManager->GetController(Trim(comps[0].substr(1))); int32_t start = 1; - if (c != nullptr) - { + if (c != nullptr) { start = c->GetStartChannel(); } unsigned int lastChannel = GetLastChannel() + 1; return wxString(modelFormat).BeforeFirst(':').Trim(true).Trim(false) + ":" + wxString::Format("%d (%u)", lastChannel - start + 1, lastChannel); - } - else if (firstChar == '@' || firstChar == '>' || CountChar(modelFormat, ':') == 0) - { + } else if (firstChar == '@' || firstChar == '>' || CountChar(modelFormat, ':') == 0) { // absolute return std::to_string(channel); - } - else - { + } else { // This used to be output:sc ... but that is no longer valid return std::to_string(channel); } @@ -3514,28 +3526,28 @@ std::string Model::GetFirstChannelInStartChannelFormat(OutputManager* outputMana return GetChannelInStartChannelFormat(outputManager, GetFirstChannel() + 1); } -uint32_t Model::GetLastChannel() const { +uint32_t Model::GetLastChannel() const +{ uint32_t LastChan = 0; size_t NodeCount = GetNodeCount(); - for (size_t idx = 0; idx < NodeCount; idx++) { - if (Nodes[idx]->ActChan == (unsigned int)-1) - { + for (size_t idx = 0; idx < NodeCount; ++idx) { + if (Nodes[idx]->ActChan == (unsigned int)-1) { return (unsigned int)NodeCount * Nodes[idx]->GetChanCount() - 1; } unsigned int lc = std::max(LastChan, Nodes[idx]->ActChan + Nodes[idx]->GetChanCount() - 1); - if (lc > LastChan) - { + if (lc > LastChan) { LastChan = lc; } } return LastChan; } -//zero based channel number, i.e. 0 is the first channel -uint32_t Model::GetFirstChannel() const { +// zero based channel number, i.e. 0 is the first channel +uint32_t Model::GetFirstChannel() const +{ uint32_t FirstChan = 0xFFFFFFFF; size_t NodeCount = GetNodeCount(); - for (size_t idx = 0; idx < NodeCount; idx++) { + for (size_t idx = 0; idx < NodeCount; ++idx) { uint32_t fc = std::min(FirstChan, Nodes[idx]->ActChan); if (fc < FirstChan) { FirstChan = fc; @@ -3544,12 +3556,13 @@ uint32_t Model::GetFirstChannel() const { return FirstChan; } -unsigned int Model::GetNumChannels() { +unsigned int Model::GetNumChannels() +{ return GetLastChannel() - GetFirstChannel() + 1; } -void Model::SetPosition(double posx, double posy) { - +void Model::SetPosition(double posx, double posy) +{ if (GetModelScreenLocation().IsLocked() || IsFromBase()) return; @@ -3560,61 +3573,66 @@ void Model::SetPosition(double posx, double posy) { // initialize screen coordinates // parm1=Number of Strings/Arches/Canes // parm2=Pixels Per String/Arch/Cane -void Model::SetLineCoord() { - float x,y; - float idx=0; - size_t NodeCount=GetNodeCount(); - int numlights=parm1*parm2; - float half=numlights/2; - GetModelScreenLocation().SetRenderSize(numlights, numlights*2); - - for(size_t n=0; nCoords[c].screenX=x; - Nodes[n]->Coords[c].screenY=y + numlights; +void Model::SetLineCoord() +{ + float x, y; + float idx = 0; + size_t NodeCount = GetNodeCount(); + int numlights = parm1 * parm2; + float half = numlights / 2; + GetModelScreenLocation().SetRenderSize(numlights, numlights * 2); + + for (size_t n = 0; n < NodeCount; ++n) { + size_t CoordCount = GetCoordCount(n); + for (size_t c = 0; c < CoordCount; ++c) { + x = idx; + x = IsLtoR ? x - half : half - x; + y = 0; + Nodes[n]->Coords[c].screenX = x; + Nodes[n]->Coords[c].screenY = y + numlights; idx++; } } } -void Model::SetBufferSize(int NewHt, int NewWi) { +void Model::SetBufferSize(int NewHt, int NewWi) +{ BufferHt = NewHt; BufferWi = NewWi; IncrementChangeCount(); } // not valid for Frame or Custom -int Model::NodesPerString() const { +int Model::NodesPerString() const +{ if (SingleNode) { return 1; - } - else { + } else { int ts = GetSmartTs(); if (ts <= 1) { return parm2; - } - else { + } else { return parm2 * ts; } } } -int32_t Model::NodeStartChannel(size_t nodenum) const { - return Nodes.size() && nodenum < Nodes.size() ? Nodes[nodenum]->ActChan: 0; //avoid memory access error if no nods -DJ +int32_t Model::NodeStartChannel(size_t nodenum) const +{ + return Nodes.size() && nodenum < Nodes.size() ? Nodes[nodenum]->ActChan : 0; // avoid memory access error if no nods -DJ } -int32_t Model::NodeEndChannel(size_t nodenum) const { - return Nodes.size() && nodenum < Nodes.size() ? Nodes[nodenum]->ActChan + Nodes[nodenum]->GetChanCount() - 1: 0; //avoid memory access error if no nods -DJ +int32_t Model::NodeEndChannel(size_t nodenum) const +{ + return Nodes.size() && nodenum < Nodes.size() ? Nodes[nodenum]->ActChan + Nodes[nodenum]->GetChanCount() - 1 : 0; // avoid memory access error if no nods -DJ } -const std::string &Model::NodeType(size_t nodenum) const { - return Nodes.size() && nodenum < Nodes.size() ? Nodes[nodenum]->GetNodeType(): NodeBaseClass::RGB; //avoid memory access error if no nods -DJ +const std::string& Model::NodeType(size_t nodenum) const +{ + return Nodes.size() && nodenum < Nodes.size() ? Nodes[nodenum]->GetNodeType() : NodeBaseClass::RGB; // avoid memory access error if no nods -DJ } -void Model::GetBufferSize(const std::string &type, const std::string &camera, const std::string &transform, int &bufferWi, int &bufferHi, int stagger) const { +void Model::GetBufferSize(const std::string& type, const std::string& camera, const std::string& transform, int& bufferWi, int& bufferHi, int stagger) const +{ if (type == DEFAULT) { bufferHi = this->BufferHt; bufferWi = this->BufferWi; @@ -3627,26 +3645,27 @@ void Model::GetBufferSize(const std::string &type, const std::string &camera, co } else if (type == VERT_PER_STRAND) { bufferHi = GetNumStrands(); bufferWi = 1; - for (int x = 0; x < bufferHi; x++) { + for (int x = 0; x < bufferHi; ++x) { bufferWi = std::max(bufferWi, GetStrandLength(x)); } } else if (type == HORIZ_PER_STRAND) { bufferWi = GetNumStrands(); bufferHi = 1; - for (int x = 0; x < bufferWi; x++) { + for (int x = 0; x < bufferWi; ++x) { bufferHi = std::max(bufferHi, GetStrandLength(x)); } } else { - //if (type == PER_PREVIEW) { - //default is to go ahead and build the full node buffer + // if (type == PER_PREVIEW) { + // default is to go ahead and build the full node buffer std::vector newNodes; InitRenderBufferNodes(type, camera, "None", newNodes, bufferWi, bufferHi, stagger); } AdjustForTransform(transform, bufferWi, bufferHi); } -void Model::AdjustForTransform(const std::string &transform, - int &bufferWi, int &bufferHi) const { +void Model::AdjustForTransform(const std::string& transform, + int& bufferWi, int& bufferHi) const +{ if (transform == "Rotate CC 90" || transform == "Rotate CW 90") { int x = bufferHi; bufferHi = bufferWi; @@ -3654,12 +3673,14 @@ void Model::AdjustForTransform(const std::string &transform, } } -static inline void SetCoords(NodeBaseClass::CoordStruct &it2, int x, int y) { +static inline void SetCoords(NodeBaseClass::CoordStruct& it2, int x, int y) +{ it2.bufX = x; it2.bufY = y; } -static inline void SetCoords(NodeBaseClass::CoordStruct &it2, int x, int y, int maxX, int maxY, int scale) { +static inline void SetCoords(NodeBaseClass::CoordStruct& it2, int x, int y, int maxX, int maxY, int scale) +{ if (maxX != -1) { x = x * maxX; x = x / scale; @@ -3673,14 +3694,11 @@ static inline void SetCoords(NodeBaseClass::CoordStruct &it2, int x, int y, int } // this is really slow -char GetPixelDump(int x, int y, std::vector &newNodes) +char GetPixelDump(int x, int y, std::vector& newNodes) { - for (auto n = newNodes.begin(); n != newNodes.end(); ++n) - { - for (auto c = (*n)->Coords.begin(); c != (*n)->Coords.end(); ++c) - { - if (c->bufX == x && c->bufY == y) - { + for (auto n = newNodes.begin(); n != newNodes.end(); ++n) { + for (auto c = (*n)->Coords.begin(); c != (*n)->Coords.end(); ++c) { + if (c->bufX == x && c->bufY == y) { return '*'; } } @@ -3689,17 +3707,15 @@ char GetPixelDump(int x, int y, std::vector &newNodes) return '-'; } -void Model::DumpBuffer(std::vector &newNodes, - int bufferWi, int bufferHt) const +void Model::DumpBuffer(std::vector& newNodes, + int bufferWi, int bufferHt) const { - static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); logger_base.debug("Dumping render buffer for '%s':", (const char*)GetFullName().c_str()); - for (int y = bufferHt - 1; y >= 0; y--) - { + for (int y = bufferHt - 1; y >= 0; y--) { std::string line = ""; - for (int x = 0; x < bufferWi; x++) - { + for (int x = 0; x < bufferWi; ++x) { line += GetPixelDump(x, y, newNodes); } logger_base.debug("> %s", (const char*)line.c_str()); @@ -3714,59 +3730,59 @@ void Model::ApplyTransform(const std::string& type, if (type == "None") { return; } else if (type == "Rotate 180") { - for (size_t x = 0; x < newNodes.size(); x++) { + for (size_t x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, bufferWi - it2.bufX - 1, bufferHi - it2.bufY - 1); } } } else if (type == "Flip Vertical") { - for (size_t x = 0; x < newNodes.size(); x++) { + for (size_t x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, it2.bufX, bufferHi - it2.bufY - 1); } } } else if (type == "Flip Horizontal") { - for (size_t x = 0; x < newNodes.size(); x++) { + for (size_t x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, bufferWi - it2.bufX - 1, it2.bufY); } } } else if (type == "Rotate CW 90") { - for (size_t x = 0; x < newNodes.size(); x++) { + for (size_t x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, bufferHi - it2.bufY - 1, it2.bufX); } } std::swap(bufferWi, bufferHi); } else if (type == "Rotate CC 90") { - for (int x = 0; x < newNodes.size(); x++) { + for (int x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, it2.bufY, bufferWi - it2.bufX - 1); } } std::swap(bufferWi, bufferHi); } else if (type == "Rotate CC 90 Flip Horizontal") { - for (int x = 0; x < newNodes.size(); x++) { + for (int x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, it2.bufY, bufferWi - it2.bufX - 1); } } std::swap(bufferWi, bufferHi); - for (size_t x = 0; x < newNodes.size(); x++) { + for (size_t x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, it2.bufX, bufferHi - it2.bufY - 1); } } } else if (type == "Rotate CW 90 Flip Horizontal") { - for (size_t x = 0; x < newNodes.size(); x++) { + for (size_t x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, bufferHi - it2.bufY - 1, it2.bufX); } } std::swap(bufferWi, bufferHi); - for (size_t x = 0; x < newNodes.size(); x++) { + for (size_t x = 0; x < newNodes.size(); ++x) { for (auto& it2 : newNodes[x]->Coords) { SetCoords(it2, it2.bufX, bufferHi - it2.bufY - 1); } @@ -3774,25 +3790,23 @@ void Model::ApplyTransform(const std::string& type, } } -void Model::InitRenderBufferNodes(const std::string &type, const std::string &camera, - const std::string &transform, - std::vector& newNodes, int& bufferWi, int& bufferHt, int stagger, bool deep) const +void Model::InitRenderBufferNodes(const std::string& type, const std::string& camera, + const std::string& transform, + std::vector& newNodes, int& bufferWi, int& bufferHt, int stagger, bool deep) const { - - static log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); int firstNode = newNodes.size(); // want to see if i can catch something that causes this to crash - if (firstNode + Nodes.size() <= 0) - { + if (firstNode + Nodes.size() <= 0) { // This seems to happen when an effect is dropped on a strand with zero pixels // Like a polyline segment with no nodes - logger_base.warn("Model::InitRenderBufferNodes firstNode + Nodes.size() = %d. %s::'%s'. This commonly happens on a polyline segment with zero pixels or a custom model with no nodes but with effects dropped on it.", (int32_t)firstNode + Nodes.size(), (const char *)GetDisplayAs().c_str(), (const char *)GetFullName().c_str()); + logger_base.warn("Model::InitRenderBufferNodes firstNode + Nodes.size() = %d. %s::'%s'. This commonly happens on a polyline segment with zero pixels or a custom model with no nodes but with effects dropped on it.", (int32_t)firstNode + Nodes.size(), (const char*)GetDisplayAs().c_str(), (const char*)GetFullName().c_str()); } // Don't add model group nodes if its a 3D preview render buffer - if ( !((camera != "2D") && GetDisplayAs() == "ModelGroup" && (type == PER_PREVIEW || type == PER_PREVIEW_NO_OFFSET)) ) { + if (!((camera != "2D") && GetDisplayAs() == "ModelGroup" && (type == PER_PREVIEW || type == PER_PREVIEW_NO_OFFSET))) { newNodes.reserve(firstNode + Nodes.size()); for (auto& it : Nodes) { newNodes.push_back(NodeBaseClassPtr(it.get()->clone())); @@ -3802,14 +3816,12 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca if (type == DEFAULT) { bufferHt = this->BufferHt; bufferWi = this->BufferWi; - } - else if (type == SINGLE_LINE) { + } else if (type == SINGLE_LINE) { bufferHt = 1; bufferWi = newNodes.size(); int cnt = 0; - for (int x = firstNode; x < newNodes.size(); x++) { - if (newNodes[x] == nullptr) - { + for (int x = firstNode; x < newNodes.size(); ++x) { + if (newNodes[x] == nullptr) { logger_base.crit("XXX Model::InitRenderBufferNodes newNodes[x] is null ... this is going to crash."); wxASSERT(false); } @@ -3818,13 +3830,11 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca } cnt++; } - } - else if (type == AS_PIXEL) { + } else if (type == AS_PIXEL) { bufferHt = 1; bufferWi = 1; - for (int x = firstNode; x < newNodes.size(); x++) { - if (newNodes[x] == nullptr) - { + for (int x = firstNode; x < newNodes.size(); ++x) { + if (newNodes[x] == nullptr) { logger_base.crit("XXX Model::InitRenderBufferNodes newNodes[x] is null ... this is going to crash."); wxASSERT(false); } @@ -3832,11 +3842,10 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca SetCoords(it2, 0, 0); } } - } - else if (type == HORIZ_PER_STRAND) { + } else if (type == HORIZ_PER_STRAND) { bufferWi = GetNumStrands(); bufferHt = 1; - for (int x = 0; x < bufferWi; x++) { + for (int x = 0; x < bufferWi; ++x) { bufferHt = std::max(bufferHt, GetStrandLength(x)); } int cnt = 0; @@ -3847,17 +3856,14 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca strand++; if (strand < GetNumStrands()) { strandLen = GetStrandLength(GetMappedStrand(strand)); - } - else { + } else { // not sure what to do here ... we have more nodes than strands ... so lets just start again strandLen = GetStrandLength(GetMappedStrand(0)); strand = 0; } cnt = 0; - } - else { - if (newNodes[x] == nullptr) - { + } else { + if (newNodes[x] == nullptr) { logger_base.crit("AAA Model::InitRenderBufferNodes newNodes[x] is null ... this is going to crash."); wxASSERT(false); } @@ -3868,11 +3874,10 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca x++; } } - } - else if (type == VERT_PER_STRAND) { + } else if (type == VERT_PER_STRAND) { bufferHt = GetNumStrands(); bufferWi = 1; - for (int x = 0; x < bufferHt; x++) { + for (int x = 0; x < bufferHt; ++x) { bufferWi = std::max(bufferWi, GetStrandLength(x)); } int cnt = 0; @@ -3883,17 +3888,14 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca strand++; if (strand < GetNumStrands()) { strandLen = GetStrandLength(GetMappedStrand(strand)); - } - else { + } else { // not sure what to do here ... we have more nodes than strands ... so lets just start again strandLen = GetStrandLength(GetMappedStrand(0)); strand = 0; } cnt = 0; - } - else { - if (newNodes[x] == nullptr) - { + } else { + if (newNodes[x] == nullptr) { logger_base.crit("BBB Model::InitRenderBufferNodes newNodes[x] is null ... this is going to crash."); wxASSERT(false); } @@ -3904,8 +3906,7 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca x++; } } - } - else if (type == PER_PREVIEW || type == PER_PREVIEW_NO_OFFSET) { + } else if (type == PER_PREVIEW || type == PER_PREVIEW_NO_OFFSET) { float maxX = -1000000.0; float minX = 1000000.0; float maxY = -1000000.0; @@ -3913,8 +3914,7 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca ModelPreview* modelPreview = nullptr; PreviewCamera* pcamera = nullptr; - if (xLightsApp::GetFrame() != nullptr) - { + if (xLightsApp::GetFrame() != nullptr) { modelPreview = xLightsApp::GetFrame()->GetHousePreview(); pcamera = xLightsApp::GetFrame()->viewpoint_mgr.GetNamedCamera3D(camera); } @@ -3927,11 +3927,11 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca // For 3D render view buffers recursively process each individual model...should be able to handle nested model groups if (GetDisplayAs() == "ModelGroup" && camera != "2D") { - std::vector models; + std::vector models; auto mn = Split(ModelXml->GetAttribute("models").ToStdString(), ',', true); int nc = 0; - for (int x = 0; x < mn.size(); x++) { - Model *c = modelManager.GetModel(mn[x]); + for (int x = 0; x < mn.size(); ++x) { + Model* c = modelManager.GetModel(mn[x]); if (c != nullptr) { models.push_back(c); nc += c->GetNodeCount(); @@ -3943,7 +3943,7 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca if (nc) { newNodes.reserve(nc); } - for (Model *c : models) { + for (Model* c : models) { int bw, bh; c->InitRenderBufferNodes("Per Preview No Offset", camera, transform, newNodes, bw, bh, stagger); } @@ -3952,9 +3952,9 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca // We save the transformed coordinates here so we dont have to calculate them all twice std::vector outx; std::vector outy; - outx.reserve(newNodes.size() - firstNode); //common case is one coord per node so size for that + outx.reserve(newNodes.size() - firstNode); // common case is one coord per node so size for that outy.reserve(newNodes.size() - firstNode); - for (int x = firstNode; x < newNodes.size(); x++) { + for (int x = firstNode; x < newNodes.size(); ++x) { if (newNodes[x] == nullptr) { logger_base.crit("CCC Model::InitRenderBufferNodes newNodes[x] is null ... this is going to crash."); wxASSERT(false); @@ -3969,7 +3969,7 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca } else { if (pcamera == nullptr || camera == "2D") { // Handle all of the 2D classic transformations - //float sz = 0; + // float sz = 0; // reintroducing the z coordinate as otherwise with some rotations we end up with a zero width buffer float sz = it2.screenZ; GetModelScreenLocation().TranslatePoint(sx, sy, sz); @@ -4024,17 +4024,17 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca } } } - if ((type != PER_PREVIEW_NO_OFFSET) && (((maxX - minX) > 2048) || ((maxY - minY) > 2048))){ + if ((type != PER_PREVIEW_NO_OFFSET) && (((maxX - minX) > 2048) || ((maxY - minY) > 2048))) { // this will result in a GIANT render buffer, lets reduce to something we can reasonably render float fx = ((float)(maxX - minX)) / 2048.0f; float fy = ((float)(maxY - minY)) / 2048.0f; factor = fx > fy ? fx : fy; } - // if we have a dense model with lots of pixels but (int)(maxx - minx) and (int)(maxy - miny) are really small then it generates a render buffer that is quite small with lots of nodes in each cell - // We need a factor that scales up the screen locations to separate the pixels - // The empty space factor is the number of empty cells expected per filled cell in the average model ... of course in models where there are dense and sparse areas this wont necessarily be true - #define MODEL_EMPTY_SPACE_FACTOR 4.0f +// if we have a dense model with lots of pixels but (int)(maxx - minx) and (int)(maxy - miny) are really small then it generates a render buffer that is quite small with lots of nodes in each cell +// We need a factor that scales up the screen locations to separate the pixels +// The empty space factor is the number of empty cells expected per filled cell in the average model ... of course in models where there are dense and sparse areas this wont necessarily be true +#define MODEL_EMPTY_SPACE_FACTOR 4.0f if (type == PER_PREVIEW && GetDisplayAs() != "ModelGroup" && factor == 1.0 && (newNodes.size() * (MODEL_EMPTY_SPACE_FACTOR + 1.0) > (maxX - minX) * (maxY - minY))) { float deltaX = maxX - minX; float deltaY = maxY - minY; @@ -4054,7 +4054,7 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca float x = std::sqrt(mx); factor = deltaX / x; if (std::max(deltaX / factor, deltaY / factor) > 400) { // if this results in an overly large scaling ... ie a buffer > 400 in any dimension - factor = std::max(deltaX, deltaY) / 400; // work out a scaling that gives a 400x400 buffer + factor = std::max(deltaX, deltaY) / 400; // work out a scaling that gives a 400x400 buffer } } @@ -4062,7 +4062,7 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca maxX /= factor; minY /= factor; maxY /= factor; - //logger_base.debug("Factor '%f':", factor); + // logger_base.debug("Factor '%f':", factor); float offx = minX; float offy = minY; @@ -4078,13 +4078,12 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca if (!(pcamera != nullptr && camera != "2D" && GetDisplayAs() != "ModelGroup" && noOff)) { auto itx = outx.begin(); auto ity = outy.begin(); - for (int x = firstNode; x < newNodes.size(); x++) { + for (int x = firstNode; x < newNodes.size(); ++x) { if (newNodes[x] == nullptr) { logger_base.crit("DDD Model::InitRenderBufferNodes newNodes[x] is null ... this is going to crash."); wxASSERT(false); } for (auto& it2 : newNodes[x]->Coords) { - // grab the previously transformed coordinate float sx = *itx / factor; float sy = *ity / factor; @@ -4111,27 +4110,23 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca if (!noOff) { bufferHt++; bufferWi++; - } - else { + } else { bufferHt = std::round(maxY - minY + 1.0f); bufferWi = std::round(maxX - minX + 1.0f); } - //DumpBuffer(newNodes, bufferWi, bufferHt); - } - else { + // DumpBuffer(newNodes, bufferWi, bufferHt); + } else { bufferHt = this->BufferHt; bufferWi = this->BufferWi; } // Zero buffer sizes are bad // This can happen when a strand is zero length ... maybe also a custom model with no nodes - if (bufferHt == 0) - { + if (bufferHt == 0) { logger_base.warn("Model::InitRenderBufferNodes BufferHt was 0 ... overridden to be 1."); bufferHt = 1; } - if (bufferWi == 0) - { + if (bufferWi == 0) { logger_base.warn("Model::InitRenderBufferNodes BufferWi was 0 ... overridden to be 1."); bufferWi = 1; } @@ -4139,7 +4134,8 @@ void Model::InitRenderBufferNodes(const std::string &type, const std::string &ca ApplyTransform(transform, newNodes, bufferWi, bufferHt); } -std::string Model::GetNextName() { +std::string Model::GetNextName() +{ if (nodeNames.size() > Nodes.size()) { return nodeNames[Nodes.size()]; } @@ -4151,84 +4147,84 @@ bool Model::FourChannelNodes() const // true if string contains WRGB or any variant thereof // I do the W search first to try to abort quickly for strings unlikely to be 4 channel return (Contains(StringType, "W") && - (Contains(StringType, "RGBW") || - Contains(StringType, "WRGB") || - Contains(StringType, "WRBG") || - Contains(StringType, "RBGW") || - Contains(StringType, "WGRB") || - Contains(StringType, "GRBW") || - Contains(StringType, "WGBR") || - Contains(StringType, "GBRW") || - Contains(StringType, "WBRG") || - Contains(StringType, "BRGW") || - Contains(StringType, "WBGR") || - Contains(StringType, "BGRW"))); -} - -std::list Model::GetShadowedBy() const { + (Contains(StringType, "RGBW") || + Contains(StringType, "WRGB") || + Contains(StringType, "WRBG") || + Contains(StringType, "RBGW") || + Contains(StringType, "WGRB") || + Contains(StringType, "GRBW") || + Contains(StringType, "WGBR") || + Contains(StringType, "GBRW") || + Contains(StringType, "WBRG") || + Contains(StringType, "BRGW") || + Contains(StringType, "WBGR") || + Contains(StringType, "BGRW"))); +} + +std::list Model::GetShadowedBy() const +{ return GetModelManager().GetModelsShadowing(this); } // set size of Nodes vector and each Node's Coords vector -void Model::SetNodeCount(size_t NumStrings, size_t NodesPerString, const std::string &rgbOrder) { +void Model::SetNodeCount(size_t NumStrings, size_t NodesPerString, const std::string& rgbOrder) +{ size_t n; if (SingleNode) { - if (StringType=="Single Color Red") { - for(n = 0; n < NumStrings; n++) { + if (StringType == "Single Color Red") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassRed(n, NodesPerString, GetNextName()))); Nodes.back()->model = this; } - } else if (StringType=="Single Color Green") { - for(n = 0; n < NumStrings; n++) { + } else if (StringType == "Single Color Green") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassGreen(n, NodesPerString, GetNextName()))); Nodes.back()->model = this; } - } - else if (StringType == "Superstring") { - for (n = 0; n < NumStrings; n++) { + } else if (StringType == "Superstring") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassSuperString(n, NodesPerString, superStringColours, rgbwHandlingType, GetNextName()))); Nodes.back()->model = this; } - } else if (StringType=="Single Color Blue") { - for(n = 0; n < NumStrings; n++) { + } else if (StringType == "Single Color Blue") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassBlue(n, NodesPerString, GetNextName()))); Nodes.back()->model = this; } - } else if (StringType=="Single Color White") { - for(n = 0; n < NumStrings; n++) { + } else if (StringType == "Single Color White") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassWhite(n, NodesPerString, GetNextName()))); Nodes.back()->model = this; } - } else if (StringType=="Strobes White 3fps" || StringType=="Strobes") { - StrobeRate=7; // 1 out of every 7 frames - for(n = 0; n < NumStrings; n++) { + } else if (StringType == "Strobes White 3fps" || StringType == "Strobes") { + StrobeRate = 7; // 1 out of every 7 frames + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassWhite(n, NodesPerString, GetNextName()))); Nodes.back()->model = this; } - } else if (StringType=="Single Color Custom") { - for(n = 0; n < NumStrings; n++) { + } else if (StringType == "Single Color Custom") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassCustom(n, NodesPerString, customColor, GetNextName()))); Nodes.back()->model = this; } - } else if (StringType=="Single Color Intensity") { - for(n = 0; n < NumStrings; n++) { + } else if (StringType == "Single Color Intensity") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassIntensity(n, NodesPerString, customColor, GetNextName()))); Nodes.back()->model = this; } - } else if (StringType=="4 Channel RGBW") { - for(n = 0; n < NumStrings; n++) { + } else if (StringType == "4 Channel RGBW") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassRGBW(n, NodesPerString, "RGB", true, rgbwHandlingType, GetNextName()))); Nodes.back()->model = this; } - } - else if (StringType == "4 Channel WRGB") { - for (n = 0; n < NumStrings; n++) { + } else if (StringType == "4 Channel WRGB") { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassRGBW(n, NodesPerString, "RGB", false, rgbwHandlingType, GetNextName()))); Nodes.back()->model = this; } } else { // 3 Channel RGB - for(n = 0; n < NumStrings; n++) { + for (n = 0; n < NumStrings; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeBaseClass(n, NodesPerString, "RGB", GetNextName()))); Nodes.back()->model = this; } @@ -4236,39 +4232,37 @@ void Model::SetNodeCount(size_t NumStrings, size_t NodesPerString, const std::st } else if (NodesPerString == 0) { if (StringType == "Node Single Color") { Nodes.push_back(NodeBaseClassPtr(new NodeClassCustom(0, 0, customColor, GetNextName()))); - } - else if (FourChannelNodes()) { + } else if (FourChannelNodes()) { bool wLast = StringType[3] == 'W'; Nodes.push_back(NodeBaseClassPtr(new NodeClassRGBW(0, 0, rgbOrder, wLast, rgbwHandlingType, GetNextName()))); - } - else { + } else { Nodes.push_back(NodeBaseClassPtr(new NodeBaseClass(0, 0, rgbOrder, GetNextName()))); } Nodes.back()->model = this; } else if (StringType[3] == ' ') { size_t numnodes = NumStrings * NodesPerString; - for(n = 0; n < numnodes; n++) { - Nodes.push_back(NodeBaseClassPtr(new NodeBaseClass(n/NodesPerString, 1, rgbOrder, GetNextName()))); + for (n = 0; n < numnodes; ++n) { + Nodes.push_back(NodeBaseClassPtr(new NodeBaseClass(n / NodesPerString, 1, rgbOrder, GetNextName()))); Nodes.back()->model = this; } - } - else if (StringType == "Node Single Color") { + } else if (StringType == "Node Single Color") { size_t numnodes = NumStrings * NodesPerString; - for (n = 0; n < numnodes; n++) { - Nodes.push_back(NodeBaseClassPtr(new NodeClassCustom(n/NodesPerString, 1, customColor, GetNextName()))); + for (n = 0; n < numnodes; ++n) { + Nodes.push_back(NodeBaseClassPtr(new NodeClassCustom(n / NodesPerString, 1, customColor, GetNextName()))); Nodes.back()->model = this; } } else { bool wLast = StringType[3] == 'W'; size_t numnodes = NumStrings * NodesPerString; - for (n = 0; n < numnodes; n++) { + for (n = 0; n < numnodes; ++n) { Nodes.push_back(NodeBaseClassPtr(new NodeClassRGBW(n / NodesPerString, 1, rgbOrder, wLast, rgbwHandlingType, GetNextName()))); Nodes.back()->model = this; } } } -size_t Model::GetNodeChannelCount(const std::string & nodeType) const { +size_t Model::GetNodeChannelCount(const std::string& nodeType) const +{ if (nodeType.compare(0, 12, "Single Color") == 0) { return 1; } else if (nodeType == "Strobes White 3fps") { @@ -4279,14 +4273,12 @@ size_t Model::GetNodeChannelCount(const std::string & nodeType) const { return 4; } else if (nodeType == "4 Channel WRGB") { return 4; - } else if (nodeType[0] == 'W' || nodeType [3] == 'W') { - //various WRGB and RGBW types + } else if (nodeType[0] == 'W' || nodeType[3] == 'W') { + // various WRGB and RGBW types return 4; - } - else if (nodeType == "Superstring") { + } else if (nodeType == "Superstring") { return std::max(1, (int)superStringColours.size()); - } - else if (nodeType == "Node Single Color") { + } else if (nodeType == "Node Single Color") { return 1; } return 3; @@ -4300,12 +4292,13 @@ void Model::AddLayerSizeProperty(wxPropertyGridInterface* grid) psn->SetEditor("SpinCtrl"); if (GetLayerSizeCount() > 1) { - for (int i = 0; i < GetLayerSizeCount(); i++) - { + for (int i = 0; i < GetLayerSizeCount(); ++i) { wxString id = wxString::Format("Layer%d", i); wxString nm = wxString::Format("Layer %d", i + 1); - if (i == 0) nm = "Inside"; - else if (i == GetLayerSizeCount() - 1) nm = "Outside"; + if (i == 0) + nm = "Inside"; + else if (i == GetLayerSizeCount() - 1) + nm = "Outside"; wxPGProperty* pls = grid->AppendIn(psn, new wxUIntProperty(nm, id, GetLayerSize(i))); pls->SetAttribute("Min", 1); @@ -4332,8 +4325,7 @@ bool Model::HandleLayerSizePropertyChange(wxPropertyGridInterface* grid, wxPrope OnLayerSizesChange(true); return true; - } - else if (event.GetPropertyName().StartsWith("Layers.Layer")) { + } else if (event.GetPropertyName().StartsWith("Layers.Layer")) { int layer = wxAtoi(event.GetPropertyName().AfterLast('r')); SetLayerSize(layer, event.GetValue().GetLong()); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::HandleLayerSizePropertyChange::Layer"); @@ -4365,7 +4357,7 @@ bool Model::ContainsChannel(uint32_t startChannel, uint32_t endChannel) const bool Model::ContainsChannel(int strand, uint32_t startChannel, uint32_t endChannel) const { uint32_t sc = GetChannelForNode(strand, 0); - uint32_t ec = GetChannelForNode(strand, GetStrandLength(strand)-1) + GetChanCountPerNode() - 1; + uint32_t ec = GetChannelForNode(strand, GetStrandLength(strand) - 1) + GetChanCountPerNode() - 1; return !(endChannel < sc || startChannel > ec); } @@ -4458,7 +4450,8 @@ uint32_t Model::GetNodeNumber(int bufY, int bufX) const return -1; } -uint32_t Model::GetNodeCount() const { +uint32_t Model::GetNodeCount() const +{ return Nodes.size(); } @@ -4470,22 +4463,23 @@ uint32_t Model::GetActChanCount() const } uint32_t count = 0; - for (uint32_t x = 0; x < NodeCnt; x++) { + for (uint32_t x = 0; x < NodeCnt; ++x) { count += Nodes[x]->GetChanCount(); } return count; } -uint32_t Model::GetChanCount() const { - size_t NodeCnt=GetNodeCount(); +uint32_t Model::GetChanCount() const +{ + size_t NodeCnt = GetNodeCount(); if (NodeCnt == 0) { return 0; } int min = 999999999; int max = 0; - for (int x = 0; x < NodeCnt; x++) { + for (int x = 0; x < NodeCnt; ++x) { int i = Nodes[x]->ActChan; if (i < min) { min = i; @@ -4506,7 +4500,8 @@ NodeBaseClass* Model::GetNode(uint32_t node) const return nullptr; } -int Model::GetChanCountPerNode() const { +int Model::GetChanCountPerNode() const +{ size_t NodeCnt = GetNodeCount(); if (NodeCnt == 0) { return 0; @@ -4514,38 +4509,45 @@ int Model::GetChanCountPerNode() const { return Nodes[0]->GetChanCount(); } -uint32_t Model::GetCoordCount(size_t nodenum) const { +uint32_t Model::GetCoordCount(size_t nodenum) const +{ return nodenum < Nodes.size() ? Nodes[nodenum]->Coords.size() : 0; } -int Model::GetNodeStringNumber(size_t nodenum) const { +int Model::GetNodeStringNumber(size_t nodenum) const +{ return nodenum < Nodes.size() ? Nodes[nodenum]->StringNum : 0; } -void Model::GetNode3DScreenCoords(int nodeidx, std::vector>& pts) { - for (int x = 0; x < Nodes[nodeidx]->Coords.size(); x++) { +void Model::GetNode3DScreenCoords(int nodeidx, std::vector>& pts) +{ + for (int x = 0; x < Nodes[nodeidx]->Coords.size(); ++x) { pts.push_back(std::make_tuple(Nodes[nodeidx]->Coords[x].screenX, Nodes[nodeidx]->Coords[x].screenY, Nodes[nodeidx]->Coords[x].screenZ)); } } -void Model::GetNodeCoords(int nodeidx, std::vector &pts) { - if (nodeidx >= Nodes.size()) return; - for (int x = 0; x < Nodes[nodeidx]->Coords.size(); x++) { +void Model::GetNodeCoords(int nodeidx, std::vector& pts) +{ + if (nodeidx >= Nodes.size()) + return; + for (int x = 0; x < Nodes[nodeidx]->Coords.size(); ++x) { pts.push_back(wxPoint(Nodes[nodeidx]->Coords[x].bufX, Nodes[nodeidx]->Coords[x].bufY)); } } -bool Model::IsCustom(void) { +bool Model::IsCustom(void) +{ return (DisplayAs == "Custom"); } -//convert # to AA format so it matches Custom Model grid display: -//this makes it *so* much easier to visually compare with Custom Model grid display -//A - Z == 1 - 26 -//AA - AZ == 27 - 52 -//BA - BZ == 53 - 78 -//etc -static wxString AA(int x) { +// convert # to AA format so it matches Custom Model grid display: +// this makes it *so* much easier to visually compare with Custom Model grid display +// A - Z == 1 - 26 +// AA - AZ == 27 - 52 +// BA - BZ == 53 - 78 +// etc +static wxString AA(int x) +{ wxString retval; --x; // if (x >= 26 * 26) { retval += 'A' + x / (26 * 26); x %= 26 * 26; } @@ -4557,9 +4559,10 @@ static wxString AA(int x) { return retval; } -//add just the node#s to a choice list: -//NO add parsed info to choice list or check list box: -size_t Model::GetChannelCoords(wxArrayString& choices) { //wxChoice* choices1, wxCheckListBox* choices2, wxListBox* choices3) +// add just the node#s to a choice list: +// NO add parsed info to choice list or check list box: +size_t Model::GetChannelCoords(wxArrayString& choices) +{ // wxChoice* choices1, wxCheckListBox* choices2, wxListBox* choices3) // if (choices1) choices1->Clear(); // if (choices2) choices2->Clear(); // if (choices3) choices3->Clear(); @@ -4567,10 +4570,11 @@ size_t Model::GetChannelCoords(wxArrayString& choices) { //wxChoice* choices1, w // if (choices2) choices2->Append(wxT("0: (none)")); // if (choices3) choices3->Append(wxT("0: (none)")); size_t NodeCount = GetNodeCount(); - for (size_t n = 0; n < NodeCount; n++) { + for (size_t n = 0; n < NodeCount; ++n) { wxString newstr; // debug(10, "model::node[%d/%d]: #coords %d, ach# %d, str %d", n, NodeCount, Nodes[n]->Coords.size(), Nodes[n]->StringNum, Nodes[n]->ActChan); - if (Nodes[n]->Coords.empty()) continue; + if (Nodes[n]->Coords.empty()) + continue; // newstr = wxString::Format(wxT("%i"), GetNodeNumber(n)); // choices.Add(newstr); choices.Add(GetNodeXY(n)); @@ -4582,56 +4586,67 @@ size_t Model::GetChannelCoords(wxArrayString& choices) { //wxChoice* choices1, w // choices3->InsertItems(strary, choices3->GetCount() + 0); // } } - return choices.GetCount(); //choices1? choices1->GetCount(): 0) + (choices2? choices2->GetCount(): 0); + return choices.GetCount(); // choices1? choices1->GetCount(): 0) + (choices2? choices2->GetCount(): 0); } -//get parsed node info: -std::string Model::GetNodeXY(const std::string& nodenumstr) { +// get parsed node info: +std::string Model::GetNodeXY(const std::string& nodenumstr) +{ size_t NodeCount = GetNodeCount(); try { int32_t nodenum = std::stod(nodenumstr); - for (size_t inx = 0; inx < NodeCount; inx++) { - if (Nodes[inx]->Coords.empty()) continue; - if (GetNodeNumber(inx) == nodenum) return GetNodeXY(inx); + for (size_t inx = 0; inx < NodeCount; ++inx) { + if (Nodes[inx]->Coords.empty()) + continue; + if (GetNodeNumber(inx) == nodenum) + return GetNodeXY(inx); } - } catch ( ... ) { - + } catch (...) { } - return nodenumstr; //not found? + return nodenumstr; // not found? } -std::string Model::GetNodeXY(int nodeinx) { - if ((nodeinx < 0) || (nodeinx >= (int)GetNodeCount())) return ""; - if (Nodes[nodeinx]->Coords.empty()) return ""; - if (GetCoordCount(nodeinx) > 1) //show count and first + last coordinates +std::string Model::GetNodeXY(int nodeinx) +{ + if ((nodeinx < 0) || (nodeinx >= (int)GetNodeCount())) + return ""; + if (Nodes[nodeinx]->Coords.empty()) + return ""; + if (GetCoordCount(nodeinx) > 1) // show count and first + last coordinates + if (IsCustom()) + return wxString::Format(wxT("%d: %d# @%s%d-%s%d"), GetNodeNumber(nodeinx), GetCoordCount(nodeinx), AA(Nodes[nodeinx]->Coords.front().bufX + 1), BufferHt - Nodes[nodeinx]->Coords.front().bufY, AA(Nodes[nodeinx]->Coords.back().bufX + 1), BufferHt - Nodes[nodeinx]->Coords.back().bufY).ToStdString(); // NOTE: only need first (X,Y) for each channel, but show last and count as well; Y is in reverse order + else + return wxString::Format(wxT("%d: %d# @(%d,%d)-(%d,%d"), GetNodeNumber(nodeinx), GetCoordCount(nodeinx), Nodes[nodeinx]->Coords.front().bufX + 1, BufferHt - Nodes[nodeinx]->Coords.front().bufY, Nodes[nodeinx]->Coords.back().bufX + 1, BufferHt - Nodes[nodeinx]->Coords.back().bufY).ToStdString(); // NOTE: only need first (X,Y) for each channel, but show last and count as well; Y is in reverse order + else // just show singleton if (IsCustom()) - return wxString::Format(wxT("%d: %d# @%s%d-%s%d"), GetNodeNumber(nodeinx), GetCoordCount(nodeinx), AA(Nodes[nodeinx]->Coords.front().bufX + 1), BufferHt - Nodes[nodeinx]->Coords.front().bufY, AA(Nodes[nodeinx]->Coords.back().bufX + 1), BufferHt - Nodes[nodeinx]->Coords.back().bufY).ToStdString(); //NOTE: only need first (X,Y) for each channel, but show last and count as well; Y is in reverse order + return wxString::Format(wxT("%d: @%s%d"), GetNodeNumber(nodeinx), AA(Nodes[nodeinx]->Coords.front().bufX + 1), BufferHt - Nodes[nodeinx]->Coords.front().bufY).ToStdString(); else - return wxString::Format(wxT("%d: %d# @(%d,%d)-(%d,%d"), GetNodeNumber(nodeinx), GetCoordCount(nodeinx), Nodes[nodeinx]->Coords.front().bufX + 1, BufferHt - Nodes[nodeinx]->Coords.front().bufY, Nodes[nodeinx]->Coords.back().bufX + 1, BufferHt - Nodes[nodeinx]->Coords.back().bufY).ToStdString(); //NOTE: only need first (X,Y) for each channel, but show last and count as well; Y is in reverse order - else //just show singleton - if (IsCustom()) - return wxString::Format(wxT("%d: @%s%d"), GetNodeNumber(nodeinx), AA(Nodes[nodeinx]->Coords.front().bufX + 1), BufferHt - Nodes[nodeinx]->Coords.front().bufY).ToStdString(); - else - return wxString::Format(wxT("%d: @(%d,%d)"), GetNodeNumber(nodeinx), Nodes[nodeinx]->Coords.front().bufX + 1, BufferHt - Nodes[nodeinx]->Coords.front().bufY).ToStdString(); + return wxString::Format(wxT("%d: @(%d,%d)"), GetNodeNumber(nodeinx), Nodes[nodeinx]->Coords.front().bufX + 1, BufferHt - Nodes[nodeinx]->Coords.front().bufY).ToStdString(); } -//extract first (X,Y) from string formatted above: -bool Model::ParseFaceElement(const std::string& multi_str, std::vector& first_xy) { +// extract first (X,Y) from string formatted above: +bool Model::ParseFaceElement(const std::string& multi_str, std::vector& first_xy) +{ // first_xy->x = first_xy->y = 0; // first_xy.clear(); wxStringTokenizer wtkz(multi_str, "+"); while (wtkz.HasMoreTokens()) { wxString str = wtkz.GetNextToken(); - if (str.empty()) continue; - if (str.Find('@') == wxNOT_FOUND) continue; //return false; + if (str.empty()) + continue; + if (str.Find('@') == wxNOT_FOUND) + continue; // return false; wxString xystr = str.AfterFirst('@'); - if (xystr.empty()) continue; //return false; + if (xystr.empty()) + continue; // return false; long xval = 0, yval = 0; if (xystr[0] == '(') { xystr.Remove(0, 1); - if (!xystr.BeforeFirst(',').ToLong(&xval)) continue; //return false; - if (!xystr.AfterFirst(',').BeforeFirst(')').ToLong(&yval)) continue; //return false; + if (!xystr.BeforeFirst(',').ToLong(&xval)) + continue; // return false; + if (!xystr.AfterFirst(',').BeforeFirst(')').ToLong(&yval)) + continue; // return false; } else { int parts = 0; while (!xystr.empty() && (xystr[0] >= 'A') && (xystr[0] <= 'Z')) { @@ -4646,35 +4661,42 @@ bool Model::ParseFaceElement(const std::string& multi_str, std::vector& xystr.Remove(0, 1); parts |= 2; } - if (parts != 3) continue; //return false; - if (!xystr.empty() && (xystr[0] != '-')) continue; //return false; + if (parts != 3) + continue; // return false; + if (!xystr.empty() && (xystr[0] != '-')) + continue; // return false; } wxPoint newxy(xval, yval); first_xy.push_back(newxy); } - return !first_xy.empty(); //true; + return !first_xy.empty(); // true; } -//extract first (X,Y) from string formatted above: -bool Model::ParseStateElement(const std::string& multi_str, std::vector& first_xy) { +// extract first (X,Y) from string formatted above: +bool Model::ParseStateElement(const std::string& multi_str, std::vector& first_xy) +{ // first_xy->x = first_xy->y = 0; // first_xy.clear(); wxStringTokenizer wtkz(multi_str, "+"); while (wtkz.HasMoreTokens()) { wxString str = wtkz.GetNextToken(); - if (str.empty()) continue; - if (str.Find('@') == wxNOT_FOUND) continue; //return false; + if (str.empty()) + continue; + if (str.Find('@') == wxNOT_FOUND) + continue; // return false; wxString xystr = str.AfterFirst('@'); - if (xystr.empty()) continue; //return false; + if (xystr.empty()) + continue; // return false; long xval = 0, yval = 0; if (xystr[0] == '(') { xystr.Remove(0, 1); - if (!xystr.BeforeFirst(',').ToLong(&xval)) continue; //return false; - if (!xystr.AfterFirst(',').BeforeFirst(')').ToLong(&yval)) continue; //return false; - } - else { + if (!xystr.BeforeFirst(',').ToLong(&xval)) + continue; // return false; + if (!xystr.AfterFirst(',').BeforeFirst(')').ToLong(&yval)) + continue; // return false; + } else { int parts = 0; while (!xystr.empty() && (xystr[0] >= 'A') && (xystr[0] <= 'Z')) { xval *= 26; @@ -4688,14 +4710,16 @@ bool Model::ParseStateElement(const std::string& multi_str, std::vector xystr.Remove(0, 1); parts |= 2; } - if (parts != 3) continue; //return false; - if (!xystr.empty() && (xystr[0] != '-')) continue; //return false; + if (parts != 3) + continue; // return false; + if (!xystr.empty() && (xystr[0] != '-')) + continue; // return false; } wxPoint newxy(xval, yval); first_xy.push_back(newxy); } - return !first_xy.empty(); //true; + return !first_xy.empty(); // true; } void Model::ExportAsCustomXModel() const @@ -4720,7 +4744,7 @@ void Model::ExportAsCustomXModel() const float maxsy = -1; size_t nodeCount = GetNodeCount(); - for (size_t i = 0; i < nodeCount; i++) { + for (size_t i = 0; i < nodeCount; ++i) { float Sbufx = Nodes[i]->Coords[0].screenX; float Sbufy = Nodes[i]->Coords[0].screenY; if (Sbufx < minsx) @@ -4861,8 +4885,7 @@ void Model::ImportSuperStringColours(wxXmlNode* root) auto an = wxString::Format("SuperStringColour%d", index); if (root->HasAttribute(an)) { superStringColours.push_back(xlColor(root->GetAttribute(an))); - } - else { + } else { found = false; } @@ -4878,8 +4901,8 @@ bool Model::FindCustomModelScale(int scale) const if (nodeCount <= 1) { return true; } - for (int i = 0; i < nodeCount; i++) { - for (int j = i + 1; j < nodeCount; j++) { + for (int i = 0; i < nodeCount; ++i) { + for (int j = i + 1; j < nodeCount; ++j) { int x1 = (Nodes[i]->Coords[0].screenX * scale); int y1 = (Nodes[i]->Coords[0].screenY * scale); int x2 = (Nodes[j]->Coords[0].screenX * scale); @@ -4895,16 +4918,15 @@ bool Model::FindCustomModelScale(int scale) const std::string Model::GetStartLocation() const { if (!IsLtoR) { - if (!isBotToTop) - return "Top Right"; - else - return "Bottom Right"; - } - else { - if (!isBotToTop) - return "Top Left"; - else - return "Bottom Left"; + if (!isBotToTop) + return "Top Right"; + else + return "Bottom Right"; + } else { + if (!isBotToTop) + return "Top Left"; + else + return "Bottom Left"; } } @@ -4945,7 +4967,7 @@ std::string Model::ChannelLayoutHtml(OutputManager* outputManager) if (BufferHt == 1) { // single line or arch or cane html += ""; - for (size_t i = 1; i <= NodeCount; i++) { + for (size_t i = 1; i <= NodeCount; ++i) { int n = IsLtoR ? i : NodeCount - i + 1; int s = Nodes[n - 1]->StringNum + 1; wxString bgcolor = s % 2 == 1 ? "#ADD8E6" : "#90EE90"; @@ -4957,7 +4979,7 @@ std::string Model::ChannelLayoutHtml(OutputManager* outputManager) html += ""; } else if (BufferHt > 1) { // horizontal or vertical matrix or frame - for (size_t i = 0; i < NodeCount; i++) { + for (size_t i = 0; i < NodeCount; ++i) { size_t idx = Nodes[i]->Coords[0].bufY * BufferWi + Nodes[i]->Coords[0].bufX; if (idx < chmap.size()) { chmap[idx] = i + 1; @@ -4965,7 +4987,7 @@ std::string Model::ChannelLayoutHtml(OutputManager* outputManager) } for (int y = BufferHt - 1; y >= 0; y--) { html += ""; - for (int x = 0; x < BufferWi; x++) { + for (int x = 0; x < BufferWi; ++x) { int n = chmap[y * BufferWi + x]; if (n == 0) { html += ""; @@ -4993,9 +5015,9 @@ void Model::CopyBufCoord2ScreenCoord() size_t NodeCount = GetNodeCount(); int xoffset = BufferWi / 2; int yoffset = BufferHt / 2; - for (size_t n = 0; n < NodeCount; n++) { + for (size_t n = 0; n < NodeCount; ++n) { size_t CoordCount = GetCoordCount(n); - for (size_t c = 0; c < CoordCount; c++) { + for (size_t c = 0; c < CoordCount; ++c) { Nodes[n]->Coords[c].screenX = Nodes[n]->Coords[c].bufX - xoffset; Nodes[n]->Coords[c].screenY = Nodes[n]->Coords[c].bufY - yoffset; } @@ -5019,7 +5041,8 @@ bool Model::HitTest(ModelPreview* preview, glm::vec3& ray_origin, glm::vec3& ray return GetModelScreenLocation().HitTest(ray_origin, ray_direction); } -wxCursor Model::InitializeLocation(int &handle, wxCoord x, wxCoord y, ModelPreview* preview) { +wxCursor Model::InitializeLocation(int& handle, wxCoord x, wxCoord y, ModelPreview* preview) +{ return GetModelScreenLocation().InitializeLocation(handle, x, y, Nodes, preview); } @@ -5033,7 +5056,7 @@ void Model::ApplyTransparency(xlColor& color, int transparency, int blackTranspa int i = std::floor(t); colorAlpha = i > 255 ? 255 : (i < 0 ? 0 : i); } - } else if (transparency || blackTransparency){ + } else if (transparency || blackTransparency) { int maxCol = std::max(color.red, std::max(color.green, color.blue)); if (transparency) { float t = 100.0f - transparency; @@ -5041,7 +5064,7 @@ void Model::ApplyTransparency(xlColor& color, int transparency, int blackTranspa colorAlpha = std::floor(t); } if (maxCol < 64 && blackTransparency) { - //if we're getting close to black, we'll start migrating toward the black's transparency setting + // if we're getting close to black, we'll start migrating toward the black's transparency setting float t = 100.0f - blackTransparency; t *= 2.55f; int blackAlpha = std::floor(t); @@ -5053,11 +5076,13 @@ void Model::ApplyTransparency(xlColor& color, int transparency, int blackTranspa color.alpha = colorAlpha; } -void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, xlGraphicsProgram *solidProgram, xlGraphicsProgram *transparentProgram, bool is_3d, - const xlColor* c, bool allowSelected, bool wiring, bool highlightFirst, int highlightpixel, - float *boundingBox) { - - if (!IsActive() && preview->IsNoCurrentModel()) { return; } +void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext* ctx, xlGraphicsProgram* solidProgram, xlGraphicsProgram* transparentProgram, bool is_3d, + const xlColor* c, bool allowSelected, bool wiring, bool highlightFirst, int highlightpixel, + float* boundingBox) +{ + if (!IsActive() && preview->IsNoCurrentModel()) { + return; + } size_t NodeCount = Nodes.size(); xlColor color; xlColor saveColor; @@ -5072,9 +5097,9 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, ModelScreenLocation& screenLocation = GetModelScreenLocation(); screenLocation.PrepareToDraw(is_3d, allowSelected); - const std::string &cacheKey = allowSelected - ? (is_3d ? LAYOUT_PREVIEW_CACHE_3D : LAYOUT_PREVIEW_CACHE_2D) - : (is_3d ? MODEL_PREVIEW_CACHE_3D : MODEL_PREVIEW_CACHE_2D); + const std::string& cacheKey = allowSelected + ? (is_3d ? LAYOUT_PREVIEW_CACHE_3D : LAYOUT_PREVIEW_CACHE_2D) + : (is_3d ? MODEL_PREVIEW_CACHE_3D : MODEL_PREVIEW_CACHE_2D); if (uiObjectsInvalid) { deleteUIObjects(); } @@ -5092,7 +5117,7 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, for (const auto& it : Nodes) { vcount += it.get()->Coords.size(); } - if (_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SOLID_CIRCLE || _pixelStyle == PIXEL_STYLE::PIXEL_STYLE_BLENDED_CIRCLE) { + if (_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SOLID_CIRCLE || _pixelStyle == PIXEL_STYLE::PIXEL_STYLE_BLENDED_CIRCLE) { int f = pixelSize; if (pixelSize < 16) { f = 16; @@ -5114,8 +5139,8 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, cache->vica->SetColorCount(_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_BLENDED_CIRCLE ? NodeCount * 2 : NodeCount); float modelPixelSize = pixelSize; - //pixelSize is in world coordinate sizes, not model size. Thus, we need to reverse the matrices to - //get the size to use for the pixelStyle 3/4 that use triangles + // pixelSize is in world coordinate sizes, not model size. Thus, we need to reverse the matrices to + // get the size to use for the pixelStyle 3/4 that use triangles if (_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SOLID_CIRCLE || _pixelStyle == PIXEL_STYLE::PIXEL_STYLE_BLENDED_CIRCLE) { modelPixelSize = preview->calcPixelSize(pixelSize); @@ -5125,17 +5150,16 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, GetModelScreenLocation().TranslatePoint(x2, y2, z2); glm::vec3 a = glm::vec3(x2, y2, z2) - glm::vec3(x1, y1, z1); - float length =std::max(std::max(std::abs(a.x), std::abs(a.y)), std::abs(a.z)); + float length = std::max(std::max(std::abs(a.x), std::abs(a.y)), std::abs(a.z)); modelPixelSize /= std::abs(length); } - int first = 0; int last = NodeCount; int buffFirst = -1; int buffLast = -1; bool left = true; - //int lastChan = -999; + // int lastChan = -999; while (first < last) { int n; if (left) { @@ -5160,8 +5184,8 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, } } - size_t CoordCount=GetCoordCount(n); - for(size_t c2=0; c2 < CoordCount; ++c2) { + size_t CoordCount = GetCoordCount(n); + for (size_t c2 = 0; c2 < CoordCount; ++c2) { // draw node on screen float sx = Nodes[n]->Coords[c2].screenX; float sy = Nodes[n]->Coords[c2].screenY; @@ -5193,20 +5217,20 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, } } - //lastChan = Nodes[n]->ActChan; + // lastChan = Nodes[n]->ActChan; } - cache->program->addStep([=](xlGraphicsContext *ctx) { + cache->program->addStep([=](xlGraphicsContext* ctx) { if (_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SOLID_CIRCLE || _pixelStyle == PIXEL_STYLE::PIXEL_STYLE_BLENDED_CIRCLE) { ctx->drawTriangles(cache->vica, 0, cache->vica->getCount()); } else { - ModelPreview *preview = (ModelPreview *)ctx->getWindow(); + ModelPreview* preview = (ModelPreview*)ctx->getWindow(); float pointSize = preview->calcPixelSize(pixelSize); ctx->drawPoints(cache->vica, pointSize, _pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SMOOTH, 0, cache->vica->getCount()); } }); } for (int n = 0; n < NodeCount; ++n) { - if (n+1 == highlightpixel) { + if (n + 1 == highlightpixel) { color = xlMAGENTA; } else if (highlightFirst && Nodes.size() > 1) { if (IsNodeFirst(n)) { @@ -5247,12 +5271,12 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, boundingBox[4] = cache->boundingBox[4]; boundingBox[5] = cache->boundingBox[5]; } - xlGraphicsProgram *p = cache->isTransparent ? transparentProgram : solidProgram; + xlGraphicsProgram* p = cache->isTransparent ? transparentProgram : solidProgram; if (wiring && NodeCount > 1 && cache->va == nullptr) { cache->va = ctx->createVertexAccumulator(); cache->va->SetName(GetName() + (is_3d ? " - 3DPWiring" : " - 2DWiring")); cache->va->PreAlloc(NodeCount); - for (int x = 0; x < NodeCount; x++) { + for (int x = 0; x < NodeCount; ++x) { float sx = Nodes[x]->Coords[0].screenX; float sy = Nodes[x]->Coords[0].screenY; float sz = Nodes[x]->Coords[0].screenZ; @@ -5261,12 +5285,12 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, cache->va->Finalize(false); } - p->addStep([=](xlGraphicsContext *ctx) { + p->addStep([=](xlGraphicsContext* ctx) { // cache has the model in model coordinates // we need to scale/translate/etc.... to world ctx->PushMatrix(); if (!is_3d) { - //not 3d, flatten to the 0 plane + // not 3d, flatten to the 0 plane ctx->Scale(1.0, 1.0, 0.0); } GetModelScreenLocation().ApplyModelViewMatrices(ctx); @@ -5277,7 +5301,6 @@ void Model::DisplayModelOnWindow(ModelPreview* preview, xlGraphicsContext *ctx, ctx->PopMatrix(); }); - if ((Selected || (Highlighted && is_3d)) && c != nullptr && allowSelected) { if (is_3d) { GetModelScreenLocation().DrawHandles(transparentProgram, preview->GetCameraZoomForHandles(), preview->GetHandleScale(), Highlighted, IsFromBase()); @@ -5405,8 +5428,7 @@ std::vector Model::GetNodesInBoundingBox(ModelPreview* preview, wxPoint sta GetScreenLocation(sx, sy, it2, w, h, scale); if (sx >= startpx && sx <= endpx && - sy >= startpy && sy <= endpy) - { + sy >= startpy && sy <= endpy) { nodes.push_back(i); } } @@ -5417,8 +5439,9 @@ std::vector Model::GetNodesInBoundingBox(ModelPreview* preview, wxPoint sta bool Model::IsMultiCoordsPerNode() const { - for (const auto& it : Nodes) { - if (it.get()->Coords.size() > 1) return true; + for (const auto& it : Nodes) { + if (it.get()->Coords.size() > 1) + return true; } return false; } @@ -5463,8 +5486,7 @@ void Model::DisplayEffectOnWindow(ModelPreview* preview, double pointSize) // size indepentent and thus can be re-used unless the models rendeWi/Hi // changes (which should trigger the uiObjectsInvalid and clear // the cache anyway) - if (cache == nullptr || cache->renderWi != renderWi || cache->renderHi != renderHi - || cache->modelChangeCount != this->changeCount) { + if (cache == nullptr || cache->renderWi != renderWi || cache->renderHi != renderHi || cache->modelChangeCount != this->changeCount) { if (cache != nullptr) { delete cache; } @@ -5550,8 +5572,7 @@ void Model::DisplayEffectOnWindow(ModelPreview* preview, double pointSize) if (cache->vica->getCount() && (lastPixelStyle == PIXEL_STYLE::PIXEL_STYLE_SQUARE || lastPixelStyle == PIXEL_STYLE::PIXEL_STYLE_SMOOTH || Nodes[n]->model->_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SQUARE || - Nodes[n]->model->_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SMOOTH)) - { + Nodes[n]->model->_pixelStyle == PIXEL_STYLE::PIXEL_STYLE_SMOOTH)) { int count = cache->vica->getCount(); cache->program->addStep([=](xlGraphicsContext* ctx) { if (lastPixelStyle == PIXEL_STYLE::PIXEL_STYLE_SOLID_CIRCLE || lastPixelStyle == PIXEL_STYLE::PIXEL_STYLE_BLENDED_CIRCLE) { @@ -5643,8 +5664,8 @@ void Model::DisplayEffectOnWindow(ModelPreview* preview, double pointSize) } } -glm::vec3 Model::MoveHandle(ModelPreview* preview, int handle, bool ShiftKeyPressed, int mouseX,int mouseY) { - +glm::vec3 Model::MoveHandle(ModelPreview* preview, int handle, bool ShiftKeyPressed, int mouseX, int mouseY) +{ if (GetModelScreenLocation().IsLocked() || IsFromBase()) return GetModelScreenLocation().GetHandlePosition(handle); @@ -5658,60 +5679,69 @@ glm::vec3 Model::MoveHandle(ModelPreview* preview, int handle, bool ShiftKeyPres return GetModelScreenLocation().GetHandlePosition(handle); } -int Model::GetSelectedHandle() { +int Model::GetSelectedHandle() +{ return GetModelScreenLocation().GetSelectedHandle(); } -int Model::GetNumHandles() { +int Model::GetNumHandles() +{ return GetModelScreenLocation().GetNumHandles(); } -int Model::GetSelectedSegment() { +int Model::GetSelectedSegment() +{ return GetModelScreenLocation().GetSelectedSegment(); } -bool Model::SupportsCurves() { +bool Model::SupportsCurves() +{ return GetModelScreenLocation().SupportsCurves(); } -bool Model::HasCurve(int segment) { +bool Model::HasCurve(int segment) +{ return GetModelScreenLocation().HasCurve(segment); } -void Model::SetCurve(int segment, bool create) { +void Model::SetCurve(int segment, bool create) +{ return GetModelScreenLocation().SetCurve(segment, create); } -void Model::AddHandle(ModelPreview* preview, int mouseX, int mouseY) { +void Model::AddHandle(ModelPreview* preview, int mouseX, int mouseY) +{ GetModelScreenLocation().AddHandle(preview, mouseX, mouseY); } -void Model::InsertHandle(int after_handle, float zoom, int scale) { - +void Model::InsertHandle(int after_handle, float zoom, int scale) +{ if (GetModelScreenLocation().IsLocked() || IsFromBase()) return; GetModelScreenLocation().InsertHandle(after_handle, zoom, scale); } -void Model::DeleteHandle(int handle) { - +void Model::DeleteHandle(int handle) +{ if (GetModelScreenLocation().IsLocked() || IsFromBase()) return; GetModelScreenLocation().DeleteHandle(handle); } -int Model::GetStrandLength(int strand) const { - int numStrands = std::max( 1, GetNumStrands() ); +int Model::GetStrandLength(int strand) const +{ + int numStrands = std::max(1, GetNumStrands()); return GetNodeCount() / numStrands; } -int Model::MapToNodeIndex(int strand, int node) const { +int Model::MapToNodeIndex(int strand, int node) const +{ static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); - //if ((DisplayAs == wxT("Vert Matrix") || DisplayAs == wxT("Horiz Matrix") || DisplayAs == wxT("Matrix")) && SingleChannel) { - // return node; - //} + // if ((DisplayAs == wxT("Vert Matrix") || DisplayAs == wxT("Horiz Matrix") || DisplayAs == wxT("Matrix")) && SingleChannel) { + // return node; + // } if (GetNumStrands() == 1) { return node; } @@ -5747,7 +5777,7 @@ bool Model::RenameController(const std::string& oldName, const std::string& newN changed = true; } if (ModelXml->GetAttribute("Advanced") == "1") { - for (int i = 0; i < parm1; i++) { + for (int i = 0; i < parm1; ++i) { auto str = StartChanAttrName(i); if (ModelXml->HasAttribute(str)) { auto sc = ModelXml->GetAttribute(str); @@ -5781,15 +5811,12 @@ void Model::ImportModelChildren(wxXmlNode* root, xLightsFrame* xlights, wxString { bool merge = false; bool showPopup = true; - for (wxXmlNode* n = root->GetChildren(); n != nullptr; n = n->GetNext()) - { + for (wxXmlNode* n = root->GetChildren(); n != nullptr; n = n->GetNext()) { if (n->GetName() == "stateInfo") { AddState(n); - } - else if (n->GetName() == "subModel") { + } else if (n->GetName() == "subModel") { AddSubmodel(n); - } - else if (n->GetName() == "faceInfo") { + } else if (n->GetName() == "faceInfo") { AddFace(n); } else if (n->GetName() == "ControllerConnection") { if (n->HasAttribute("zigZag")) { @@ -5801,11 +5828,10 @@ void Model::ImportModelChildren(wxXmlNode* root, xLightsFrame* xlights, wxString } } else if (n->GetName() == "modelGroup") { AddModelGroups(n, xlights->GetLayoutPreview()->GetVirtualCanvasWidth(), - xlights->GetLayoutPreview()->GetVirtualCanvasHeight(), newname, merge, showPopup); + xlights->GetLayoutPreview()->GetVirtualCanvasHeight(), newname, merge, showPopup); } else if (n->GetName() == "shadowmodels") { ImportShadowModels(n, xlights); } else if (n->GetName() == "dimensions") { - if (RulerObject::GetRuler() != nullptr) { std::string units = n->GetAttribute("units", "mm"); float width = wxAtof(n->GetAttribute("width", "1000")); @@ -5848,7 +5874,8 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram return model; } } else { - if (prog != nullptr) prog->Hide(); + if (prog != nullptr) + prog->Hide(); xlights->SetCursor(wxCURSOR_DEFAULT); xlights->SuspendAutoSave(false); cancelled = true; @@ -5909,8 +5936,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram } } } - } - else if (name == modelName) { + } else if (name == modelName) { matches = true; newModelName = v["model"].AsString(); if (v.HasMember("block")) { @@ -5931,26 +5957,20 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram } if (dlg->FindModelFile(vendor, newModelName)) { if (localBlock) { - wxString msg = "'" + vendor + "' provides a certified model for '" + newModelName + "' in the xLights downloads. The " - + "vendor has requested that the model they provide be the model that is used." - + "Use the Vendor provided model instead?"; + wxString msg = "'" + vendor + "' provides a certified model for '" + newModelName + "' in the xLights downloads. The " + "vendor has requested that the model they provide be the model that is used." + "Use the Vendor provided model instead?"; if (wxMessageBox(msg, "Use Vendor Certified Model?", wxYES_NO | wxICON_QUESTION, xlights) == wxYES) { last_model = dlg->GetModelFile(); - } - else { + } else { last_model = ""; } docLoaded = false; break; - } - else if (!xlights->GetIgnoreVendorModelRecommendations()) { + } else if (!xlights->GetIgnoreVendorModelRecommendations()) { // I do not believe we should be saying xLights recommends this as fom what I have seen this claim on quality is historically dubious and I do not believe we have // ever actually assessed the quality of their models. My own experience has been the quality of some models is poor or worse. Others are fine. No vendor in // my experience is noticably better or worse than any other ... they all have had their poor models. // If you want to change the message back then have an OSX specific phrasing. - wxString msg = "xLights found a '" + vendor + "' provided and certified model for '" + newModelName + "' in the xLights downloads. The " - + "Vendor provided models are strongly recommended by the vendor due to their claimed quality and ease of use.\n\nWould you prefer to " - + "use the Vendor provided model instead?"; + wxString msg = "xLights found a '" + vendor + "' provided and certified model for '" + newModelName + "' in the xLights downloads. The " + "Vendor provided models are strongly recommended by the vendor due to their claimed quality and ease of use.\n\nWould you prefer to " + "use the Vendor provided model instead?"; if (wxMessageBox(msg, "Use Vendor Certified Model?", wxYES_NO | wxICON_QUESTION, xlights) == wxYES) { last_model = dlg->GetModelFile(); docLoaded = false; @@ -5973,9 +5993,9 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram } } } - #ifdef __WXMSW__ +#ifdef __WXMSW__ } - #endif +#endif } } } @@ -6006,7 +6026,8 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram } } - if (modes.size() == 0) break; + if (modes.size() == 0) + break; std::string mode = modes.begin()->first; if (modes.size() > 1) { @@ -6027,7 +6048,6 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram class DMXChannel { public: - class DMXValue { int ParseValue(wxString s, int channels) @@ -6039,8 +6059,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram return wxAtoi(ss[0]) << 8; } return wxAtoi(ss[0]); - } - else if (ss[1] == "2") { + } else if (ss[1] == "2") { wxASSERT(channels == 2); return wxAtoi(ss[0]); } @@ -6061,8 +6080,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram _low = ParseValue(n->GetAttribute("DMXFrom"), channels); if (nn == nullptr) { _high = _low; - } - else { + } else { _high = ParseValue(nn->GetAttribute("DMXFrom"), channels) - 1; } } @@ -6138,8 +6156,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram } if (isMovingHead) { model = xlights->AllModels.CreateDefaultModel("DmxMovingHead3D", startChannel); - } - else { + } else { model = xlights->AllModels.CreateDefaultModel("DmxMovingHead", startChannel); model->GetModelXml()->DeleteAttribute("DmxStyle"); model->GetModelXml()->AddAttribute("DmxStyle", "Moving Head Bars"); @@ -6162,34 +6179,28 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram } std::vector nodeNames = std::vector(channels); - std::map > stateInfo; + std::map> stateInfo; for (const auto& it : _channels) { if (it->_attribute == "Pan") { model->GetModelXml()->DeleteAttribute("DmxPanChannel"); model->GetModelXml()->AddAttribute("DmxPanChannel", wxString::Format("%d", it->_channelStart)); - } - else if (it->_attribute == "Tilt") { + } else if (it->_attribute == "Tilt") { model->GetModelXml()->DeleteAttribute("DmxTiltChannel"); model->GetModelXml()->AddAttribute("DmxTiltChannel", wxString::Format("%d", it->_channelStart)); - } - else if (it->_attribute == "ColorAdd_W") { + } else if (it->_attribute == "ColorAdd_W") { model->GetModelXml()->DeleteAttribute("DmxWhiteChannel"); model->GetModelXml()->AddAttribute("DmxWhiteChannel", wxString::Format("%d", it->_channelStart)); - } - else if (it->_attribute == "ColorRGB_Red" || it->_attribute == "ColorAdd_R") { + } else if (it->_attribute == "ColorRGB_Red" || it->_attribute == "ColorAdd_R") { model->GetModelXml()->DeleteAttribute("DmxRedChannel"); model->GetModelXml()->AddAttribute("DmxRedChannel", wxString::Format("%d", it->_channelStart)); - } - else if (it->_attribute == "ColorRGB_Green" || it->_attribute == "ColorAdd_G") { + } else if (it->_attribute == "ColorRGB_Green" || it->_attribute == "ColorAdd_G") { model->GetModelXml()->DeleteAttribute("DmxGreenChannel"); model->GetModelXml()->AddAttribute("DmxGreenChannel", wxString::Format("%d", it->_channelStart)); - } - else if (it->_attribute == "ColorRGB_Blue" || it->_attribute == "ColorAdd_B") { + } else if (it->_attribute == "ColorRGB_Blue" || it->_attribute == "ColorAdd_B") { model->GetModelXml()->DeleteAttribute("DmxBlueChannel"); model->GetModelXml()->AddAttribute("DmxBlueChannel", wxString::Format("%d", it->_channelStart)); - } - else if (it->_attribute == "Shutter" || it->_attribute == "Shutter1") { + } else if (it->_attribute == "Shutter" || it->_attribute == "Shutter1") { model->GetModelXml()->DeleteAttribute("DmxShutterChannel"); model->GetModelXml()->AddAttribute("DmxShutterChannel", wxString::Format("%d", it->_channelStart)); } @@ -6212,9 +6223,8 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram // Build the node names if (it->_channels == 1) { nodeNames[it->_channelStart - 1] = it->_attribute; - } - else { - for (int i = 0; i < it->_channels; i++) { + } else { + for (int i = 0; i < it->_channels; ++i) { nodeNames[it->_channelStart + i - 1] = it->_attribute + wxString::Format("-%d", i + 1).ToStdString(); } } @@ -6222,7 +6232,8 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram std::string nodenames = ""; for (const auto& s : nodeNames) { - if (!nodenames.empty()) nodenames += ","; + if (!nodenames.empty()) + nodenames += ","; nodenames += s; } model->GetModelXml()->DeleteAttribute("NodeNames"); @@ -6238,8 +6249,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram delete _channels.front(); _channels.pop_front(); } - } - else { + } else { cancelled = true; } break; @@ -6260,8 +6270,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram if (root->GetName() == "custommodel") { return model; - } - else if (root->GetName() == "polylinemodel") { + } else if (root->GetName() == "polylinemodel") { // not a custom model so delete the default model that was created std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto lg = model->GetLayoutGroup(); @@ -6273,8 +6282,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "multipointmodel") { + } else if (root->GetName() == "multipointmodel") { std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto lg = model->GetLayoutGroup(); if (model != nullptr) { @@ -6285,9 +6293,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "matrixmodel") { - + } else if (root->GetName() == "matrixmodel") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6308,9 +6314,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "archesmodel") { - + } else if (root->GetName() == "archesmodel") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); int l = ((BoxedScreenLocation&)model->GetModelScreenLocation()).GetLeft(); @@ -6336,9 +6340,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "starmodel") { - + } else if (root->GetName() == "starmodel") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6359,9 +6361,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "treemodel") { - + } else if (root->GetName() == "treemodel") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6382,9 +6382,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "dmxmodel") { - + } else if (root->GetName() == "dmxmodel") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6408,14 +6406,11 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram style == "Moving Head TopBars" || style == "Moving Head SideBars") { dmx_type = "DmxMovingHead"; - } - else if (style == "Moving Head 3D") { + } else if (style == "Moving Head 3D") { dmx_type = "DmxMovingHead3D"; - } - else if (style == "Flood Light") { + } else if (style == "Flood Light") { dmx_type = "DmxFloodlight"; - } - else if (style == "Skulltronix Skull") { + } else if (style == "Skulltronix Skull") { dmx_type = "DmxSkulltronix"; } } @@ -6427,9 +6422,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "dmxgeneral") { - + } else if (root->GetName() == "dmxgeneral") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6452,9 +6445,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "dmxservo") { - + } else if (root->GetName() == "dmxservo") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto w = ((BoxedScreenLocation&)model->GetModelScreenLocation()).GetScaleX(); @@ -6477,10 +6468,8 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "dmxservo3axis" || - root->GetName() == "dmxservo3d") { - + } else if (root->GetName() == "dmxservo3axis" || + root->GetName() == "dmxservo3d") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6500,9 +6489,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "circlemodel") { - + } else if (root->GetName() == "circlemodel") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6521,8 +6508,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else if (root->GetName() == "spheremodel") { + } else if (root->GetName() == "spheremodel") { // grab the attributes I want to keep std::string startChannel = model->GetModelXml()->GetAttribute("StartChannel", "1").ToStdString(); auto x = model->GetHcenterPos(); @@ -6542,8 +6528,7 @@ Model* Model::GetXlightsModel(Model* model, std::string& last_model, xLightsFram model->SetLayoutGroup(lg); model->Selected = true; return model; - } - else { + } else { logger_base.error("GetXlightsModel no code to convert to " + root->GetName()); xlights->AddTraceMessage("GetXlightsModel no code to convert to " + root->GetName()); cancelled = true; @@ -6578,9 +6563,9 @@ wxString Model::CreateBufferAsSubmodel() const { int buffW = GetDefaultBufferWi(); int buffH = GetDefaultBufferHt(); - std::vector> nodearray(buffH, std::vector(buffW, "")); + std::vector> nodearray(buffH, std::vector(buffW, "")); uint32_t nodeCount = GetNodeCount(); - for (uint32_t i = 0; i < nodeCount; i++) { + for (uint32_t i = 0; i < nodeCount; ++i) { int bufx = Nodes[i]->Coords[0].bufX; int bufy = Nodes[i]->Coords[0].bufY; nodearray[bufy][bufx] = wxString::Format("%d", i + 1); @@ -6590,8 +6575,8 @@ wxString Model::CreateBufferAsSubmodel() const child->AddAttribute("layout", "horizontal"); child->AddAttribute("type", "ranges"); - for (int x = 0; x < nodearray.size(); x++) { - child->AddAttribute(wxString::Format("line%d", x), CompressNodes(wxJoin(nodearray[x], ','))); + for (int x = 0; x < nodearray.size(); ++x) { + child->AddAttribute(wxString::Format("line%d", x), CompressNodes(Join(nodearray[x], ","))); } wxXmlDocument new_doc; @@ -6641,7 +6626,8 @@ void Model::SetTagColour(wxColour colour) IncrementChangeCount(); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetTagColour"); } -void Model::SetPixelSize(int size) { +void Model::SetPixelSize(int size) +{ if (size != pixelSize) { pixelSize = size; ModelXml->DeleteAttribute("PixelSize"); @@ -6651,7 +6637,8 @@ void Model::SetPixelSize(int size) { } } -void Model::SetTransparency(int t) { +void Model::SetTransparency(int t) +{ if (t != transparency) { transparency = t; ModelXml->DeleteAttribute("Transparency"); @@ -6661,7 +6648,8 @@ void Model::SetTransparency(int t) { } } -void Model::SetBlackTransparency(int t) { +void Model::SetBlackTransparency(int t) +{ if (t != blackTransparency) { blackTransparency = t; ModelXml->DeleteAttribute("BlackTransparency"); @@ -6671,7 +6659,8 @@ void Model::SetBlackTransparency(int t) { } } -void Model::SetPixelStyle(PIXEL_STYLE style) { +void Model::SetPixelStyle(PIXEL_STYLE style) +{ if (_pixelStyle != style) { _pixelStyle = style; ModelXml->DeleteAttribute("Antialias"); @@ -6689,8 +6678,7 @@ int32_t Model::GetStringStartChan(int x) const return stringStartChan[x]; } return 1; - } - else { + } else { int str = x * ts; if (str < stringStartChan.size()) { return stringStartChan[str]; @@ -6720,14 +6708,16 @@ char Model::GetSmartRemoteLetter() const { wxString s = GetControllerConnection()->GetAttribute("SmartRemote", "0"); int l = wxAtoi(s); - if (l == 0) return ' '; + if (l == 0) + return ' '; return char('A' + l - 1); } char Model::GetSmartRemoteLetterForString(int string) const { auto sr = GetSmartRemoteForString(string); - if (sr == 0) return ' '; + if (sr == 0) + return ' '; return char('A' + sr - 1); } @@ -6736,13 +6726,15 @@ int Model::GetSortableSmartRemote() const { int sr = GetSmartRemote(); int max = GetSRMaxCascade(); - if (max == 1) return sr + 200; + if (max == 1) + return sr + 200; return sr; } int Model::GetSmartTs() const { - if (GetControllerConnection() == nullptr) return 0; + if (GetControllerConnection() == nullptr) + return 0; return wxAtoi(GetControllerConnection()->GetAttribute("ts", "0")); } @@ -6758,8 +6750,7 @@ int Model::GetSmartRemoteForString(int string) const void Model::SetControllerDMXChannel(int ch) { - if (GetControllerDMXChannel() != ch) - { + if (GetControllerDMXChannel() != ch) { GetControllerConnection()->DeleteAttribute("channel"); if (ch > 0) { GetControllerConnection()->AddAttribute("channel", wxString::Format("%i", ch)); @@ -6780,7 +6771,7 @@ void Model::SetSRCascadeOnPort(bool cascade) { if (GetSRCascadeOnPort() != cascade) { GetControllerConnection()->DeleteAttribute("SRCascadeOnPort"); - GetControllerConnection()->AddAttribute("SRCascadeOnPort", cascade ? "TRUE": "FALSE"); + GetControllerConnection()->AddAttribute("SRCascadeOnPort", cascade ? "TRUE" : "FALSE"); AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::SetSRCascadeOnPort"); AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetSRCascadeOnPort"); @@ -6795,7 +6786,6 @@ void Model::SetSRCascadeOnPort(bool cascade) void Model::SetSRMaxCascade(int max) { if (GetSRMaxCascade() != max) { - GetControllerConnection()->DeleteAttribute("SRMaxCascade"); GetControllerConnection()->AddAttribute("SRMaxCascade", wxString::Format("%d", max)); @@ -6810,8 +6800,7 @@ void Model::SetSRMaxCascade(int max) void Model::SetSmartRemote(int sr) { - if (GetSmartRemote() != sr) - { + if (GetSmartRemote() != sr) { // Find the last model on this smart remote if (!GetControllerName().empty()) { SetModelChain(modelManager.GetLastModelOnPort(GetControllerName(), GetControllerPort(), GetName(), GetControllerProtocol(), sr)); @@ -6834,7 +6823,8 @@ void Model::SetSmartRemote(int sr) } } -void Model::SetSmartRemoteType(const std::string& type) { +void Model::SetSmartRemoteType(const std::string& type) +{ if (GetSmartRemoteType() != type) { GetControllerConnection()->DeleteAttribute("SmartRemoteType"); if (!type.empty()) { @@ -6869,7 +6859,7 @@ void Model::SetModelChain(const std::string& modelChain) AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetModelChain"); AddASAPWork(OutputModelManager::WORK_MODELS_REWORK_STARTCHANNELS, "Model::SetModelChain"); AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "Model::SetModelChain"); - //AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetModelChain"); + // AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetModelChain"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetModelChain"); IncrementChangeCount(); } @@ -6887,22 +6877,17 @@ void Model::SaveSuperStringColours() { bool found = true; int index = 0; - while (found) - { + while (found) { auto an = wxString::Format("SuperStringColour%d", index); - if (ModelXml->GetAttribute(an, "") == "") - { + if (ModelXml->GetAttribute(an, "") == "") { found = false; - } - else - { + } else { ModelXml->DeleteAttribute(an); } index++; } - for (int i = 0; i < superStringColours.size(); i++) - { + for (int i = 0; i < superStringColours.size(); ++i) { auto an = wxString::Format("SuperStringColour%d", i); ModelXml->AddAttribute(an, superStringColours[i]); } @@ -6910,33 +6895,41 @@ void Model::SaveSuperStringColours() void Model::SetSuperStringColours(int count) { - while (superStringColours.size() < count) - { + while (superStringColours.size() < count) { bool r = false; bool g = false; bool b = false; bool w = false; bool y = false; - for (const auto& it : superStringColours) - { - if (it == xlRED) r = true; - if (it == xlGREEN) g = true; - if (it == xlBLUE) b = true; - if (it == xlWHITE) w = true; - if (it == xlYELLOW) y = true; + for (const auto& it : superStringColours) { + if (it == xlRED) + r = true; + if (it == xlGREEN) + g = true; + if (it == xlBLUE) + b = true; + if (it == xlWHITE) + w = true; + if (it == xlYELLOW) + y = true; } - if (!r) superStringColours.push_back(xlRED); else - if (!g) superStringColours.push_back(xlGREEN); else - if (!b) superStringColours.push_back(xlBLUE); else - if (!w) superStringColours.push_back(xlWHITE); else - if (!y) superStringColours.push_back(xlYELLOW); else - superStringColours.push_back(xlRED); + if (!r) + superStringColours.push_back(xlRED); + else if (!g) + superStringColours.push_back(xlGREEN); + else if (!b) + superStringColours.push_back(xlBLUE); + else if (!w) + superStringColours.push_back(xlWHITE); + else if (!y) + superStringColours.push_back(xlYELLOW); + else + superStringColours.push_back(xlRED); } - while (superStringColours.size() > count) - { + while (superStringColours.size() > count) { superStringColours.pop_back(); } @@ -6979,11 +6972,12 @@ void Model::SetShadowModelFor(const std::string& shadowModelFor) { ModelXml->DeleteAttribute("ShadowModelFor"); ModelXml->AddAttribute("ShadowModelFor", shadowModelFor); - //AddASAPWork(OutputModelManager::WORK_UPDATE_PROPERTYGRID, "Model::SetControllerName"); + // AddASAPWork(OutputModelManager::WORK_UPDATE_PROPERTYGRID, "Model::SetControllerName"); IncrementChangeCount(); } -void Model::SetControllerName(const std::string& controller) { +void Model::SetControllerName(const std::string& controller) +{ auto n = Trim(controller); if (n == ModelXml->GetAttribute("Controller", "xyzzy_kw").Trim(true).Trim(false)) @@ -7006,14 +7000,15 @@ void Model::SetControllerName(const std::string& controller) { AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetControllerName"); AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::SetControllerName"); AddASAPWork(OutputModelManager::WORK_UPDATE_PROPERTYGRID, "Model::SetControllerName"); - //AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetControllerName"); + // AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetControllerName"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetControllerName"); IncrementChangeCount(); } void Model::SetControllerProtocol(const std::string& protocol) { - if (protocol == ModelXml->GetAttribute("Protocol", "xyzzy_kw")) return; + if (protocol == ModelXml->GetAttribute("Protocol", "xyzzy_kw")) + return; GetControllerConnection()->DeleteAttribute("Protocol"); if (protocol != "") { @@ -7024,14 +7019,15 @@ void Model::SetControllerProtocol(const std::string& protocol) AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetControllerProtocol"); AddASAPWork(OutputModelManager::WORK_MODELS_REWORK_STARTCHANNELS, "Model::SetControllerProtocol"); AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "Model::SetControllerProtocol"); - //AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetControllerProtocol"); + // AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetControllerProtocol"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetControllerProtocol"); IncrementChangeCount(); } void Model::SetControllerPort(int port) { - if (port == wxAtoi(ModelXml->GetAttribute("Port", "-999"))) return; + if (port == wxAtoi(ModelXml->GetAttribute("Port", "-999"))) + return; GetControllerConnection()->DeleteAttribute("Port"); if (port > 0) { @@ -7042,14 +7038,15 @@ void Model::SetControllerPort(int port) AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::SetControllerPort"); AddASAPWork(OutputModelManager::WORK_MODELS_REWORK_STARTCHANNELS, "Model::SetControllerPort"); AddASAPWork(OutputModelManager::WORK_CALCULATE_START_CHANNELS, "Model::SetControllerPort"); - //AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetControllerPort"); + // AddASAPWork(OutputModelManager::WORK_RELOAD_MODEL_FROM_XML, "Model::SetControllerPort"); AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetControllerPort"); IncrementChangeCount(); } void Model::SetControllerBrightness(int brightness) { - if (brightness == wxAtoi(ModelXml->GetAttribute("brightness", "-1"))) return; + if (brightness == wxAtoi(ModelXml->GetAttribute("brightness", "-1"))) + return; GetControllerConnection()->DeleteAttribute("brightness"); GetControllerConnection()->AddAttribute("brightness", wxString::Format("%d", brightness)); @@ -7061,6 +7058,66 @@ void Model::SetControllerBrightness(int brightness) IncrementChangeCount(); } +void Model::SetControllerStartNulls(int nulls) +{ + if (nulls == wxAtoi(ModelXml->GetAttribute("nullNodes", "0"))) { + return; + } + GetControllerConnection()->DeleteAttribute("nullNodes"); + GetControllerConnection()->AddAttribute("nullNodes", wxString::Format("%d", nulls)); + + AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetConnectionStartNulls"); + AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetConnectionStartNulls"); + AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::SetConnectionStartNulls"); + AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::SetConnectionStartNulls"); + IncrementChangeCount(); +} + +void Model::SetControllerEndNulls(int nulls) +{ + if (nulls == wxAtoi(ModelXml->GetAttribute("endNullNodes", "0"))) { + return; + } + GetControllerConnection()->DeleteAttribute("endNullNodes"); + GetControllerConnection()->AddAttribute("endNullNodes", wxString::Format("%d", nulls)); + + AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetConnectionPixelEndNullNodes"); + AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetConnectionPixelEndNullNodes"); + AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::SetConnectionPixelEndNullNodes"); + AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::SetConnectionPixelEndNullNodes"); + IncrementChangeCount(); +} + +void Model::SetControllerColorOrder(wxString const& color) +{ + if (color == ModelXml->GetAttribute("colorOrder", "RGB")) { + return; + } + GetControllerConnection()->DeleteAttribute("colorOrder"); + GetControllerConnection()->AddAttribute("colorOrder", color); + + AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetConnectionPixelColorOrder"); + AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetConnectionPixelColorOrder"); + AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::SetConnectionPixelColorOrder"); + AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::SetConnectionPixelColorOrder"); + IncrementChangeCount(); +} + +void Model::SetControllerGroupCount(int grouping) +{ + if (grouping == wxAtoi(GetControllerConnection()->GetAttribute("groupCount", "1"))) { + return; + } + GetControllerConnection()->DeleteAttribute("groupCount"); + GetControllerConnection()->AddAttribute("groupCount", wxString::Format("%d", grouping)); + + AddASAPWork(OutputModelManager::WORK_RGBEFFECTS_CHANGE, "Model::SetConnectionPixelGroupCount"); + AddASAPWork(OutputModelManager::WORK_RELOAD_MODELLIST, "Model::SetConnectionPixelGroupCount"); + AddASAPWork(OutputModelManager::WORK_MODELS_CHANGE_REQUIRING_RERENDER, "Model::SetConnectionPixelGroupCount"); + AddASAPWork(OutputModelManager::WORK_RESEND_CONTROLLER_CONFIG, "Model::SetConnectionPixelGroupCount"); + IncrementChangeCount(); +} + void Model::ClearControllerBrightness() { if (GetControllerConnection()->HasAttribute("brightness")) { @@ -7083,6 +7140,26 @@ int Model::GetControllerBrightness() const return wxAtoi(GetControllerConnection()->GetAttribute("brightness", "100")); } +int Model::GetControllerStartNulls() const +{ + return wxAtoi(GetControllerConnection()->GetAttribute("nullNodes", "0")); +} + +int Model::GetControllerEndNulls() const +{ + return wxAtoi(GetControllerConnection()->GetAttribute("endNullNodes", "0")); +} + +wxString Model::GetControllerColorOrder() const +{ + return GetControllerConnection()->GetAttribute("colorOrder", "RGB"); +} + +int Model::GetControllerGroupCount() const +{ + return wxAtoi(GetControllerConnection()->GetAttribute("groupCount", "1")); +} + bool Model::IsShadowModel() const { return ModelXml->GetAttribute("ShadowModelFor", "").size() > 0; @@ -7098,25 +7175,25 @@ std::string Model::GetControllerName() const return ModelXml->GetAttribute("Controller", "").Trim(true).Trim(false).ToStdString(); } -//std::list Model::GetProtocols() +// std::list Model::GetProtocols() //{ -// std::list res; -// for (auto a : GetAllPixelTypes()) { -// if (a != "") { -// res.push_back(a); -// } -// } -// for (auto a : SERIAL_PROTOCOLS) { -// if (a != "") { -// res.push_back(a.ToStdString()); -// } -// } -// return res; -//} - -//std::list Model::GetLCProtocols() +// std::list res; +// for (auto a : GetAllPixelTypes()) { +// if (a != "") { +// res.push_back(a); +// } +// } +// for (auto a : SERIAL_PROTOCOLS) { +// if (a != "") { +// res.push_back(a.ToStdString()); +// } +// } +// return res; +// } + +// std::list Model::GetLCProtocols() //{ -// auto protocols = Model::GetProtocols(); +// auto protocols = Model::GetProtocols(); // for (auto p = protocols.begin(); p != protocols.end(); ++p) // { @@ -7126,29 +7203,23 @@ std::string Model::GetControllerName() const // return protocols; //} -//bool Model::IsProtocolValid(std::string protocol) +// bool Model::IsProtocolValid(std::string protocol) //{ -// wxString p(protocol); -// std::string prot = p.Lower().ToStdString(); -// auto protocols = Model::GetLCProtocols(); -// return (std::find(protocols.begin(), protocols.end(), prot) != protocols.end()); -//} +// wxString p(protocol); +// std::string prot = p.Lower().ToStdString(); +// auto protocols = Model::GetLCProtocols(); +// return (std::find(protocols.begin(), protocols.end(), prot) != protocols.end()); +// } bool Model::CleanupFileLocations(xLightsFrame* frame) { bool rc = false; - for (auto& it : faceInfo) - { - if (it.second.find("Type") != it.second.end() && it.second.at("Type") == "Matrix") - { - for (auto& it2 : it.second) - { - if (it2.first != "CustomColors" && it2.first != "ImagePlacement" && it2.first != "Type" && it2.second != "") - { - if (FileExists(it2.second)) - { - if (!frame->IsInShowFolder(it2.second)) - { + for (auto& it : faceInfo) { + if (it.second.find("Type") != it.second.end() && it.second.at("Type") == "Matrix") { + for (auto& it2 : it.second) { + if (it2.first != "CustomColors" && it2.first != "ImagePlacement" && it2.first != "Type" && it2.second != "") { + if (FileExists(it2.second)) { + if (!frame->IsInShowFolder(it2.second)) { it2.second = frame->MoveToShowFolder(it2.second, wxString(wxFileName::GetPathSeparator()) + "Faces"); rc = true; } @@ -7158,16 +7229,14 @@ bool Model::CleanupFileLocations(xLightsFrame* frame) } } - if (rc) - { - wxXmlNode *f = ModelXml->GetChildren(); + if (rc) { + wxXmlNode* f = ModelXml->GetChildren(); while (f != nullptr) { if ("faceInfo" == f->GetName()) { ModelXml->RemoveChild(f); delete f; f = ModelXml->GetChildren(); - } - else { + } else { f = f->GetNext(); } } @@ -7182,20 +7251,15 @@ std::list Model::GetFaceFiles(const std::list& facesUs { std::list res; - for (const auto& it : faceInfo) - { - if (all || std::find(begin(facesUsed), end(facesUsed), it.first) != facesUsed.end()) - { - if (it.second.find("Type") != it.second.end() && it.second.at("Type") == "Matrix") - { - for (const auto& it2 : it.second) - { - if (it2.first != "CustomColors" && it2.first != "ImagePlacement" && it2.first != "Type" && it2.second != "") - { - if (all || FileExists(it2.second)) - { + for (const auto& it : faceInfo) { + if (all || std::find(begin(facesUsed), end(facesUsed), it.first) != facesUsed.end()) { + if (it.second.find("Type") != it.second.end() && it.second.at("Type") == "Matrix") { + for (const auto& it2 : it.second) { + if (it2.first != "CustomColors" && it2.first != "ImagePlacement" && it2.first != "Type" && it2.second != "") { + if (all || FileExists(it2.second)) { std::string n = it2.second; - if (includeFaceName) n = it.first + "|" + n; + if (includeFaceName) + n = it.first + "|" + n; res.push_back(n); } } @@ -7207,7 +7271,8 @@ std::list Model::GetFaceFiles(const std::list& facesUs return res; } -bool Model::HasState(std::string const& state) const { +bool Model::HasState(std::string const& state) const +{ auto s = Lower(state); for (const auto& it : stateInfo) { if (it.first == s) { @@ -7240,37 +7305,32 @@ void Model::GetPortSR(int string, int& outport, int& outsr) const if (port == 0 || string == 0) { outport = port; outsr = sr; - } - else if (sr == 0) { + } else if (sr == 0) { outport = port + string; outsr = 0; - } - else { + } else { bool cascadeOnPort = GetSRCascadeOnPort(); int max = GetSRMaxCascade(); if (cascadeOnPort) { outport = port + string / max; outsr = sr + (string % max); - } - else { + } else { int currp = port; int currsr = sr; - for (int p = 0; p < string; p++) { + for (int p = 0; p < string; ++p) { int newp = currp + 1; if ((newp - 1) / PORTS_PER_SMARTREMOTE != (currp - 1) / PORTS_PER_SMARTREMOTE) { int newsr = currsr + 1; if (newsr - sr >= max) { currsr = sr; currp = newp; - } - else { + } else { currsr = newsr; currp = ((currp - 1) / PORTS_PER_SMARTREMOTE) * PORTS_PER_SMARTREMOTE + 1; } - } - else { + } else { currp = newp; } } @@ -7297,8 +7357,7 @@ int Model::GetControllerPort(int string) const void Model::GetMinScreenXY(float& minx, float& miny) const { - if (Nodes.size() == 0) - { + if (Nodes.size() == 0) { minx = 0; miny = 0; return; @@ -7306,10 +7365,8 @@ void Model::GetMinScreenXY(float& minx, float& miny) const minx = 99999999.0f; miny = 99999999.0f; - for (const auto& it : Nodes) - { - for (const auto& it2 : it->Coords) - { + for (const auto& it : Nodes) { + for (const auto& it2 : it->Coords) { minx = std::min(minx, it2.screenX); miny = std::min(miny, it2.screenY); } @@ -7366,21 +7423,22 @@ void Model::ExportDimensions(wxFile& f) const void Model::SaveDisplayDimensions() { _savedWidth = GetModelScreenLocation().GetRestorableMWidth(); - if (_savedWidth == 0) _savedWidth = 1; + if (_savedWidth == 0) + _savedWidth = 1; _savedHeight = GetModelScreenLocation().GetRestorableMHeight(); - if (_savedHeight == 0) _savedHeight = 1; + if (_savedHeight == 0) + _savedHeight = 1; _savedDepth = GetModelScreenLocation().GetRestorableMDepth(); - if (_savedDepth == 0) _savedDepth = 1; + if (_savedDepth == 0) + _savedDepth = 1; } void Model::RestoreDisplayDimensions() { - if ((DisplayAs.rfind("Dmx", 0) != 0) && DisplayAs != "Image") - { + if ((DisplayAs.rfind("Dmx", 0) != 0) && DisplayAs != "Image") { SetWidth(_savedWidth, true); // We dont want to set the height of three point models - if (dynamic_cast(&(GetModelScreenLocation())) == nullptr) - { + if (dynamic_cast(&(GetModelScreenLocation())) == nullptr) { SetHeight(_savedHeight, true); } SetDepth(_savedDepth, true); @@ -7388,23 +7446,29 @@ void Model::RestoreDisplayDimensions() } // This is deliberately ! serial so that it defaults to thinking it is pixel -bool Model::IsPixelProtocol() const { +bool Model::IsPixelProtocol() const +{ return GetControllerPort(1) != 0 && !::IsSerialProtocol(GetControllerProtocol()) && !::IsMatrixProtocol(GetControllerProtocol()); } -bool Model::IsSerialProtocol() const { +bool Model::IsSerialProtocol() const +{ return GetControllerPort(1) != 0 && ::IsSerialProtocol(GetControllerProtocol()); } -bool Model::IsMatrixProtocol() const { +bool Model::IsMatrixProtocol() const +{ return GetControllerPort(1) != 0 && ::IsMatrixProtocol(GetControllerProtocol()); } -bool Model::IsLEDPanelMatrixProtocol() const { +bool Model::IsLEDPanelMatrixProtocol() const +{ return GetControllerPort(1) != 0 && ::IsLEDPanelMatrixProtocol(GetControllerProtocol()); } -bool Model::IsVirtualMatrixProtocol() const { +bool Model::IsVirtualMatrixProtocol() const +{ return GetControllerPort(1) != 0 && ::IsVirtualMatrixProtocol(GetControllerProtocol()); } -std::vector Model::GetSmartRemoteTypes() const { +std::vector Model::GetSmartRemoteTypes() const +{ auto caps = GetControllerCaps(); if (caps == nullptr) { return { "" }; @@ -7412,7 +7476,8 @@ std::vector Model::GetSmartRemoteTypes() const { return caps->GetSmartRemoteTypes(); } -std::string Model::GetSmartRemoteType() const { +std::string Model::GetSmartRemoteType() const +{ auto types = GetSmartRemoteTypes(); if (types.empty()) { return ""; @@ -7426,7 +7491,8 @@ std::string Model::GetSmartRemoteType() const { return s; } -int Model::GetSmartRemoteTypeIndex(const std::string& srType) const { +int Model::GetSmartRemoteTypeIndex(const std::string& srType) const +{ auto caps = GetControllerCaps(); int i = 0; if (caps != nullptr) { @@ -7441,7 +7507,8 @@ int Model::GetSmartRemoteTypeIndex(const std::string& srType) const { return 0; } -std::string Model::GetSmartRemoteTypeName(int idx) const { +std::string Model::GetSmartRemoteTypeName(int idx) const +{ auto caps = GetControllerCaps(); if (caps != nullptr) { const auto srList = caps->GetSmartRemoteTypes(); @@ -7455,7 +7522,8 @@ std::string Model::GetSmartRemoteTypeName(int idx) const { return std::string(); } -int Model::GetSmartRemoteCount() const { +int Model::GetSmartRemoteCount() const +{ auto caps = GetControllerCaps(); if (caps != nullptr) { return caps->GetSmartRemoteCount(); @@ -7463,15 +7531,20 @@ int Model::GetSmartRemoteCount() const { return 3; } - -Model::PreviewGraphicsCacheInfo::~PreviewGraphicsCacheInfo() { - if (vica) delete vica; - if (program) delete program; - if (vca) delete vca; - if (va) delete va; +Model::PreviewGraphicsCacheInfo::~PreviewGraphicsCacheInfo() +{ + if (vica) + delete vica; + if (program) + delete program; + if (vca) + delete vca; + if (va) + delete va; }; -void Model::deleteUIObjects() { - for (auto &a : uiCaches) { +void Model::deleteUIObjects() +{ + for (auto& a : uiCaches) { delete a.second; } uiCaches.clear(); @@ -7481,7 +7554,8 @@ void Model::deleteUIObjects() { bool wxDropPatternProperty::ValidateValue(wxVariant& value, wxPGValidationInfo& validationInfo) const { for (auto c : value.GetString()) { - if ((c < '0' || c > '9') && c != ',' && c != '-') return false; + if ((c < '0' || c > '9') && c != ',' && c != '-') + return false; } return true; } @@ -7514,14 +7588,11 @@ void Model::ImportXlightsModel(std::string const& filename, xLightsFrame* xlight std::string Model::GetAttributesAsJSON() const { std::string json = "{"; - bool first{true}; - for (wxXmlAttribute* attrp = ModelXml->GetAttributes(); attrp; attrp = attrp->GetNext()) - { + bool first{ true }; + for (wxXmlAttribute* attrp = ModelXml->GetAttributes(); attrp; attrp = attrp->GetNext()) { wxString value = attrp->GetValue(); - if (!value.empty()) - { - if(!first) - { + if (!value.empty()) { + if (!first) { json += ","; } json += "\"" + attrp->GetName().ToStdString() + "\":\"" + JSONSafe(value.ToStdString()) + "\""; @@ -7530,14 +7601,11 @@ std::string Model::GetAttributesAsJSON() const } json += ",\"ControllerConnection\":{"; wxXmlNode* cc = GetControllerConnection(); - bool first2{true}; - for (wxXmlAttribute* attrp = cc->GetAttributes(); attrp; attrp = attrp->GetNext()) - { + bool first2{ true }; + for (wxXmlAttribute* attrp = cc->GetAttributes(); attrp; attrp = attrp->GetNext()) { wxString value = attrp->GetValue(); - if (!value.empty()) - { - if(!first2) - { + if (!value.empty()) { + if (!first2) { json += ","; } json += "\"" + attrp->GetName().ToStdString() + "\":\"" + JSONSafe(value.ToStdString()) + "\""; @@ -7547,4 +7615,3 @@ std::string Model::GetAttributesAsJSON() const json += "}}"; return json; } - diff --git a/xLights/models/Model.h b/xLights/models/Model.h index f89dea407b..bbc1018902 100644 --- a/xLights/models/Model.h +++ b/xLights/models/Model.h @@ -90,6 +90,8 @@ class Model : public BaseObject PIXEL_STYLE_BLENDED_CIRCLE }; + static wxArrayString CONTROLLER_COLORORDER; + Model(const ModelManager& manager); virtual ~Model(); static wxArrayString GetLayoutGroups(const ModelManager& mm); @@ -323,21 +325,35 @@ class Model : public BaseObject void SetControllerPort(int port); void SetControllerBrightness(int brightness); void ClearControllerBrightness(); - bool IsControllerBrightnessSet() const; - bool IsShadowModel() const; - std::string GetShadowModelFor() const; - std::string GetControllerName() const; - std::string GetControllerProtocol() const; - int GetControllerBrightness() const; - int GetControllerDMXChannel() const; - int GetSmartRemote() const; - bool GetSRCascadeOnPort() const; - int GetSRMaxCascade() const; - std::vector GetSmartRemoteTypes() const; - std::string GetSmartRemoteType() const; - int GetSmartRemoteTypeIndex(const std::string& srType) const; - std::string GetSmartRemoteTypeName(int idx) const; - int GetSmartRemoteCount() const; + [[nodiscard]] bool IsControllerBrightnessSet() const; + [[nodiscard]] bool IsShadowModel() const; + [[nodiscard]] std::string GetShadowModelFor() const; + [[nodiscard]] std::string GetControllerName() const; + [[nodiscard]] std::string GetControllerProtocol() const; + [[nodiscard]] int GetControllerBrightness() const; + [[nodiscard]] int GetControllerDMXChannel() const; + [[nodiscard]] int GetSmartRemote() const; + [[nodiscard]] bool GetSRCascadeOnPort() const; + [[nodiscard]] int GetSRMaxCascade() const; + [[nodiscard]] std::vector GetSmartRemoteTypes() const; + [[nodiscard]] std::string GetSmartRemoteType() const; + [[nodiscard]] int GetSmartRemoteTypeIndex(const std::string& srType) const; + [[nodiscard]] std::string GetSmartRemoteTypeName(int idx) const; + [[nodiscard]] int GetSmartRemoteCount() const; + [[nodiscard]] int GetControllerStartNulls() const; + [[nodiscard]] int GetControllerEndNulls() const; + [[nodiscard]] wxString GetControllerColorOrder() const; + [[nodiscard]] int GetControllerGroupCount() const; + void SetControllerStartNulls(int nulls); + void SetControllerEndNulls(int nulls); + void SetControllerColorOrder(wxString const& color); + void SetControllerGroupCount(int grouping); + + bool IsAlias(const std::string& alias, bool oldnameOnly = false) const; + void AddAlias(const std::string& alias); + void DeleteAlias(const std::string& alias); + std::list GetAliases() const; + void SetAliases(std::list& aliases); void GetPortSR(int string, int& outport, int& outsr) const; char GetSmartRemoteLetter() const; diff --git a/xLights/models/ModelGroup.cpp b/xLights/models/ModelGroup.cpp index 810ec62066..895c05d5ce 100644 --- a/xLights/models/ModelGroup.cpp +++ b/xLights/models/ModelGroup.cpp @@ -864,7 +864,6 @@ bool ModelGroup::SubModelRenamed(const std::string &oldName, const std::string & } bool ModelGroup::CheckForChanges() const { - unsigned long l = 0; for (const auto& it : models) { ModelGroup *grp = dynamic_cast(it); @@ -875,6 +874,13 @@ bool ModelGroup::CheckForChanges() const { } if (l != changeCount) { + if (!wxThread::IsMain()) { + //calling reset on any thread other than the main thread is bad. In theory, any changes to the group/model + //would only be done on the main thread after an abortRender call so we shouldn't get here, but we are + //seeing stack traces in crash reports that show otherwise so likely some abortRender calls are missing. + return false; + } + // this is ugly ... it is casting away the const-ness of this ModelGroup *group = (ModelGroup*)this; if (group != nullptr) group->Reset(); diff --git a/xLights/models/ModelManager.cpp b/xLights/models/ModelManager.cpp index 159d21a8e1..73fa3b7758 100644 --- a/xLights/models/ModelManager.cpp +++ b/xLights/models/ModelManager.cpp @@ -145,8 +145,7 @@ bool ModelManager::Rename(const std::string& oldName, const std::string& newName if (model == nullptr || model->GetDisplayAs() == "SubModel") { return false; } - model->GetModelXml()->DeleteAttribute("name"); - model->GetModelXml()->AddAttribute("name", nn); + model->Rename(nn); model->name = nn; if (dynamic_cast(model) == nullptr) { std::lock_guard lock(_modelMutex); diff --git a/xLights/models/TerrianObject.cpp b/xLights/models/TerrianObject.cpp index 42b64f8299..3f31f850e3 100644 --- a/xLights/models/TerrianObject.cpp +++ b/xLights/models/TerrianObject.cpp @@ -88,7 +88,9 @@ void TerrianObject::AddTypeProperties(wxPropertyGridInterface* grid, OutputManag wxPGProperty* p = grid->Append(new wxImageFileProperty("Image", "Image", _imageFile)); - p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg|All files (*.*)|*.*"); + p->SetAttribute(wxPG_FILE_WILDCARD, "Image files|*.png;*.bmp;*.jpg;*.gif;*.jpeg" + ";*.webp" + "|All files (*.*)|*.*"); p = grid->Append(new wxUIntProperty("Transparency", "Transparency", transparency)); p->SetAttribute("Min", 0); diff --git a/xLights/models/ThreePointScreenLocation.cpp b/xLights/models/ThreePointScreenLocation.cpp index 25bbbdc799..d359441a56 100644 --- a/xLights/models/ThreePointScreenLocation.cpp +++ b/xLights/models/ThreePointScreenLocation.cpp @@ -90,7 +90,7 @@ void ThreePointScreenLocation::AddDimensionProperties(wxPropertyGridInterface* p TwoPointScreenLocation::AddDimensionProperties(propertyEditor, 1.0); float width = RulerObject::Measure(origin, point2); wxPGProperty* prop = propertyEditor->Append(new wxFloatProperty(wxString::Format("Height (%s)", RulerObject::GetUnitDescription()), "RealHeight", - RulerObject::Measure((width * height) / 2.0 * factor * 100.0) + (width * height) / 2.0 * factor )); prop->ChangeFlag(wxPG_PROP_READONLY, true); prop->SetAttribute("Precision", 2); @@ -113,7 +113,7 @@ float ThreePointScreenLocation::GetRealWidth() const float ThreePointScreenLocation::GetRealHeight() const { float width = RulerObject::Measure(origin, point2); - return RulerObject::Measure((width * height) / 2.0 * 1.0 * 100.0); + return (width * height) / 2.0 * 1.0; } void ThreePointScreenLocation::AddSizeLocationProperties(wxPropertyGridInterface *propertyEditor) const { diff --git a/xLights/models/TreeModel.cpp b/xLights/models/TreeModel.cpp index e8a1af78de..152dc4aa67 100644 --- a/xLights/models/TreeModel.cpp +++ b/xLights/models/TreeModel.cpp @@ -44,6 +44,7 @@ static wxPGChoices TREE_DIRECTIONS(wxArrayString(2, TREE_DIRECTION_VALUES)); void TreeModel::InitModel() { _alternateNodes = (ModelXml->GetAttribute("AlternateNodes", "false") == "true"); + _noZig = (ModelXml->GetAttribute("NoZig", "false") == "true"); bool isHMatrix = (ModelXml->GetAttribute("StrandDir", TREE_DIRECTION_VALUES[1]) == TREE_DIRECTION_VALUES[0]); wxStringTokenizer tkz(DisplayAs, " "); wxString token = tkz.GetNextToken(); @@ -388,6 +389,11 @@ void TreeModel::AddStyleProperties(wxPropertyGridInterface *grid) { p = grid->Append(new wxBoolProperty("Alternate Nodes", "AlternateNodes", _alternateNodes)); p->SetEditor("CheckBox"); + p->Enable(_noZig == false); + + p = grid->Append(new wxBoolProperty("Don't Zig Zag", "NoZig", _noZig)); + p->SetEditor("CheckBox"); + p->Enable(_alternateNodes == false); grid->Append(new wxEnumProperty("Strand Direction", "StrandDir", TREE_DIRECTIONS, vMatrix ? 1 : 0)); } @@ -419,11 +425,13 @@ void TreeModel::ExportXlightsModel() wxString tr = ModelXml->GetAttribute("TreeRotation", "3"); wxString tsr = ModelXml->GetAttribute("TreeSpiralRotations", "0.0"); wxString an = ModelXml->GetAttribute("AlternateNodes", "false"); + wxString nz = ModelXml->GetAttribute("NoZig", "false"); wxString sdr = ModelXml->GetAttribute("StrandDir", TREE_DIRECTION_VALUES[1]); wxString v = xlights_version_string; f.Write("\nGetAttribute("PixelType"); wxString psp = root->GetAttribute("PixelSpacing"); wxString an = root->GetAttribute("AlternateNodes"); + wxString nz = root->GetAttribute("NoZig"); wxString sdr = root->GetAttribute("StrandDir"); // Add any model version conversion logic here @@ -526,6 +535,7 @@ void TreeModel::ImportXlightsModel(wxXmlNode* root, xLightsFrame* xlights, float SetProperty("PixelType", pt); SetProperty("PixelSpacing", psp); SetProperty("AlternateNodes", an); + SetProperty("NoZig", nz); SetProperty("StrandDir", sdr); wxString newname = xlights->AllModels.GenerateModelName(name.ToStdString()); diff --git a/xLights/outputs/Controller.h b/xLights/outputs/Controller.h index 3f62067b9b..7a0ab23bfa 100644 --- a/xLights/outputs/Controller.h +++ b/xLights/outputs/Controller.h @@ -260,7 +260,7 @@ class Controller virtual bool SupportsDefaultGamma() const { return false; } virtual std::string GetIP() const { return GetResolvedIP(); } - virtual std::string GetResolvedIP() const { return ""; } + virtual std::string GetResolvedIP(bool forceResolve = false) const { return ""; } virtual std::string GetFPPProxy() const { return ""; } virtual std::string GetProtocol() const { return ""; } diff --git a/xLights/outputs/ControllerEthernet.cpp b/xLights/outputs/ControllerEthernet.cpp index 55ea6c88af..c5f0ecece0 100644 --- a/xLights/outputs/ControllerEthernet.cpp +++ b/xLights/outputs/ControllerEthernet.cpp @@ -231,6 +231,12 @@ void ControllerEthernet::PostSetActive() } } } +std::string ControllerEthernet::GetResolvedIP(bool forceResolve) const { + if (_resolvedIp == "" && _ip != "") { + return ip_utils::ResolveIP(_ip); + } + return _resolvedIp; +} void ControllerEthernet::SetProtocol(const std::string& protocol) { @@ -692,19 +698,18 @@ void ControllerEthernet::VMVChanged(wxPropertyGrid *grid) Output::PINGSTATE ControllerEthernet::Ping() { - if (GetResolvedIP() == "MULTICAST") { + if (GetResolvedIP(false) == "MULTICAST") { _lastPingResult = Output::PINGSTATE::PING_UNAVAILABLE; } else if (_outputs.size() > 0) { - std::string ip = GetResolvedIP(); + std::string ip = GetResolvedIP(true); if (ip.empty()) { ip = GetIP(); } _lastPingResult = dynamic_cast(_outputs.front())->Ping(ip, GetFPPProxy()); - } - else { + } else { E131Output ipo; ipo.SetIP(_ip, IsActive()); - _lastPingResult = ipo.Ping(GetResolvedIP(), GetFPPProxy()); + _lastPingResult = ipo.Ping(GetResolvedIP(true), GetFPPProxy()); } return GetLastPingState(); } diff --git a/xLights/outputs/ControllerEthernet.h b/xLights/outputs/ControllerEthernet.h index 7125ca1ad6..51fc3dcd4b 100644 --- a/xLights/outputs/ControllerEthernet.h +++ b/xLights/outputs/ControllerEthernet.h @@ -61,7 +61,7 @@ class ControllerEthernet : public Controller #pragma region Getters and Setters void SetIP(const std::string& ip); virtual std::string GetIP() const override { return _ip; } - virtual std::string GetResolvedIP() const override { return _resolvedIp; } + virtual std::string GetResolvedIP(bool forceResolve = false) const override; virtual void PostSetActive() override; virtual std::string GetProtocol() const override { return _type; } diff --git a/xLights/outputs/ControllerSerial.h b/xLights/outputs/ControllerSerial.h index a3ae8a3fb7..ba39ec43dd 100644 --- a/xLights/outputs/ControllerSerial.h +++ b/xLights/outputs/ControllerSerial.h @@ -111,7 +111,7 @@ class ControllerSerial : public Controller if (_model == "FPP") return _type; if (_outputs.size() > 0) return _outputs.front()->GetType(); else return Controller::GetColumn1Label(); } - virtual std::string GetResolvedIP() const override { + virtual std::string GetResolvedIP(bool forceResolve) const override { if (_model == "FPP") return GetFirstOutput()->GetResolvedIP(); return ""; } diff --git a/xLights/outputs/OutputManager.cpp b/xLights/outputs/OutputManager.cpp index bb22f870a3..711f0ad9ae 100644 --- a/xLights/outputs/OutputManager.cpp +++ b/xLights/outputs/OutputManager.cpp @@ -1049,15 +1049,17 @@ std::string OutputManager::UniqueName(const std::string& prefix) { bool OutputManager::IsIDUsed(int id) { - for (const auto& it : GetAllOutputs()) { - if (it->GetUniverse() == id) return true; + for (const auto& it : _controllers) { + if (it->GetId() == id) return true; } return false; } int OutputManager::UniqueId() { - int i = 0; - while (GetOutput(++i, "") != nullptr); + int i = 1; + while (IsIDUsed(i) || (GetOutput(i, "") != nullptr)) { + ++i; + } return i; } diff --git a/xLights/preferences/CheckSequenceSettingsPanel.cpp b/xLights/preferences/CheckSequenceSettingsPanel.cpp index 3fd7a83acd..bf97faec57 100644 --- a/xLights/preferences/CheckSequenceSettingsPanel.cpp +++ b/xLights/preferences/CheckSequenceSettingsPanel.cpp @@ -30,6 +30,7 @@ const long CheckSequenceSettingsPanel::ID_CHECKBOX3 = wxNewId(); const long CheckSequenceSettingsPanel::ID_CHECKBOX4 = wxNewId(); const long CheckSequenceSettingsPanel::ID_CHECKBOX5 = wxNewId(); const long CheckSequenceSettingsPanel::ID_CHECKBOX6 = wxNewId(); +const long CheckSequenceSettingsPanel::ID_CHECKBOX7 = wxNewId(); //*) BEGIN_EVENT_TABLE(CheckSequenceSettingsPanel,wxPanel) @@ -70,7 +71,13 @@ CheckSequenceSettingsPanel::CheckSequenceSettingsPanel(wxWindow* parent, xLights CheckBox_CustomSizeCheck->SetValue(false); CheckBox_CustomSizeCheck->SetHelpText(_("Large custom models with largely empty cells generate significant rendering overhead. You may want to consider shrinking the custom model dimensions if this can done without too significantly adversely affecting appearance.")); GridBagSizer1->Add(CheckBox_CustomSizeCheck, wxGBPosition(6, 0), wxDefaultSpan, wxALL|wxEXPAND, 5); + CheckBox_DisableSketch = new wxCheckBox(this, ID_CHECKBOX7, _("Disable sketch image file checking."), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX7")); + CheckBox_DisableSketch->SetValue(false); + CheckBox_DisableSketch->SetHelpText(_("Sketch effect image files are not essential to rendering.")); + GridBagSizer1->Add(CheckBox_DisableSketch, wxGBPosition(7, 0), wxDefaultSpan, wxALL|wxEXPAND, 5); SetSizer(GridBagSizer1); + GridBagSizer1->Fit(this); + GridBagSizer1->SetSizeHints(this); Connect(ID_CHECKBOX1,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&CheckSequenceSettingsPanel::OnCheckBox_DupUnivClick); Connect(ID_CHECKBOX2,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&CheckSequenceSettingsPanel::OnCheckBox_NonContigChOnPortClick); @@ -78,6 +85,7 @@ CheckSequenceSettingsPanel::CheckSequenceSettingsPanel(wxWindow* parent, xLights Connect(ID_CHECKBOX4,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&CheckSequenceSettingsPanel::OnCheckBox_DupNodeMGClick); Connect(ID_CHECKBOX5,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&CheckSequenceSettingsPanel::OnCheckBox_TransTimeClick); Connect(ID_CHECKBOX6,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&CheckSequenceSettingsPanel::OnCheckBox_CustomSizeCheckClick); + Connect(ID_CHECKBOX7,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&CheckSequenceSettingsPanel::OnCheckBox_DisableSketchClick); //*) CheckBox_DupUniv->SetToolTip(CheckBox_DupUniv->GetHelpText()); @@ -86,6 +94,7 @@ CheckSequenceSettingsPanel::CheckSequenceSettingsPanel(wxWindow* parent, xLights CheckBox_DupNodeMG->SetToolTip(CheckBox_DupNodeMG->GetHelpText()); CheckBox_TransTime->SetToolTip(CheckBox_TransTime->GetHelpText()); CheckBox_CustomSizeCheck->SetToolTip(CheckBox_CustomSizeCheck->GetHelpText()); + CheckBox_DisableSketch->SetToolTip(CheckBox_DisableSketch->GetHelpText()); } CheckSequenceSettingsPanel::~CheckSequenceSettingsPanel() @@ -101,7 +110,7 @@ bool CheckSequenceSettingsPanel::TransferDataToWindow() { CheckBox_DupNodeMG->SetValue(xLightsFrame::IsCheckSequenceOptionDisabled("DupNodeMG")); CheckBox_TransTime->SetValue(xLightsFrame::IsCheckSequenceOptionDisabled("TransTime")); CheckBox_CustomSizeCheck->SetValue(xLightsFrame::IsCheckSequenceOptionDisabled("CustomSizeCheck")); - + CheckBox_DisableSketch->SetValue(xLightsFrame::IsCheckSequenceOptionDisabled("SketchImage")); return true; } bool CheckSequenceSettingsPanel::TransferDataFromWindow() { @@ -111,6 +120,7 @@ bool CheckSequenceSettingsPanel::TransferDataFromWindow() { xLightsFrame::SetCheckSequenceOptionDisable("DupNodeMG", CheckBox_DupNodeMG->IsChecked()); xLightsFrame::SetCheckSequenceOptionDisable("TransTime", CheckBox_TransTime->IsChecked()); xLightsFrame::SetCheckSequenceOptionDisable("CustomSizeCheck", CheckBox_CustomSizeCheck->IsChecked()); + xLightsFrame::SetCheckSequenceOptionDisable("SketchImage", CheckBox_DisableSketch->IsChecked()); return true; } @@ -155,3 +165,10 @@ void CheckSequenceSettingsPanel::OnCheckBox_CustomSizeCheckClick(wxCommandEvent& TransferDataFromWindow(); } } + +void CheckSequenceSettingsPanel::OnCheckBox_DisableSketchClick(wxCommandEvent& event) +{ + if (wxPreferencesEditor::ShouldApplyChangesImmediately()) { + TransferDataFromWindow(); + } +} diff --git a/xLights/preferences/CheckSequenceSettingsPanel.h b/xLights/preferences/CheckSequenceSettingsPanel.h index ab6edae12c..30c4ff3629 100644 --- a/xLights/preferences/CheckSequenceSettingsPanel.h +++ b/xLights/preferences/CheckSequenceSettingsPanel.h @@ -27,6 +27,7 @@ class CheckSequenceSettingsPanel: public wxPanel //(*Declarations(CheckSequenceSettingsPanel) wxCheckBox* CheckBox_CustomSizeCheck; + wxCheckBox* CheckBox_DisableSketch; wxCheckBox* CheckBox_DupNodeMG; wxCheckBox* CheckBox_DupUniv; wxCheckBox* CheckBox_NonContigChOnPort; @@ -48,6 +49,7 @@ class CheckSequenceSettingsPanel: public wxPanel static const long ID_CHECKBOX4; static const long ID_CHECKBOX5; static const long ID_CHECKBOX6; + static const long ID_CHECKBOX7; //*) private: @@ -60,6 +62,7 @@ class CheckSequenceSettingsPanel: public wxPanel void OnCheckBox_DupNodeMGClick(wxCommandEvent& event); void OnCheckBox_TransTimeClick(wxCommandEvent& event); void OnCheckBox_CustomSizeCheckClick(wxCommandEvent& event); + void OnCheckBox_DisableSketchClick(wxCommandEvent& event); //*) DECLARE_EVENT_TABLE() diff --git a/xLights/sequencer/Effect.cpp b/xLights/sequencer/Effect.cpp index 81f9fdecef..ae1d85761d 100644 --- a/xLights/sequencer/Effect.cpp +++ b/xLights/sequencer/Effect.cpp @@ -65,6 +65,7 @@ class ControlRenameMap data["E_CHOICE_CoroFaces_Phoneme"] = "E_CHOICE_Faces_Phoneme"; data["E_CHOICE_CoroFaces_Eyes"] = "E_CHOICE_Faces_Eyes"; + data["E_CHOICE_CoroFaces_EyeBlinkFrequency"] = "E_CHOICE_Faces_EyeBlinkFrequency"; data["E_CHECKBOX_CoroFaces_Outline"] = "E_CHECKBOX_Faces_Outline"; data["E_CHECKBOX_CoroFaces_InPapagayo"] = ""; data["E_CHECKBOX_Faces_InPapagayo"] = ""; diff --git a/xLights/sequencer/EffectsGrid.cpp b/xLights/sequencer/EffectsGrid.cpp index f4022f6c1b..5eddc7bf09 100644 --- a/xLights/sequencer/EffectsGrid.cpp +++ b/xLights/sequencer/EffectsGrid.cpp @@ -896,7 +896,7 @@ void EffectsGrid::OnGridPopup(wxCommandEvent& event) if (newstart != newend) { Effect* newef = el->AddEffect(0, "", "", "", newstart, newend, EFFECT_SELECTED, false); mSequenceElements->get_undo_mgr().CaptureAddedEffect(el->GetParentElement()->GetName(), el->GetIndex(), newef->GetID()); - i++; // jump over the one we just inserted + ++i; // jump over the one we just inserted } } ef->SetSelected(EFFECT_SELECTED); @@ -2186,7 +2186,7 @@ void EffectsGrid::ACCascade(int startMS, int endMS, int startCol, int endCol, in uniqueLayers.push_back(elTarget); } else { - extraLayers++; + ++extraLayers; } } } @@ -2993,17 +2993,17 @@ bool EffectsGrid::HandleACKey(wxChar key, bool shift) if (mCellRangeSelected) { if (shift) { if (mRangeCursorRow < mRangeEndRow) { - mRangeCursorRow++; + ++mRangeCursorRow; mRangeStartRow = mRangeCursorRow; } else { if (mRangeEndRow < mSequenceElements->GetRowInformationSize() - 1) { - mRangeCursorRow++; + ++mRangeCursorRow; mRangeEndRow = mRangeCursorRow; } } } else { if (mRangeCursorRow < mSequenceElements->GetRowInformationSize() - 1) { - mRangeCursorRow++; + ++mRangeCursorRow; } mRangeStartRow = mRangeCursorRow; mRangeEndRow = mRangeCursorRow; @@ -3105,11 +3105,11 @@ bool EffectsGrid::HandleACKey(wxChar key, bool shift) Effect* eff2 = tel->GetEffect(mRangeEndCol + 1); if (eff1 != nullptr && eff2 != nullptr) { if (mRangeCursorCol < mRangeEndCol) { - mRangeCursorCol++; + ++mRangeCursorCol; mRangeStartCol = mRangeCursorCol; } else { - mRangeCursorCol++; + ++mRangeCursorCol; mRangeEndCol = mRangeCursorCol; } @@ -3474,7 +3474,7 @@ void EffectsGrid::Resize(int position, bool offset, bool control) int times = 2; while (time_plus_one == time && times < 11) { time_plus_one = mTimeline->GetAbsoluteTimeMSfromPosition(position + times); - times++; + ++times; } int time_delta = (time_plus_one - time) * (10 / (times - 1)); // snap within 10 pixels if (time_delta == 0) time_delta = 25; @@ -3700,13 +3700,13 @@ void EffectsGrid::MoveSelectedEffectDown(bool shift) if (mCellRangeSelected) { if (shift) { if (mRangeEndRow < mSequenceElements->GetRowInformationSize() - 1) { - mRangeEndRow++; + ++mRangeEndRow; } } else { if (mRangeStartRow < mSequenceElements->GetRowInformationSize() - 1) { - mRangeStartRow++; - mRangeEndRow++; + ++mRangeStartRow; + ++mRangeEndRow; } } SetRCToolTip(); @@ -3747,7 +3747,7 @@ void EffectsGrid::MoveSelectedEffectDown(bool shift) return; } } - row++; + ++row; } } else if (MultipleEffectsSelected()) { logger_base.debug("EffectsGrid::MoveSelectedEffectDown moving multiple effects."); @@ -3838,9 +3838,9 @@ void EffectsGrid::MoveSelectedEffectRight(bool shift, bool control, bool alt) Effect* eff1 = tel->GetEffect(mRangeStartCol + 1); Effect* eff2 = tel->GetEffect(mRangeEndCol + 1); if (eff1 != nullptr && eff2 != nullptr) { - mRangeEndCol++; + ++mRangeEndCol; if (!shift) { - mRangeStartCol++; + ++mRangeStartCol; } SetRCToolTip(); UpdateSelectedEffects(); @@ -3896,7 +3896,7 @@ void EffectsGrid::MoveSelectedEffectRight(bool shift, bool control, bool alt) force = true; break; } - col++; + ++col; if (col < tel->GetEffectCount()) { timing_effect = tel->GetEffect(col); } @@ -5507,7 +5507,9 @@ void EffectsGrid::ResizeSingleEffect(int position) void EffectsGrid::ResizeSingleEffectMS(int timems) { - if (mEffectLayer->GetEffect(mResizeEffectIndex)->IsLocked() || mEffectLayer->IsFixedTimingLayer()) return; + Effect* effect = mEffectLayer->GetEffect(mResizeEffectIndex); + if (!effect) return; + if (effect->IsLocked() || mEffectLayer->IsFixedTimingLayer()) return; int time = mTimeline->RoundToMultipleOfPeriod(timems, mSequenceElements->GetFrequency()); if (mResizingMode == EFFECT_RESIZE_LEFT || mResizingMode == EFFECT_RESIZE_LEFT_EDGE) { @@ -6989,7 +6991,7 @@ void EffectsGrid::DuplicateSelectedEffects() mSequenceElements->get_undo_mgr().CaptureAddedEffect(el->GetParentElement()->GetName(), el->GetIndex(), newef->GetID()); } } - startCol++; + ++startCol; } } else { diff --git a/xLights/sequencer/MainSequencer.cpp b/xLights/sequencer/MainSequencer.cpp index 8e58dede9e..a89a1e917b 100644 --- a/xLights/sequencer/MainSequencer.cpp +++ b/xLights/sequencer/MainSequencer.cpp @@ -1205,9 +1205,11 @@ void MainSequencer::GetPresetData(wxString& copy_data) } } -void MainSequencer::GetSelectedEffectsData(wxString& copy_data) { +bool MainSequencer::GetSelectedEffectsData(wxString& copy_data) { log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); + bool effectsPresent = false; + int start_column = PanelEffectGrid->GetStartColumn(); int column_start_time = -1000; int number_of_timings = 0; @@ -1249,7 +1251,7 @@ void MainSequencer::GetSelectedEffectsData(wxString& copy_data) { "\t" + start_time + "\t" + end_time + "\t" + row + "\t" + column_start; if( i < number_of_timing_rows ) { - number_of_timings++; + ++number_of_timings; last_timing_row = row_number; if( first_timing_row < 0 ) { @@ -1259,7 +1261,7 @@ void MainSequencer::GetSelectedEffectsData(wxString& copy_data) { } else { - number_of_effects++; + ++number_of_effects; if( column_start_time == -1000 && mSequenceElements->GetSelectedTimingRow() >= 0 ) { if (tel == nullptr) @@ -1315,6 +1317,8 @@ void MainSequencer::GetSelectedEffectsData(wxString& copy_data) { last_timing_row -= first_timing_row; // calculate the total number of timing rows } + effectsPresent = number_of_timings + number_of_effects > 0; + wxString num_timings = wxString::Format("%d",number_of_timings); wxString num_effects = wxString::Format("%d",number_of_effects); wxString num_timing_rows = wxString::Format("%d",number_of_timing_rows); @@ -1328,11 +1332,15 @@ void MainSequencer::GetSelectedEffectsData(wxString& copy_data) { copy_data += "\tNO_PASTE_BY_CELL\n" + effect_data; } UnTagAllEffects(); + + return effectsPresent; } -void MainSequencer::GetACEffectsData(wxString& copy_data) { +bool MainSequencer::GetACEffectsData(wxString& copy_data) { log4cpp::Category &logger_base = log4cpp::Category::getInstance(std::string("log_base")); + bool effectsPresent = false; + int start_column = PanelEffectGrid->GetStartColumn(); int end_column = PanelEffectGrid->GetEndColumn(); int start_row = PanelEffectGrid->GetStartRow(); @@ -1353,11 +1361,11 @@ void MainSequencer::GetACEffectsData(wxString& copy_data) { column_end_time = eff2->GetEndTimeMS(); } else { - return; + return false; } } else { - return; // there should always be a range selection in AC copy mode + return false; // there should always be a range selection in AC copy mode } for (int i = 0; i < mSequenceElements->GetRowInformationSize(); i++) @@ -1398,7 +1406,7 @@ void MainSequencer::GetACEffectsData(wxString& copy_data) { effect_data += ef->GetEffectName() + "\t" + settings + "\t" + ef->GetPaletteAsString() + "\t" + start_time + "\t" + end_time + "\t" + row + "\t" + column_start; - number_of_effects++; + ++number_of_effects; Effect* te_start = tel->GetEffectByTime(adj_start_time + 1); // if we don't add 1ms, it picks up the end of the previous timing instead of the start of this one Effect* te_end = tel->GetEffectByTime(adj_end_time); if (te_start != nullptr && te_end != nullptr) @@ -1425,6 +1433,9 @@ void MainSequencer::GetACEffectsData(wxString& copy_data) { } } } + + effectsPresent = number_of_effects + number_of_timings > 0; + wxString num_timings = wxString::Format("%d", number_of_timings); wxString num_effects = wxString::Format("%d", number_of_effects); wxString num_timing_rows = wxString::Format("%d", number_of_timing_rows); @@ -1438,17 +1449,20 @@ void MainSequencer::GetACEffectsData(wxString& copy_data) { copy_data = "CopyFormatAC\t" + num_timings + "\t" + num_effects + "\t" + num_timing_rows + "\t" + last_row + "\t" + starting_column + "\t" + ending_column + "\t" + starting_row + "\t" + ending_row + "\t" + starting_time + "\t" + ending_time; copy_data += "\tPASTE_BY_CELL\n" + effect_data; UnTagAllEffects(); + + return effectsPresent; } bool MainSequencer::CopySelectedEffects() { wxString copy_data; + bool dataPresent = false; if (PanelEffectGrid->IsACActive()) { - GetACEffectsData(copy_data); + dataPresent = GetACEffectsData(copy_data); } else { - GetSelectedEffectsData(copy_data); + dataPresent = GetSelectedEffectsData(copy_data); } - if (!copy_data.IsEmpty() && wxTheClipboard != nullptr && wxTheClipboard->Open()) { + if (dataPresent && !copy_data.IsEmpty() && wxTheClipboard != nullptr && wxTheClipboard->Open()) { if (!wxTheClipboard->SetData(new wxTextDataObject(copy_data))) { DisplayError("Unable to copy data to clipboard.", this); } diff --git a/xLights/sequencer/MainSequencer.h b/xLights/sequencer/MainSequencer.h index c927120e3f..065abfb2be 100644 --- a/xLights/sequencer/MainSequencer.h +++ b/xLights/sequencer/MainSequencer.h @@ -42,8 +42,8 @@ class MainSequencer: public wxPanel void UpdateEffectGridVerticalScrollBar(); void UpdateTimeDisplay(int time_ms, float fps); void UpdateSelectedDisplay(int selected); - void GetSelectedEffectsData(wxString& copy_data); - void GetACEffectsData(wxString& copy_data); + bool GetSelectedEffectsData(wxString& copy_data); + bool GetACEffectsData(wxString& copy_data); void GetPresetData(wxString& copy_data); bool CopySelectedEffects(); bool PasteByCellActive() const { return mPasteByCell; } diff --git a/xLights/sequencer/tabSequencer.cpp b/xLights/sequencer/tabSequencer.cpp index d29724369e..c627ec4380 100644 --- a/xLights/sequencer/tabSequencer.cpp +++ b/xLights/sequencer/tabSequencer.cpp @@ -566,8 +566,29 @@ void xLightsFrame::CheckForValidModels() if (!mapall) { dialog.StaticTextMessage->SetLabel("Model '" + name + "'\ndoes not exist in your list of models"); dialog.ChoiceModels->Set(ToArrayString(AllNames)); + bool renameAlias = false; if (AllNames.size() > 0) { - dialog.ChoiceModels->SetSelection(0); + + std::string mapto = ""; + // go through all the models looking for an alias match + for (const auto& it : AllModels) + { + if (it.second->IsAlias(name, true)) { + renameAlias = true; + mapto = it.first; + break; + } else if (it.second->IsAlias(name, false)) { + // this is an alias but not a rename one + mapto = it.first; + } + } + + if (mapto == "") { + dialog.ChoiceModels->SetSelection(0); + } else { + dialog.ChoiceModels->SetStringSelection(mapto); + dialog.RadioButtonRename->SetValue(true); + } } else { dialog.ChoiceModels->Hide(); @@ -576,7 +597,8 @@ void xLightsFrame::CheckForValidModels() } dialog.Fit(); - if (((!_renderMode && !_checkSequenceMode) || _promptBatchRenderIssues) && !cancelled && HasEffects(me)) { + // if mapto is not blank then we can use an oldname alias to remap automagically + if (!renameAlias && ((!_renderMode && !_checkSequenceMode) || _promptBatchRenderIssues) && !cancelled && HasEffects(me)) { cancelled = (dialog.ShowModal() == wxID_CANCEL); } } diff --git a/xLights/support/VectorMath.cpp b/xLights/support/VectorMath.cpp index 3f72dee4e8..e34c0be98f 100644 --- a/xLights/support/VectorMath.cpp +++ b/xLights/support/VectorMath.cpp @@ -344,7 +344,7 @@ glm::mat4 VectorMath::rotationMatrixFromXAxisToVector2(const glm::vec3 &o, const if (o.y != p.y || o.z != p.z) { glm::vec3 v = glm::vec3(0, -a.z, a.y); float len = glm::length(a); - float angle = len == 0.0f ? 0.0 : acos(a.x / len); + float angle = len == 0.0f ? 0.0f : acos(a.x / len); return glm::rotate(angle, v); } else { if (p.x < o.x) { diff --git a/xLights/utils/CurlManager.cpp b/xLights/utils/CurlManager.cpp index d5c30e6f28..5b18dffb61 100644 --- a/xLights/utils/CurlManager.cpp +++ b/xLights/utils/CurlManager.cpp @@ -70,6 +70,11 @@ static size_t urlReadData(void* ptr, size_t size, size_t nmemb, void* userp) { dt->curPos += numb; return numb; } +static int urlSeekData(void *userp, curl_off_t offset, int origin) { + CurlManager::CurlPrivateData* dt = (CurlManager::CurlPrivateData*)userp; + dt->curPos = offset; + return CURL_SEEKFUNC_OK; +} CURL* CurlManager::createCurl(const std::string& fullUrl, CurlPrivateData** cpd, bool upload) { static std::string USERAGENT = wxAppConsole::GetInstance()->GetAppName().ToStdString() + "-" + xlights_version_string; @@ -81,25 +86,33 @@ CURL* CurlManager::createCurl(const std::string& fullUrl, CurlPrivateData** cpd, curl_easy_setopt(c, CURLOPT_CONNECTTIMEOUT_MS, 4000L); curl_easy_setopt(c, CURLOPT_TIMEOUT_MS, 12000L); curl_easy_setopt(c, CURLOPT_ACCEPT_ENCODING, ""); - curl_easy_setopt(c, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(c, CURLOPT_NOSIGNAL, 1L); //curl_easy_setopt(c, CURLOPT_VERBOSE, 2L); curl_easy_setopt(c, CURLOPT_UPKEEP_INTERVAL_MS, 5000L); curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, urlWriteData); CurlPrivateData* data = new CurlPrivateData(); data->host = host; + if (hd->allowHTTP0_9) { + curl_easy_setopt(c, CURLOPT_HTTP09_ALLOWED, 1L); + data->isHTTP_0_9 = true; + } curl_easy_setopt(c, CURLOPT_ERRORBUFFER, data->errorResp); curl_easy_setopt(c, CURLOPT_WRITEDATA, &data->resp); curl_easy_setopt(c, CURLOPT_PRIVATE, data); if (hd->username != "") { curl_easy_setopt(c, CURLOPT_USERNAME, hd->username.c_str()); curl_easy_setopt(c, CURLOPT_PASSWORD, hd->password.c_str()); - curl_easy_setopt(c, CURLOPT_HTTPAUTH, CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_NEGOTIATE); + curl_easy_setopt(c, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); } if (upload) { data->req = new std::vector(); + curl_easy_setopt(c, CURLOPT_UPLOAD_BUFFERSIZE, 1024 * 1024); + curl_easy_setopt(c, CURLOPT_BUFFERSIZE, 1024 * 1024); curl_easy_setopt(c, CURLOPT_READDATA, data); curl_easy_setopt(c, CURLOPT_READFUNCTION, urlReadData); + curl_easy_setopt(c, CURLOPT_SEEKDATA, data); + curl_easy_setopt(c, CURLOPT_SEEKFUNCTION, urlSeekData); } if (cpd) { *cpd = data; @@ -125,14 +138,19 @@ void CurlManager::add(const std::string& furl, const std::string& method, const curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); } - if ((method == "POST") || (method == "PUT")) { - curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, data.c_str()); - } - struct curl_slist* headers = NULL; for (auto& h : extraHeaders) { headers = curl_slist_append(headers, h.c_str()); } + + if ((method == "POST") || (method == "PUT")) { + curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, data.c_str()); + // turn off the Expect continue thing + headers = curl_slist_append(headers, "Expect:"); + } else if (method == "PATCH") { + headers = curl_slist_append(headers, "Expect:"); + } + if (headers) { curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); } @@ -173,8 +191,7 @@ std::string CurlManager::doGet(const std::string& furl, int& rc) { logger_curl.info("Adding Synchronous CURL - URL: %s Method: GET", furl.c_str()); bool done = false; - addCURL( - furl, curl, [&done](CURL* c) { done = true; }, false); + addCURL(furl, curl, [&done](CURL* c) { done = true; }, false); while (!done && processCurls()) { wxYieldIfNeeded(); } @@ -185,7 +202,7 @@ std::string CurlManager::doGet(const std::string& furl, int& rc) { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rc2); rc = rc2; std::string resp; - if (rc) { + if (rc || data->isHTTP_0_9) { resp.assign(reinterpret_cast(data->resp.data()), data->resp.size()); } else { resp = data->errorResp; @@ -214,6 +231,12 @@ static size_t read_callback(void* ptr, size_t size, size_t nmemb, void* userp) { dt->curPos += numb; return numb; } + +static int seek_callback(void *userp, curl_off_t offset, int origin) { + struct ReadDataInfo* dt = (struct ReadDataInfo*)userp; + dt->curPos = offset; + return CURL_SEEKFUNC_OK; +} std::string CurlManager::doPost(const std::string& furl, const std::string& contentType, const std::vector& data, int& rc) { static log4cpp::Category& logger_curl = log4cpp::Category::getInstance(std::string("log_curl")); logger_curl.info("Adding Synchronous CURL - URL: %s Method: POST", furl.c_str()); @@ -225,6 +248,7 @@ std::string CurlManager::doPost(const std::string& furl, const std::string& cont head = curl_slist_append(head, ct.c_str()); std::string cl = "Content-Length: " + std::to_string(data.size()); head = curl_slist_append(head, cl.c_str()); + head = curl_slist_append(head, "Expect:"); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, head); @@ -235,11 +259,12 @@ std::string CurlManager::doPost(const std::string& furl, const std::string& cont curl_easy_setopt(curl, CURLOPT_READDATA, &dta); curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); + curl_easy_setopt(curl, CURLOPT_SEEKDATA, &dta); + curl_easy_setopt(curl, CURLOPT_SEEKFUNCTION, seek_callback); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)data.size()); bool done = false; - addCURL( - furl, curl, [&done](CURL* c) { done = true; }, false); + addCURL(furl, curl, [&done](CURL* c) { done = true; }, false); while (!done && processCurls()) { wxYieldIfNeeded(); } @@ -250,7 +275,7 @@ std::string CurlManager::doPost(const std::string& furl, const std::string& cont curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rc2); rc = rc2; std::string resp; - if (rc) { + if (rc || cdata->isHTTP_0_9) { resp.assign(reinterpret_cast(cdata->resp.data()), cdata->resp.size()); } else { resp = cdata->errorResp; @@ -263,6 +288,13 @@ std::string CurlManager::doPost(const std::string& furl, const std::string& cont return resp; } +std::string CurlManager::doPost(const std::string& furl, const std::string& contentType, const std::string &data, int& rc) { + std::vector vdata; + vdata.resize(data.size()); + memcpy((void*)&vdata[0], (void*)data.c_str(), data.size()); + return doPost(furl, contentType, vdata, rc); +} + std::string CurlManager::doPut(const std::string& furl, const std::string& contentType, const std::vector& data, int& rc) { static log4cpp::Category& logger_curl = log4cpp::Category::getInstance(std::string("log_curl")); logger_curl.info("Adding Synchronous CURL - URL: %s Method: PUT", furl.c_str()); @@ -273,6 +305,7 @@ std::string CurlManager::doPut(const std::string& furl, const std::string& conte head = curl_slist_append(head, ct.c_str()); std::string cl = "Content-Length: " + std::to_string(data.size()); head = curl_slist_append(head, cl.c_str()); + head = curl_slist_append(head, "Expect:"); curl_easy_setopt(curl, CURLOPT_PUT, 1L); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, head); @@ -283,10 +316,11 @@ std::string CurlManager::doPut(const std::string& furl, const std::string& conte curl_easy_setopt(curl, CURLOPT_READDATA, &dta); curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); + curl_easy_setopt(curl, CURLOPT_SEEKDATA, &dta); + curl_easy_setopt(curl, CURLOPT_SEEKFUNCTION, seek_callback); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)data.size()); - addCURL( - furl, curl, [](CURL* c) {}, false); + addCURL(furl, curl, [](CURL* c) {}, false); while (processCurls()) { wxYieldIfNeeded(); } @@ -297,7 +331,7 @@ std::string CurlManager::doPut(const std::string& furl, const std::string& conte curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rc2); rc = rc2; std::string resp; - if (rc) { + if (rc || cdata->isHTTP_0_9) { resp.assign(reinterpret_cast(cdata->resp.data()), cdata->resp.size()); } else { resp = cdata->errorResp; @@ -308,6 +342,12 @@ std::string CurlManager::doPut(const std::string& furl, const std::string& conte curl_easy_cleanup(curl); return resp; } +std::string CurlManager::doPut(const std::string& furl, const std::string& contentType, const std::string &data, int& rc) { + std::vector vdata; + vdata.resize(data.size()); + memcpy((void*)&vdata[0], (void*)data.c_str(), data.size()); + return doPut(furl, contentType, vdata, rc); +} bool CurlManager::doProcessCurls() { CURLMcode mc; @@ -366,6 +406,11 @@ void CurlManager::setHostUsernamePassword(const std::string& host, const std::st h->username = username; h->password = password; } +void CurlManager::setHostAllowHTTP_0_9(const std::string &host, bool v) { + std::unique_lock l(lock); + HostData* h = getHostData(host); + h->allowHTTP0_9 = v; +} std::string CurlManager::getHost(const std::string& url) { int idx = url.find("://"); diff --git a/xLights/utils/CurlManager.h b/xLights/utils/CurlManager.h index 12517c50d9..f2a27293dd 100644 --- a/xLights/utils/CurlManager.h +++ b/xLights/utils/CurlManager.h @@ -26,6 +26,7 @@ class CurlManager { std::vector* req = nullptr; size_t curPos = 0; + bool isHTTP_0_9 = false; }; // Raw methods for working directly with the CURL* objects @@ -44,8 +45,11 @@ class CurlManager { std::string doGet(const std::string& furl, int& rc); std::string doPost(const std::string& furl, const std::string& contentType, const std::vector& data, int& rc); std::string doPut(const std::string& furl, const std::string& contentType, const std::vector& data, int& rc); + std::string doPost(const std::string& furl, const std::string& contentType, const std::string &data, int& rc); + std::string doPut(const std::string& furl, const std::string& contentType, const std::string &data, int& rc); void setHostUsernamePassword(const std::string& host, const std::string& username, const std::string password); + void setHostAllowHTTP_0_9(const std::string &host, bool v = true); bool processCurls() { if (numCurls) { return doProcessCurls(); @@ -83,6 +87,7 @@ class CurlManager { std::string username; std::string password; int authStatus = 0; + bool allowHTTP0_9 = false; }; std::map hostData; HostData* getHostData(const std::string& host); diff --git a/xLights/utils/ip_utils.cpp b/xLights/utils/ip_utils.cpp index 419fec4595..e8eef8c6b6 100644 --- a/xLights/utils/ip_utils.cpp +++ b/xLights/utils/ip_utils.cpp @@ -17,10 +17,12 @@ #include #include +#include namespace ip_utils { static std::map __resolvedIPMap; + static std::mutex __resolvedIPMapLock; bool IsIPValid(const std::string& ip) { @@ -103,6 +105,7 @@ namespace ip_utils if (IsIPValid(ip) || (ip == "MULTICAST") || ip == "" || StartsWith(ip, ".") || (ip[0] >= '0' && ip[0] <= '9')) { return ip; } + std::unique_lock lock(__resolvedIPMapLock); const std::string& resolvedIp = __resolvedIPMap[ip]; if (resolvedIp == "") { wxIPV4address add; diff --git a/xLights/webp/decode.h b/xLights/webp/decode.h new file mode 100644 index 0000000000..9d968061d1 --- /dev/null +++ b/xLights/webp/decode.h @@ -0,0 +1,505 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +// Main decoding functions for WebP images. +// +// Author: Skal (pascal.massimino@gmail.com) + +#ifndef WEBP_WEBP_DECODE_H_ +#define WEBP_WEBP_DECODE_H_ + +#include "./types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define WEBP_DECODER_ABI_VERSION 0x0209 // MAJOR(8b) + MINOR(8b) + +// Note: forward declaring enumerations is not allowed in (strict) C and C++, +// the types are left here for reference. +// typedef enum VP8StatusCode VP8StatusCode; +// typedef enum WEBP_CSP_MODE WEBP_CSP_MODE; +typedef struct WebPRGBABuffer WebPRGBABuffer; +typedef struct WebPYUVABuffer WebPYUVABuffer; +typedef struct WebPDecBuffer WebPDecBuffer; +typedef struct WebPIDecoder WebPIDecoder; +typedef struct WebPBitstreamFeatures WebPBitstreamFeatures; +typedef struct WebPDecoderOptions WebPDecoderOptions; +typedef struct WebPDecoderConfig WebPDecoderConfig; + +// Return the decoder's version number, packed in hexadecimal using 8bits for +// each of major/minor/revision. E.g: v2.5.7 is 0x020507. +WEBP_EXTERN int WebPGetDecoderVersion(void); + +// Retrieve basic header information: width, height. +// This function will also validate the header, returning true on success, +// false otherwise. '*width' and '*height' are only valid on successful return. +// Pointers 'width' and 'height' can be passed NULL if deemed irrelevant. +// Note: The following chunk sequences (before the raw VP8/VP8L data) are +// considered valid by this function: +// RIFF + VP8(L) +// RIFF + VP8X + (optional chunks) + VP8(L) +// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. +// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. +WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size, + int* width, int* height); + +// Decodes WebP images pointed to by 'data' and returns RGBA samples, along +// with the dimensions in *width and *height. The ordering of samples in +// memory is R, G, B, A, R, G, B, A... in scan order (endian-independent). +// The returned pointer should be deleted calling WebPFree(). +// Returns NULL in case of error. +WEBP_EXTERN uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size, + int* width, int* height); + +// Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data. +WEBP_EXTERN uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size, + int* width, int* height); + +// Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data. +WEBP_EXTERN uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, + int* width, int* height); + +// Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data. +// If the bitstream contains transparency, it is ignored. +WEBP_EXTERN uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, + int* width, int* height); + +// Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data. +WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size, + int* width, int* height); + + +// Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer +// returned is the Y samples buffer. Upon return, *u and *v will point to +// the U and V chroma data. These U and V buffers need NOT be passed to +// WebPFree(), unlike the returned Y luma one. The dimension of the U and V +// planes are both (*width + 1) / 2 and (*height + 1) / 2. +// Upon return, the Y buffer has a stride returned as '*stride', while U and V +// have a common stride returned as '*uv_stride'. +// 'width' and 'height' may be NULL, the other pointers must not be. +// Returns NULL in case of error. +// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr +WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size, + int* width, int* height, + uint8_t** u, uint8_t** v, + int* stride, int* uv_stride); + +// These five functions are variants of the above ones, that decode the image +// directly into a pre-allocated buffer 'output_buffer'. The maximum storage +// available in this buffer is indicated by 'output_buffer_size'. If this +// storage is not sufficient (or an error occurred), NULL is returned. +// Otherwise, output_buffer is returned, for convenience. +// The parameter 'output_stride' specifies the distance (in bytes) +// between scanlines. Hence, output_buffer_size is expected to be at least +// output_stride x picture-height. +WEBP_EXTERN uint8_t* WebPDecodeRGBAInto( + const uint8_t* data, size_t data_size, + uint8_t* output_buffer, size_t output_buffer_size, int output_stride); +WEBP_EXTERN uint8_t* WebPDecodeARGBInto( + const uint8_t* data, size_t data_size, + uint8_t* output_buffer, size_t output_buffer_size, int output_stride); +WEBP_EXTERN uint8_t* WebPDecodeBGRAInto( + const uint8_t* data, size_t data_size, + uint8_t* output_buffer, size_t output_buffer_size, int output_stride); + +// RGB and BGR variants. Here too the transparency information, if present, +// will be dropped and ignored. +WEBP_EXTERN uint8_t* WebPDecodeRGBInto( + const uint8_t* data, size_t data_size, + uint8_t* output_buffer, size_t output_buffer_size, int output_stride); +WEBP_EXTERN uint8_t* WebPDecodeBGRInto( + const uint8_t* data, size_t data_size, + uint8_t* output_buffer, size_t output_buffer_size, int output_stride); + +// WebPDecodeYUVInto() is a variant of WebPDecodeYUV() that operates directly +// into pre-allocated luma/chroma plane buffers. This function requires the +// strides to be passed: one for the luma plane and one for each of the +// chroma ones. The size of each plane buffer is passed as 'luma_size', +// 'u_size' and 'v_size' respectively. +// Pointer to the luma plane ('*luma') is returned or NULL if an error occurred +// during decoding (or because some buffers were found to be too small). +WEBP_EXTERN uint8_t* WebPDecodeYUVInto( + const uint8_t* data, size_t data_size, + uint8_t* luma, size_t luma_size, int luma_stride, + uint8_t* u, size_t u_size, int u_stride, + uint8_t* v, size_t v_size, int v_stride); + +//------------------------------------------------------------------------------ +// Output colorspaces and buffer + +// Colorspaces +// Note: the naming describes the byte-ordering of packed samples in memory. +// For instance, MODE_BGRA relates to samples ordered as B,G,R,A,B,G,R,A,... +// Non-capital names (e.g.:MODE_Argb) relates to pre-multiplied RGB channels. +// RGBA-4444 and RGB-565 colorspaces are represented by following byte-order: +// RGBA-4444: [r3 r2 r1 r0 g3 g2 g1 g0], [b3 b2 b1 b0 a3 a2 a1 a0], ... +// RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ... +// In the case WEBP_SWAP_16BITS_CSP is defined, the bytes are swapped for +// these two modes: +// RGBA-4444: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], ... +// RGB-565: [g2 g1 g0 b4 b3 b2 b1 b0], [r4 r3 r2 r1 r0 g5 g4 g3], ... + +typedef enum WEBP_CSP_MODE { + MODE_RGB = 0, MODE_RGBA = 1, + MODE_BGR = 2, MODE_BGRA = 3, + MODE_ARGB = 4, MODE_RGBA_4444 = 5, + MODE_RGB_565 = 6, + // RGB-premultiplied transparent modes (alpha value is preserved) + MODE_rgbA = 7, + MODE_bgrA = 8, + MODE_Argb = 9, + MODE_rgbA_4444 = 10, + // YUV modes must come after RGB ones. + MODE_YUV = 11, MODE_YUVA = 12, // yuv 4:2:0 + MODE_LAST = 13 +} WEBP_CSP_MODE; + +// Some useful macros: +static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) { + return (mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb || + mode == MODE_rgbA_4444); +} + +static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) { + return (mode == MODE_RGBA || mode == MODE_BGRA || mode == MODE_ARGB || + mode == MODE_RGBA_4444 || mode == MODE_YUVA || + WebPIsPremultipliedMode(mode)); +} + +static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) { + return (mode < MODE_YUV); +} + +//------------------------------------------------------------------------------ +// WebPDecBuffer: Generic structure for describing the output sample buffer. + +struct WebPRGBABuffer { // view as RGBA + uint8_t* rgba; // pointer to RGBA samples + int stride; // stride in bytes from one scanline to the next. + size_t size; // total size of the *rgba buffer. +}; + +struct WebPYUVABuffer { // view as YUVA + uint8_t* y, *u, *v, *a; // pointer to luma, chroma U/V, alpha samples + int y_stride; // luma stride + int u_stride, v_stride; // chroma strides + int a_stride; // alpha stride + size_t y_size; // luma plane size + size_t u_size, v_size; // chroma planes size + size_t a_size; // alpha-plane size +}; + +// Output buffer +struct WebPDecBuffer { + WEBP_CSP_MODE colorspace; // Colorspace. + int width, height; // Dimensions. + int is_external_memory; // If non-zero, 'internal_memory' pointer is not + // used. If value is '2' or more, the external + // memory is considered 'slow' and multiple + // read/write will be avoided. + union { + WebPRGBABuffer RGBA; + WebPYUVABuffer YUVA; + } u; // Nameless union of buffer parameters. + uint32_t pad[4]; // padding for later use + + uint8_t* private_memory; // Internally allocated memory (only when + // is_external_memory is 0). Should not be used + // externally, but accessed via the buffer union. +}; + +// Internal, version-checked, entry point +WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int); + +// Initialize the structure as empty. Must be called before any other use. +// Returns false in case of version mismatch +static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) { + return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION); +} + +// Free any memory associated with the buffer. Must always be called last. +// Note: doesn't free the 'buffer' structure itself. +WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer); + +//------------------------------------------------------------------------------ +// Enumeration of the status codes + +typedef enum VP8StatusCode { + VP8_STATUS_OK = 0, + VP8_STATUS_OUT_OF_MEMORY, + VP8_STATUS_INVALID_PARAM, + VP8_STATUS_BITSTREAM_ERROR, + VP8_STATUS_UNSUPPORTED_FEATURE, + VP8_STATUS_SUSPENDED, + VP8_STATUS_USER_ABORT, + VP8_STATUS_NOT_ENOUGH_DATA +} VP8StatusCode; + +//------------------------------------------------------------------------------ +// Incremental decoding +// +// This API allows streamlined decoding of partial data. +// Picture can be incrementally decoded as data become available thanks to the +// WebPIDecoder object. This object can be left in a SUSPENDED state if the +// picture is only partially decoded, pending additional input. +// Code example: +/* + WebPInitDecBuffer(&output_buffer); + output_buffer.colorspace = mode; + ... + WebPIDecoder* idec = WebPINewDecoder(&output_buffer); + while (additional_data_is_available) { + // ... (get additional data in some new_data[] buffer) + status = WebPIAppend(idec, new_data, new_data_size); + if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) { + break; // an error occurred. + } + + // The above call decodes the current available buffer. + // Part of the image can now be refreshed by calling + // WebPIDecGetRGB()/WebPIDecGetYUVA() etc. + } + WebPIDelete(idec); +*/ + +// Creates a new incremental decoder with the supplied buffer parameter. +// This output_buffer can be passed NULL, in which case a default output buffer +// is used (with MODE_RGB). Otherwise, an internal reference to 'output_buffer' +// is kept, which means that the lifespan of 'output_buffer' must be larger than +// that of the returned WebPIDecoder object. +// The supplied 'output_buffer' content MUST NOT be changed between calls to +// WebPIAppend() or WebPIUpdate() unless 'output_buffer.is_external_memory' is +// not set to 0. In such a case, it is allowed to modify the pointers, size and +// stride of output_buffer.u.RGBA or output_buffer.u.YUVA, provided they remain +// within valid bounds. +// All other fields of WebPDecBuffer MUST remain constant between calls. +// Returns NULL if the allocation failed. +WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer); + +// This function allocates and initializes an incremental-decoder object, which +// will output the RGB/A samples specified by 'csp' into a preallocated +// buffer 'output_buffer'. The size of this buffer is at least +// 'output_buffer_size' and the stride (distance in bytes between two scanlines) +// is specified by 'output_stride'. +// Additionally, output_buffer can be passed NULL in which case the output +// buffer will be allocated automatically when the decoding starts. The +// colorspace 'csp' is taken into account for allocating this buffer. All other +// parameters are ignored. +// Returns NULL if the allocation failed, or if some parameters are invalid. +WEBP_EXTERN WebPIDecoder* WebPINewRGB( + WEBP_CSP_MODE csp, + uint8_t* output_buffer, size_t output_buffer_size, int output_stride); + +// This function allocates and initializes an incremental-decoder object, which +// will output the raw luma/chroma samples into a preallocated planes if +// supplied. The luma plane is specified by its pointer 'luma', its size +// 'luma_size' and its stride 'luma_stride'. Similarly, the chroma-u plane +// is specified by the 'u', 'u_size' and 'u_stride' parameters, and the chroma-v +// plane by 'v' and 'v_size'. And same for the alpha-plane. The 'a' pointer +// can be pass NULL in case one is not interested in the transparency plane. +// Conversely, 'luma' can be passed NULL if no preallocated planes are supplied. +// In this case, the output buffer will be automatically allocated (using +// MODE_YUVA) when decoding starts. All parameters are then ignored. +// Returns NULL if the allocation failed or if a parameter is invalid. +WEBP_EXTERN WebPIDecoder* WebPINewYUVA( + uint8_t* luma, size_t luma_size, int luma_stride, + uint8_t* u, size_t u_size, int u_stride, + uint8_t* v, size_t v_size, int v_stride, + uint8_t* a, size_t a_size, int a_stride); + +// Deprecated version of the above, without the alpha plane. +// Kept for backward compatibility. +WEBP_EXTERN WebPIDecoder* WebPINewYUV( + uint8_t* luma, size_t luma_size, int luma_stride, + uint8_t* u, size_t u_size, int u_stride, + uint8_t* v, size_t v_size, int v_stride); + +// Deletes the WebPIDecoder object and associated memory. Must always be called +// if WebPINewDecoder, WebPINewRGB or WebPINewYUV succeeded. +WEBP_EXTERN void WebPIDelete(WebPIDecoder* idec); + +// Copies and decodes the next available data. Returns VP8_STATUS_OK when +// the image is successfully decoded. Returns VP8_STATUS_SUSPENDED when more +// data is expected. Returns error in other cases. +WEBP_EXTERN VP8StatusCode WebPIAppend( + WebPIDecoder* idec, const uint8_t* data, size_t data_size); + +// A variant of the above function to be used when data buffer contains +// partial data from the beginning. In this case data buffer is not copied +// to the internal memory. +// Note that the value of the 'data' pointer can change between calls to +// WebPIUpdate, for instance when the data buffer is resized to fit larger data. +WEBP_EXTERN VP8StatusCode WebPIUpdate( + WebPIDecoder* idec, const uint8_t* data, size_t data_size); + +// Returns the RGB/A image decoded so far. Returns NULL if output params +// are not initialized yet. The RGB/A output type corresponds to the colorspace +// specified during call to WebPINewDecoder() or WebPINewRGB(). +// *last_y is the index of last decoded row in raster scan order. Some pointers +// (*last_y, *width etc.) can be NULL if corresponding information is not +// needed. The values in these pointers are only valid on successful (non-NULL) +// return. +WEBP_EXTERN uint8_t* WebPIDecGetRGB( + const WebPIDecoder* idec, int* last_y, + int* width, int* height, int* stride); + +// Same as above function to get a YUVA image. Returns pointer to the luma +// plane or NULL in case of error. If there is no alpha information +// the alpha pointer '*a' will be returned NULL. +WEBP_EXTERN uint8_t* WebPIDecGetYUVA( + const WebPIDecoder* idec, int* last_y, + uint8_t** u, uint8_t** v, uint8_t** a, + int* width, int* height, int* stride, int* uv_stride, int* a_stride); + +// Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the +// alpha information (if present). Kept for backward compatibility. +static WEBP_INLINE uint8_t* WebPIDecGetYUV( + const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v, + int* width, int* height, int* stride, int* uv_stride) { + return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height, + stride, uv_stride, NULL); +} + +// Generic call to retrieve information about the displayable area. +// If non NULL, the left/right/width/height pointers are filled with the visible +// rectangular area so far. +// Returns NULL in case the incremental decoder object is in an invalid state. +// Otherwise returns the pointer to the internal representation. This structure +// is read-only, tied to WebPIDecoder's lifespan and should not be modified. +WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea( + const WebPIDecoder* idec, int* left, int* top, int* width, int* height); + +//------------------------------------------------------------------------------ +// Advanced decoding parametrization +// +// Code sample for using the advanced decoding API +/* + // A) Init a configuration object + WebPDecoderConfig config; + CHECK(WebPInitDecoderConfig(&config)); + + // B) optional: retrieve the bitstream's features. + CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK); + + // C) Adjust 'config', if needed + config.options.no_fancy_upsampling = 1; + config.output.colorspace = MODE_BGRA; + // etc. + + // Note that you can also make config.output point to an externally + // supplied memory buffer, provided it's big enough to store the decoded + // picture. Otherwise, config.output will just be used to allocate memory + // and store the decoded picture. + + // D) Decode! + CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK); + + // E) Decoded image is now in config.output (and config.output.u.RGBA) + + // F) Reclaim memory allocated in config's object. It's safe to call + // this function even if the memory is external and wasn't allocated + // by WebPDecode(). + WebPFreeDecBuffer(&config.output); +*/ + +// Features gathered from the bitstream +struct WebPBitstreamFeatures { + int width; // Width in pixels, as read from the bitstream. + int height; // Height in pixels, as read from the bitstream. + int has_alpha; // True if the bitstream contains an alpha channel. + int has_animation; // True if the bitstream is an animation. + int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless + + uint32_t pad[5]; // padding for later use +}; + +// Internal, version-checked, entry point +WEBP_EXTERN VP8StatusCode WebPGetFeaturesInternal( + const uint8_t*, size_t, WebPBitstreamFeatures*, int); + +// Retrieve features from the bitstream. The *features structure is filled +// with information gathered from the bitstream. +// Returns VP8_STATUS_OK when the features are successfully retrieved. Returns +// VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the +// features from headers. Returns error in other cases. +// Note: The following chunk sequences (before the raw VP8/VP8L data) are +// considered valid by this function: +// RIFF + VP8(L) +// RIFF + VP8X + (optional chunks) + VP8(L) +// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. +// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. +static WEBP_INLINE VP8StatusCode WebPGetFeatures( + const uint8_t* data, size_t data_size, + WebPBitstreamFeatures* features) { + return WebPGetFeaturesInternal(data, data_size, features, + WEBP_DECODER_ABI_VERSION); +} + +// Decoding options +struct WebPDecoderOptions { + int bypass_filtering; // if true, skip the in-loop filtering + int no_fancy_upsampling; // if true, use faster pointwise upsampler + int use_cropping; // if true, cropping is applied _first_ + int crop_left, crop_top; // top-left position for cropping. + // Will be snapped to even values. + int crop_width, crop_height; // dimension of the cropping area + int use_scaling; // if true, scaling is applied _afterward_ + int scaled_width, scaled_height; // final resolution + int use_threads; // if true, use multi-threaded decoding + int dithering_strength; // dithering strength (0=Off, 100=full) + int flip; // if true, flip output vertically + int alpha_dithering_strength; // alpha dithering strength in [0..100] + + uint32_t pad[5]; // padding for later use +}; + +// Main object storing the configuration for advanced decoding. +struct WebPDecoderConfig { + WebPBitstreamFeatures input; // Immutable bitstream features (optional) + WebPDecBuffer output; // Output buffer (can point to external mem) + WebPDecoderOptions options; // Decoding options +}; + +// Internal, version-checked, entry point +WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int); + +// Initialize the configuration as empty. This function must always be +// called first, unless WebPGetFeatures() is to be called. +// Returns false in case of mismatched version. +static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) { + return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION); +} + +// Instantiate a new incremental decoder object with the requested +// configuration. The bitstream can be passed using 'data' and 'data_size' +// parameter, in which case the features will be parsed and stored into +// config->input. Otherwise, 'data' can be NULL and no parsing will occur. +// Note that 'config' can be NULL too, in which case a default configuration +// is used. If 'config' is not NULL, it must outlive the WebPIDecoder object +// as some references to its fields will be used. No internal copy of 'config' +// is made. +// The return WebPIDecoder object must always be deleted calling WebPIDelete(). +// Returns NULL in case of error (and config->status will then reflect +// the error condition, if available). +WEBP_EXTERN WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size, + WebPDecoderConfig* config); + +// Non-incremental version. This version decodes the full data at once, taking +// 'config' into account. Returns decoding status (which should be VP8_STATUS_OK +// if the decoding was successful). Note that 'config' cannot be NULL. +WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size, + WebPDecoderConfig* config); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // WEBP_WEBP_DECODE_H_ diff --git a/xLights/webp/demux.h b/xLights/webp/demux.h new file mode 100644 index 0000000000..846eeb15a9 --- /dev/null +++ b/xLights/webp/demux.h @@ -0,0 +1,363 @@ +// Copyright 2012 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +// Demux API. +// Enables extraction of image and extended format data from WebP files. + +// Code Example: Demuxing WebP data to extract all the frames, ICC profile +// and EXIF/XMP metadata. +/* + WebPDemuxer* demux = WebPDemux(&webp_data); + + uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); + uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); + // ... (Get information about the features present in the WebP file). + uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS); + + // ... (Iterate over all frames). + WebPIterator iter; + if (WebPDemuxGetFrame(demux, 1, &iter)) { + do { + // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(), + // ... and get other frame properties like width, height, offsets etc. + // ... see 'struct WebPIterator' below for more info). + } while (WebPDemuxNextFrame(&iter)); + WebPDemuxReleaseIterator(&iter); + } + + // ... (Extract metadata). + WebPChunkIterator chunk_iter; + if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter); + // ... (Consume the ICC profile in 'chunk_iter.chunk'). + WebPDemuxReleaseChunkIterator(&chunk_iter); + if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter); + // ... (Consume the EXIF metadata in 'chunk_iter.chunk'). + WebPDemuxReleaseChunkIterator(&chunk_iter); + if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter); + // ... (Consume the XMP metadata in 'chunk_iter.chunk'). + WebPDemuxReleaseChunkIterator(&chunk_iter); + WebPDemuxDelete(demux); +*/ + +#ifndef WEBP_WEBP_DEMUX_H_ +#define WEBP_WEBP_DEMUX_H_ + +#include "./decode.h" // for WEBP_CSP_MODE +#include "./mux_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define WEBP_DEMUX_ABI_VERSION 0x0107 // MAJOR(8b) + MINOR(8b) + +// Note: forward declaring enumerations is not allowed in (strict) C and C++, +// the types are left here for reference. +// typedef enum WebPDemuxState WebPDemuxState; +// typedef enum WebPFormatFeature WebPFormatFeature; +typedef struct WebPDemuxer WebPDemuxer; +typedef struct WebPIterator WebPIterator; +typedef struct WebPChunkIterator WebPChunkIterator; +typedef struct WebPAnimInfo WebPAnimInfo; +typedef struct WebPAnimDecoderOptions WebPAnimDecoderOptions; + +//------------------------------------------------------------------------------ + +// Returns the version number of the demux library, packed in hexadecimal using +// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507. +WEBP_EXTERN int WebPGetDemuxVersion(void); + +//------------------------------------------------------------------------------ +// Life of a Demux object + +typedef enum WebPDemuxState { + WEBP_DEMUX_PARSE_ERROR = -1, // An error occurred while parsing. + WEBP_DEMUX_PARSING_HEADER = 0, // Not enough data to parse full header. + WEBP_DEMUX_PARSED_HEADER = 1, // Header parsing complete, + // data may be available. + WEBP_DEMUX_DONE = 2 // Entire file has been parsed. +} WebPDemuxState; + +// Internal, version-checked, entry point +WEBP_EXTERN WebPDemuxer* WebPDemuxInternal( + const WebPData*, int, WebPDemuxState*, int); + +// Parses the full WebP file given by 'data'. For single images the WebP file +// header alone or the file header and the chunk header may be absent. +// Returns a WebPDemuxer object on successful parse, NULL otherwise. +static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) { + return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION); +} + +// Parses the possibly incomplete WebP file given by 'data'. +// If 'state' is non-NULL it will be set to indicate the status of the demuxer. +// Returns NULL in case of error or if there isn't enough data to start parsing; +// and a WebPDemuxer object on successful parse. +// Note that WebPDemuxer keeps internal pointers to 'data' memory segment. +// If this data is volatile, the demuxer object should be deleted (by calling +// WebPDemuxDelete()) and WebPDemuxPartial() called again on the new data. +// This is usually an inexpensive operation. +static WEBP_INLINE WebPDemuxer* WebPDemuxPartial( + const WebPData* data, WebPDemuxState* state) { + return WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION); +} + +// Frees memory associated with 'dmux'. +WEBP_EXTERN void WebPDemuxDelete(WebPDemuxer* dmux); + +//------------------------------------------------------------------------------ +// Data/information extraction. + +typedef enum WebPFormatFeature { + WEBP_FF_FORMAT_FLAGS, // bit-wise combination of WebPFeatureFlags + // corresponding to the 'VP8X' chunk (if present). + WEBP_FF_CANVAS_WIDTH, + WEBP_FF_CANVAS_HEIGHT, + WEBP_FF_LOOP_COUNT, // only relevant for animated file + WEBP_FF_BACKGROUND_COLOR, // idem. + WEBP_FF_FRAME_COUNT // Number of frames present in the demux object. + // In case of a partial demux, this is the number + // of frames seen so far, with the last frame + // possibly being partial. +} WebPFormatFeature; + +// Get the 'feature' value from the 'dmux'. +// NOTE: values are only valid if WebPDemux() was used or WebPDemuxPartial() +// returned a state > WEBP_DEMUX_PARSING_HEADER. +// If 'feature' is WEBP_FF_FORMAT_FLAGS, the returned value is a bit-wise +// combination of WebPFeatureFlags values. +// If 'feature' is WEBP_FF_LOOP_COUNT, WEBP_FF_BACKGROUND_COLOR, the returned +// value is only meaningful if the bitstream is animated. +WEBP_EXTERN uint32_t WebPDemuxGetI( + const WebPDemuxer* dmux, WebPFormatFeature feature); + +//------------------------------------------------------------------------------ +// Frame iteration. + +struct WebPIterator { + int frame_num; + int num_frames; // equivalent to WEBP_FF_FRAME_COUNT. + int x_offset, y_offset; // offset relative to the canvas. + int width, height; // dimensions of this frame. + int duration; // display duration in milliseconds. + WebPMuxAnimDispose dispose_method; // dispose method for the frame. + int complete; // true if 'fragment' contains a full frame. partial images + // may still be decoded with the WebP incremental decoder. + WebPData fragment; // The frame given by 'frame_num'. Note for historical + // reasons this is called a fragment. + int has_alpha; // True if the frame contains transparency. + WebPMuxAnimBlend blend_method; // Blend operation for the frame. + + uint32_t pad[2]; // padding for later use. + void* private_; // for internal use only. +}; + +// Retrieves frame 'frame_number' from 'dmux'. +// 'iter->fragment' points to the frame on return from this function. +// Setting 'frame_number' equal to 0 will return the last frame of the image. +// Returns false if 'dmux' is NULL or frame 'frame_number' is not present. +// Call WebPDemuxReleaseIterator() when use of the iterator is complete. +// NOTE: 'dmux' must persist for the lifetime of 'iter'. +WEBP_EXTERN int WebPDemuxGetFrame( + const WebPDemuxer* dmux, int frame_number, WebPIterator* iter); + +// Sets 'iter->fragment' to point to the next ('iter->frame_num' + 1) or +// previous ('iter->frame_num' - 1) frame. These functions do not loop. +// Returns true on success, false otherwise. +WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter); +WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter); + +// Releases any memory associated with 'iter'. +// Must be called before any subsequent calls to WebPDemuxGetChunk() on the same +// iter. Also, must be called before destroying the associated WebPDemuxer with +// WebPDemuxDelete(). +WEBP_EXTERN void WebPDemuxReleaseIterator(WebPIterator* iter); + +//------------------------------------------------------------------------------ +// Chunk iteration. + +struct WebPChunkIterator { + // The current and total number of chunks with the fourcc given to + // WebPDemuxGetChunk(). + int chunk_num; + int num_chunks; + WebPData chunk; // The payload of the chunk. + + uint32_t pad[6]; // padding for later use + void* private_; +}; + +// Retrieves the 'chunk_number' instance of the chunk with id 'fourcc' from +// 'dmux'. +// 'fourcc' is a character array containing the fourcc of the chunk to return, +// e.g., "ICCP", "XMP ", "EXIF", etc. +// Setting 'chunk_number' equal to 0 will return the last chunk in a set. +// Returns true if the chunk is found, false otherwise. Image related chunk +// payloads are accessed through WebPDemuxGetFrame() and related functions. +// Call WebPDemuxReleaseChunkIterator() when use of the iterator is complete. +// NOTE: 'dmux' must persist for the lifetime of the iterator. +WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux, + const char fourcc[4], int chunk_number, + WebPChunkIterator* iter); + +// Sets 'iter->chunk' to point to the next ('iter->chunk_num' + 1) or previous +// ('iter->chunk_num' - 1) chunk. These functions do not loop. +// Returns true on success, false otherwise. +WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter); +WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter); + +// Releases any memory associated with 'iter'. +// Must be called before destroying the associated WebPDemuxer with +// WebPDemuxDelete(). +WEBP_EXTERN void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter); + +//------------------------------------------------------------------------------ +// WebPAnimDecoder API +// +// This API allows decoding (possibly) animated WebP images. +// +// Code Example: +/* + WebPAnimDecoderOptions dec_options; + WebPAnimDecoderOptionsInit(&dec_options); + // Tune 'dec_options' as needed. + WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options); + WebPAnimInfo anim_info; + WebPAnimDecoderGetInfo(dec, &anim_info); + for (uint32_t i = 0; i < anim_info.loop_count; ++i) { + while (WebPAnimDecoderHasMoreFrames(dec)) { + uint8_t* buf; + int timestamp; + WebPAnimDecoderGetNext(dec, &buf, ×tamp); + // ... (Render 'buf' based on 'timestamp'). + // ... (Do NOT free 'buf', as it is owned by 'dec'). + } + WebPAnimDecoderReset(dec); + } + const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec); + // ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data). + WebPAnimDecoderDelete(dec); +*/ + +typedef struct WebPAnimDecoder WebPAnimDecoder; // Main opaque object. + +// Global options. +struct WebPAnimDecoderOptions { + // Output colorspace. Only the following modes are supported: + // MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA. + WEBP_CSP_MODE color_mode; + int use_threads; // If true, use multi-threaded decoding. + uint32_t padding[7]; // Padding for later use. +}; + +// Internal, version-checked, entry point. +WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal( + WebPAnimDecoderOptions*, int); + +// Should always be called, to initialize a fresh WebPAnimDecoderOptions +// structure before modification. Returns false in case of version mismatch. +// WebPAnimDecoderOptionsInit() must have succeeded before using the +// 'dec_options' object. +static WEBP_INLINE int WebPAnimDecoderOptionsInit( + WebPAnimDecoderOptions* dec_options) { + return WebPAnimDecoderOptionsInitInternal(dec_options, + WEBP_DEMUX_ABI_VERSION); +} + +// Internal, version-checked, entry point. +WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal( + const WebPData*, const WebPAnimDecoderOptions*, int); + +// Creates and initializes a WebPAnimDecoder object. +// Parameters: +// webp_data - (in) WebP bitstream. This should remain unchanged during the +// lifetime of the output WebPAnimDecoder object. +// dec_options - (in) decoding options. Can be passed NULL to choose +// reasonable defaults (in particular, color mode MODE_RGBA +// will be picked). +// Returns: +// A pointer to the newly created WebPAnimDecoder object, or NULL in case of +// parsing error, invalid option or memory error. +static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew( + const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) { + return WebPAnimDecoderNewInternal(webp_data, dec_options, + WEBP_DEMUX_ABI_VERSION); +} + +// Global information about the animation.. +struct WebPAnimInfo { + uint32_t canvas_width; + uint32_t canvas_height; + uint32_t loop_count; + uint32_t bgcolor; + uint32_t frame_count; + uint32_t pad[4]; // padding for later use +}; + +// Get global information about the animation. +// Parameters: +// dec - (in) decoder instance to get information from. +// info - (out) global information fetched from the animation. +// Returns: +// True on success. +WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec, + WebPAnimInfo* info); + +// Fetch the next frame from 'dec' based on options supplied to +// WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size +// 'canvas_width * 4 * canvas_height', and not just the frame sub-rectangle. The +// returned buffer 'buf' is valid only until the next call to +// WebPAnimDecoderGetNext(), WebPAnimDecoderReset() or WebPAnimDecoderDelete(). +// Parameters: +// dec - (in/out) decoder instance from which the next frame is to be fetched. +// buf - (out) decoded frame. +// timestamp - (out) timestamp of the frame in milliseconds. +// Returns: +// False if any of the arguments are NULL, or if there is a parsing or +// decoding error, or if there are no more frames. Otherwise, returns true. +WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec, + uint8_t** buf, int* timestamp); + +// Check if there are more frames left to decode. +// Parameters: +// dec - (in) decoder instance to be checked. +// Returns: +// True if 'dec' is not NULL and some frames are yet to be decoded. +// Otherwise, returns false. +WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec); + +// Resets the WebPAnimDecoder object, so that next call to +// WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be +// helpful when all frames need to be decoded multiple times (e.g. +// info.loop_count times) without destroying and recreating the 'dec' object. +// Parameters: +// dec - (in/out) decoder instance to be reset +WEBP_EXTERN void WebPAnimDecoderReset(WebPAnimDecoder* dec); + +// Grab the internal demuxer object. +// Getting the demuxer object can be useful if one wants to use operations only +// available through demuxer; e.g. to get XMP/EXIF/ICC metadata. The returned +// demuxer object is owned by 'dec' and is valid only until the next call to +// WebPAnimDecoderDelete(). +// +// Parameters: +// dec - (in) decoder instance from which the demuxer object is to be fetched. +WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer( + const WebPAnimDecoder* dec); + +// Deletes the WebPAnimDecoder object. +// Parameters: +// dec - (in/out) decoder instance to be deleted +WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // WEBP_WEBP_DEMUX_H_ diff --git a/xLights/webp/encode.h b/xLights/webp/encode.h new file mode 100644 index 0000000000..56b68e2f10 --- /dev/null +++ b/xLights/webp/encode.h @@ -0,0 +1,552 @@ +// Copyright 2011 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +// WebP encoder: main interface +// +// Author: Skal (pascal.massimino@gmail.com) + +#ifndef WEBP_WEBP_ENCODE_H_ +#define WEBP_WEBP_ENCODE_H_ + +#include "./types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define WEBP_ENCODER_ABI_VERSION 0x020f // MAJOR(8b) + MINOR(8b) + +// Note: forward declaring enumerations is not allowed in (strict) C and C++, +// the types are left here for reference. +// typedef enum WebPImageHint WebPImageHint; +// typedef enum WebPEncCSP WebPEncCSP; +// typedef enum WebPPreset WebPPreset; +// typedef enum WebPEncodingError WebPEncodingError; +typedef struct WebPConfig WebPConfig; +typedef struct WebPPicture WebPPicture; // main structure for I/O +typedef struct WebPAuxStats WebPAuxStats; +typedef struct WebPMemoryWriter WebPMemoryWriter; + +// Return the encoder's version number, packed in hexadecimal using 8bits for +// each of major/minor/revision. E.g: v2.5.7 is 0x020507. +WEBP_EXTERN int WebPGetEncoderVersion(void); + +//------------------------------------------------------------------------------ +// One-stop-shop call! No questions asked: + +// Returns the size of the compressed data (pointed to by *output), or 0 if +// an error occurred. The compressed data must be released by the caller +// using the call 'WebPFree(*output)'. +// These functions compress using the lossy format, and the quality_factor +// can go from 0 (smaller output, lower quality) to 100 (best quality, +// larger output). +WEBP_EXTERN size_t WebPEncodeRGB(const uint8_t* rgb, + int width, int height, int stride, + float quality_factor, uint8_t** output); +WEBP_EXTERN size_t WebPEncodeBGR(const uint8_t* bgr, + int width, int height, int stride, + float quality_factor, uint8_t** output); +WEBP_EXTERN size_t WebPEncodeRGBA(const uint8_t* rgba, + int width, int height, int stride, + float quality_factor, uint8_t** output); +WEBP_EXTERN size_t WebPEncodeBGRA(const uint8_t* bgra, + int width, int height, int stride, + float quality_factor, uint8_t** output); + +// These functions are the equivalent of the above, but compressing in a +// lossless manner. Files are usually larger than lossy format, but will +// not suffer any compression loss. +// Note these functions, like the lossy versions, use the library's default +// settings. For lossless this means 'exact' is disabled. RGB values in +// transparent areas will be modified to improve compression. To avoid this, +// use WebPEncode() and set WebPConfig::exact to 1. +WEBP_EXTERN size_t WebPEncodeLosslessRGB(const uint8_t* rgb, + int width, int height, int stride, + uint8_t** output); +WEBP_EXTERN size_t WebPEncodeLosslessBGR(const uint8_t* bgr, + int width, int height, int stride, + uint8_t** output); +WEBP_EXTERN size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, + int width, int height, int stride, + uint8_t** output); +WEBP_EXTERN size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, + int width, int height, int stride, + uint8_t** output); + +//------------------------------------------------------------------------------ +// Coding parameters + +// Image characteristics hint for the underlying encoder. +typedef enum WebPImageHint { + WEBP_HINT_DEFAULT = 0, // default preset. + WEBP_HINT_PICTURE, // digital picture, like portrait, inner shot + WEBP_HINT_PHOTO, // outdoor photograph, with natural lighting + WEBP_HINT_GRAPH, // Discrete tone image (graph, map-tile etc). + WEBP_HINT_LAST +} WebPImageHint; + +// Compression parameters. +struct WebPConfig { + int lossless; // Lossless encoding (0=lossy(default), 1=lossless). + float quality; // between 0 and 100. For lossy, 0 gives the smallest + // size and 100 the largest. For lossless, this + // parameter is the amount of effort put into the + // compression: 0 is the fastest but gives larger + // files compared to the slowest, but best, 100. + int method; // quality/speed trade-off (0=fast, 6=slower-better) + + WebPImageHint image_hint; // Hint for image type (lossless only for now). + + int target_size; // if non-zero, set the desired target size in bytes. + // Takes precedence over the 'compression' parameter. + float target_PSNR; // if non-zero, specifies the minimal distortion to + // try to achieve. Takes precedence over target_size. + int segments; // maximum number of segments to use, in [1..4] + int sns_strength; // Spatial Noise Shaping. 0=off, 100=maximum. + int filter_strength; // range: [0 = off .. 100 = strongest] + int filter_sharpness; // range: [0 = off .. 7 = least sharp] + int filter_type; // filtering type: 0 = simple, 1 = strong (only used + // if filter_strength > 0 or autofilter > 0) + int autofilter; // Auto adjust filter's strength [0 = off, 1 = on] + int alpha_compression; // Algorithm for encoding the alpha plane (0 = none, + // 1 = compressed with WebP lossless). Default is 1. + int alpha_filtering; // Predictive filtering method for alpha plane. + // 0: none, 1: fast, 2: best. Default if 1. + int alpha_quality; // Between 0 (smallest size) and 100 (lossless). + // Default is 100. + int pass; // number of entropy-analysis passes (in [1..10]). + + int show_compressed; // if true, export the compressed picture back. + // In-loop filtering is not applied. + int preprocessing; // preprocessing filter: + // 0=none, 1=segment-smooth, 2=pseudo-random dithering + int partitions; // log2(number of token partitions) in [0..3]. Default + // is set to 0 for easier progressive decoding. + int partition_limit; // quality degradation allowed to fit the 512k limit + // on prediction modes coding (0: no degradation, + // 100: maximum possible degradation). + int emulate_jpeg_size; // If true, compression parameters will be remapped + // to better match the expected output size from + // JPEG compression. Generally, the output size will + // be similar but the degradation will be lower. + int thread_level; // If non-zero, try and use multi-threaded encoding. + int low_memory; // If set, reduce memory usage (but increase CPU use). + + int near_lossless; // Near lossless encoding [0 = max loss .. 100 = off + // (default)]. + int exact; // if non-zero, preserve the exact RGB values under + // transparent area. Otherwise, discard this invisible + // RGB information for better compression. The default + // value is 0. + + int use_delta_palette; // reserved for future lossless feature + int use_sharp_yuv; // if needed, use sharp (and slow) RGB->YUV conversion + + int qmin; // minimum permissible quality factor + int qmax; // maximum permissible quality factor +}; + +// Enumerate some predefined settings for WebPConfig, depending on the type +// of source picture. These presets are used when calling WebPConfigPreset(). +typedef enum WebPPreset { + WEBP_PRESET_DEFAULT = 0, // default preset. + WEBP_PRESET_PICTURE, // digital picture, like portrait, inner shot + WEBP_PRESET_PHOTO, // outdoor photograph, with natural lighting + WEBP_PRESET_DRAWING, // hand or line drawing, with high-contrast details + WEBP_PRESET_ICON, // small-sized colorful images + WEBP_PRESET_TEXT // text-like +} WebPPreset; + +// Internal, version-checked, entry point +WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int); + +// Should always be called, to initialize a fresh WebPConfig structure before +// modification. Returns false in case of version mismatch. WebPConfigInit() +// must have succeeded before using the 'config' object. +// Note that the default values are lossless=0 and quality=75. +static WEBP_INLINE int WebPConfigInit(WebPConfig* config) { + return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f, + WEBP_ENCODER_ABI_VERSION); +} + +// This function will initialize the configuration according to a predefined +// set of parameters (referred to by 'preset') and a given quality factor. +// This function can be called as a replacement to WebPConfigInit(). Will +// return false in case of error. +static WEBP_INLINE int WebPConfigPreset(WebPConfig* config, + WebPPreset preset, float quality) { + return WebPConfigInitInternal(config, preset, quality, + WEBP_ENCODER_ABI_VERSION); +} + +// Activate the lossless compression mode with the desired efficiency level +// between 0 (fastest, lowest compression) and 9 (slower, best compression). +// A good default level is '6', providing a fair tradeoff between compression +// speed and final compressed size. +// This function will overwrite several fields from config: 'method', 'quality' +// and 'lossless'. Returns false in case of parameter error. +WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config, int level); + +// Returns true if 'config' is non-NULL and all configuration parameters are +// within their valid ranges. +WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config); + +//------------------------------------------------------------------------------ +// Input / Output +// Structure for storing auxiliary statistics. + +struct WebPAuxStats { + int coded_size; // final size + + float PSNR[5]; // peak-signal-to-noise ratio for Y/U/V/All/Alpha + int block_count[3]; // number of intra4/intra16/skipped macroblocks + int header_bytes[2]; // approximate number of bytes spent for header + // and mode-partition #0 + int residual_bytes[3][4]; // approximate number of bytes spent for + // DC/AC/uv coefficients for each (0..3) segments. + int segment_size[4]; // number of macroblocks in each segments + int segment_quant[4]; // quantizer values for each segments + int segment_level[4]; // filtering strength for each segments [0..63] + + int alpha_data_size; // size of the transparency data + int layer_data_size; // size of the enhancement layer data + + // lossless encoder statistics + uint32_t lossless_features; // bit0:predictor bit1:cross-color transform + // bit2:subtract-green bit3:color indexing + int histogram_bits; // number of precision bits of histogram + int transform_bits; // precision bits for transform + int cache_bits; // number of bits for color cache lookup + int palette_size; // number of color in palette, if used + int lossless_size; // final lossless size + int lossless_hdr_size; // lossless header (transform, huffman etc) size + int lossless_data_size; // lossless image data size + + uint32_t pad[2]; // padding for later use +}; + +// Signature for output function. Should return true if writing was successful. +// data/data_size is the segment of data to write, and 'picture' is for +// reference (and so one can make use of picture->custom_ptr). +typedef int (*WebPWriterFunction)(const uint8_t* data, size_t data_size, + const WebPPicture* picture); + +// WebPMemoryWrite: a special WebPWriterFunction that writes to memory using +// the following WebPMemoryWriter object (to be set as a custom_ptr). +struct WebPMemoryWriter { + uint8_t* mem; // final buffer (of size 'max_size', larger than 'size'). + size_t size; // final size + size_t max_size; // total capacity + uint32_t pad[1]; // padding for later use +}; + +// The following must be called first before any use. +WEBP_EXTERN void WebPMemoryWriterInit(WebPMemoryWriter* writer); + +// The following must be called to deallocate writer->mem memory. The 'writer' +// object itself is not deallocated. +WEBP_EXTERN void WebPMemoryWriterClear(WebPMemoryWriter* writer); +// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon +// completion, writer.mem and writer.size will hold the coded data. +// writer.mem must be freed by calling WebPMemoryWriterClear. +WEBP_EXTERN int WebPMemoryWrite(const uint8_t* data, size_t data_size, + const WebPPicture* picture); + +// Progress hook, called from time to time to report progress. It can return +// false to request an abort of the encoding process, or true otherwise if +// everything is OK. +typedef int (*WebPProgressHook)(int percent, const WebPPicture* picture); + +// Color spaces. +typedef enum WebPEncCSP { + // chroma sampling + WEBP_YUV420 = 0, // 4:2:0 + WEBP_YUV420A = 4, // alpha channel variant + WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors + WEBP_CSP_ALPHA_BIT = 4 // bit that is set if alpha is present +} WebPEncCSP; + +// Encoding error conditions. +typedef enum WebPEncodingError { + VP8_ENC_OK = 0, + VP8_ENC_ERROR_OUT_OF_MEMORY, // memory error allocating objects + VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY, // memory error while flushing bits + VP8_ENC_ERROR_NULL_PARAMETER, // a pointer parameter is NULL + VP8_ENC_ERROR_INVALID_CONFIGURATION, // configuration is invalid + VP8_ENC_ERROR_BAD_DIMENSION, // picture has invalid width/height + VP8_ENC_ERROR_PARTITION0_OVERFLOW, // partition is bigger than 512k + VP8_ENC_ERROR_PARTITION_OVERFLOW, // partition is bigger than 16M + VP8_ENC_ERROR_BAD_WRITE, // error while flushing bytes + VP8_ENC_ERROR_FILE_TOO_BIG, // file is bigger than 4G + VP8_ENC_ERROR_USER_ABORT, // abort request by user + VP8_ENC_ERROR_LAST // list terminator. always last. +} WebPEncodingError; + +// maximum width/height allowed (inclusive), in pixels +#define WEBP_MAX_DIMENSION 16383 + +// Main exchange structure (input samples, output bytes, statistics) +// +// Once WebPPictureInit() has been called, it's ok to make all the INPUT fields +// (use_argb, y/u/v, argb, ...) point to user-owned data, even if +// WebPPictureAlloc() has been called. Depending on the value use_argb, +// it's guaranteed that either *argb or *y/*u/*v content will be kept untouched. +struct WebPPicture { + // INPUT + ////////////// + // Main flag for encoder selecting between ARGB or YUV input. + // It is recommended to use ARGB input (*argb, argb_stride) for lossless + // compression, and YUV input (*y, *u, *v, etc.) for lossy compression + // since these are the respective native colorspace for these formats. + int use_argb; + + // YUV input (mostly used for input to lossy compression) + WebPEncCSP colorspace; // colorspace: should be YUV420 for now (=Y'CbCr). + int width, height; // dimensions (less or equal to WEBP_MAX_DIMENSION) + uint8_t* y, *u, *v; // pointers to luma/chroma planes. + int y_stride, uv_stride; // luma/chroma strides. + uint8_t* a; // pointer to the alpha plane + int a_stride; // stride of the alpha plane + uint32_t pad1[2]; // padding for later use + + // ARGB input (mostly used for input to lossless compression) + uint32_t* argb; // Pointer to argb (32 bit) plane. + int argb_stride; // This is stride in pixels units, not bytes. + uint32_t pad2[3]; // padding for later use + + // OUTPUT + /////////////// + // Byte-emission hook, to store compressed bytes as they are ready. + WebPWriterFunction writer; // can be NULL + void* custom_ptr; // can be used by the writer. + + // map for extra information (only for lossy compression mode) + int extra_info_type; // 1: intra type, 2: segment, 3: quant + // 4: intra-16 prediction mode, + // 5: chroma prediction mode, + // 6: bit cost, 7: distortion + uint8_t* extra_info; // if not NULL, points to an array of size + // ((width + 15) / 16) * ((height + 15) / 16) that + // will be filled with a macroblock map, depending + // on extra_info_type. + + // STATS AND REPORTS + /////////////////////////// + // Pointer to side statistics (updated only if not NULL) + WebPAuxStats* stats; + + // Error code for the latest error encountered during encoding + WebPEncodingError error_code; + + // If not NULL, report progress during encoding. + WebPProgressHook progress_hook; + + void* user_data; // this field is free to be set to any value and + // used during callbacks (like progress-report e.g.). + + uint32_t pad3[3]; // padding for later use + + // Unused for now + uint8_t* pad4, *pad5; + uint32_t pad6[8]; // padding for later use + + // PRIVATE FIELDS + //////////////////// + void* memory_; // row chunk of memory for yuva planes + void* memory_argb_; // and for argb too. + void* pad7[2]; // padding for later use +}; + +// Internal, version-checked, entry point +WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int); + +// Should always be called, to initialize the structure. Returns false in case +// of version mismatch. WebPPictureInit() must have succeeded before using the +// 'picture' object. +// Note that, by default, use_argb is false and colorspace is WEBP_YUV420. +static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) { + return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION); +} + +//------------------------------------------------------------------------------ +// WebPPicture utils + +// Convenience allocation / deallocation based on picture->width/height: +// Allocate y/u/v buffers as per colorspace/width/height specification. +// Note! This function will free the previous buffer if needed. +// Returns false in case of memory error. +WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture); + +// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*(). +// Note that this function does _not_ free the memory used by the 'picture' +// object itself. +// Besides memory (which is reclaimed) all other fields of 'picture' are +// preserved. +WEBP_EXTERN void WebPPictureFree(WebPPicture* picture); + +// Copy the pixels of *src into *dst, using WebPPictureAlloc. Upon return, *dst +// will fully own the copied pixels (this is not a view). The 'dst' picture need +// not be initialized as its content is overwritten. +// Returns false in case of memory allocation error. +WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst); + +// Compute the single distortion for packed planes of samples. +// 'src' will be compared to 'ref', and the raw distortion stored into +// '*distortion'. The refined metric (log(MSE), log(1 - ssim),...' will be +// stored in '*result'. +// 'x_step' is the horizontal stride (in bytes) between samples. +// 'src/ref_stride' is the byte distance between rows. +// Returns false in case of error (bad parameter, memory allocation error, ...). +WEBP_EXTERN int WebPPlaneDistortion(const uint8_t* src, size_t src_stride, + const uint8_t* ref, size_t ref_stride, + int width, int height, + size_t x_step, + int type, // 0 = PSNR, 1 = SSIM, 2 = LSIM + float* distortion, float* result); + +// Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results +// are in dB, stored in result[] in the B/G/R/A/All order. The distortion is +// always performed using ARGB samples. Hence if the input is YUV(A), the +// picture will be internally converted to ARGB (just for the measurement). +// Warning: this function is rather CPU-intensive. +WEBP_EXTERN int WebPPictureDistortion( + const WebPPicture* src, const WebPPicture* ref, + int metric_type, // 0 = PSNR, 1 = SSIM, 2 = LSIM + float result[5]); + +// self-crops a picture to the rectangle defined by top/left/width/height. +// Returns false in case of memory allocation error, or if the rectangle is +// outside of the source picture. +// The rectangle for the view is defined by the top-left corner pixel +// coordinates (left, top) as well as its width and height. This rectangle +// must be fully be comprised inside the 'src' source picture. If the source +// picture uses the YUV420 colorspace, the top and left coordinates will be +// snapped to even values. +WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture, + int left, int top, int width, int height); + +// Extracts a view from 'src' picture into 'dst'. The rectangle for the view +// is defined by the top-left corner pixel coordinates (left, top) as well +// as its width and height. This rectangle must be fully be comprised inside +// the 'src' source picture. If the source picture uses the YUV420 colorspace, +// the top and left coordinates will be snapped to even values. +// Picture 'src' must out-live 'dst' picture. Self-extraction of view is allowed +// ('src' equal to 'dst') as a mean of fast-cropping (but note that doing so, +// the original dimension will be lost). Picture 'dst' need not be initialized +// with WebPPictureInit() if it is different from 'src', since its content will +// be overwritten. +// Returns false in case of invalid parameters. +WEBP_EXTERN int WebPPictureView(const WebPPicture* src, + int left, int top, int width, int height, + WebPPicture* dst); + +// Returns true if the 'picture' is actually a view and therefore does +// not own the memory for pixels. +WEBP_EXTERN int WebPPictureIsView(const WebPPicture* picture); + +// Rescale a picture to new dimension width x height. +// If either 'width' or 'height' (but not both) is 0 the corresponding +// dimension will be calculated preserving the aspect ratio. +// No gamma correction is applied. +// Returns false in case of error (invalid parameter or insufficient memory). +WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture, int width, int height); + +// Colorspace conversion function to import RGB samples. +// Previous buffer will be free'd, if any. +// *rgb buffer should have a size of at least height * rgb_stride. +// Returns false in case of memory error. +WEBP_EXTERN int WebPPictureImportRGB( + WebPPicture* picture, const uint8_t* rgb, int rgb_stride); +// Same, but for RGBA buffer. +WEBP_EXTERN int WebPPictureImportRGBA( + WebPPicture* picture, const uint8_t* rgba, int rgba_stride); +// Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format +// input buffer ignoring the alpha channel. Avoids needing to copy the data +// to a temporary 24-bit RGB buffer to import the RGB only. +WEBP_EXTERN int WebPPictureImportRGBX( + WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride); + +// Variants of the above, but taking BGR(A|X) input. +WEBP_EXTERN int WebPPictureImportBGR( + WebPPicture* picture, const uint8_t* bgr, int bgr_stride); +WEBP_EXTERN int WebPPictureImportBGRA( + WebPPicture* picture, const uint8_t* bgra, int bgra_stride); +WEBP_EXTERN int WebPPictureImportBGRX( + WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride); + +// Converts picture->argb data to the YUV420A format. The 'colorspace' +// parameter is deprecated and should be equal to WEBP_YUV420. +// Upon return, picture->use_argb is set to false. The presence of real +// non-opaque transparent values is detected, and 'colorspace' will be +// adjusted accordingly. Note that this method is lossy. +// Returns false in case of error. +WEBP_EXTERN int WebPPictureARGBToYUVA(WebPPicture* picture, + WebPEncCSP /*colorspace = WEBP_YUV420*/); + +// Same as WebPPictureARGBToYUVA(), but the conversion is done using +// pseudo-random dithering with a strength 'dithering' between +// 0.0 (no dithering) and 1.0 (maximum dithering). This is useful +// for photographic picture. +WEBP_EXTERN int WebPPictureARGBToYUVADithered( + WebPPicture* picture, WebPEncCSP colorspace, float dithering); + +// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion. +// Downsampling is handled with extra care in case of color clipping. This +// method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better +// and sharper YUV representation. +// Returns false in case of error. +WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture); +// kept for backward compatibility: +WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture); + +// Converts picture->yuv to picture->argb and sets picture->use_argb to true. +// The input format must be YUV_420 or YUV_420A. The conversion from YUV420 to +// ARGB incurs a small loss too. +// Note that the use of this colorspace is discouraged if one has access to the +// raw ARGB samples, since using YUV420 is comparatively lossy. +// Returns false in case of error. +WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture); + +// Helper function: given a width x height plane of RGBA or YUV(A) samples +// clean-up or smoothen the YUV or RGB samples under fully transparent area, +// to help compressibility (no guarantee, though). +WEBP_EXTERN void WebPCleanupTransparentArea(WebPPicture* picture); + +// Scan the picture 'picture' for the presence of non fully opaque alpha values. +// Returns true in such case. Otherwise returns false (indicating that the +// alpha plane can be ignored altogether e.g.). +WEBP_EXTERN int WebPPictureHasTransparency(const WebPPicture* picture); + +// Remove the transparency information (if present) by blending the color with +// the background color 'background_rgb' (specified as 24bit RGB triplet). +// After this call, all alpha values are reset to 0xff. +WEBP_EXTERN void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb); + +//------------------------------------------------------------------------------ +// Main call + +// Main encoding call, after config and picture have been initialized. +// 'picture' must be less than 16384x16384 in dimension (cf WEBP_MAX_DIMENSION), +// and the 'config' object must be a valid one. +// Returns false in case of error, true otherwise. +// In case of error, picture->error_code is updated accordingly. +// 'picture' can hold the source samples in both YUV(A) or ARGB input, depending +// on the value of 'picture->use_argb'. It is highly recommended to use +// the former for lossy encoding, and the latter for lossless encoding +// (when config.lossless is true). Automatic conversion from one format to +// another is provided but they both incur some loss. +WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture); + +//------------------------------------------------------------------------------ + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // WEBP_WEBP_ENCODE_H_ diff --git a/xLights/webp/mux_types.h b/xLights/webp/mux_types.h new file mode 100644 index 0000000000..2fe8195839 --- /dev/null +++ b/xLights/webp/mux_types.h @@ -0,0 +1,98 @@ +// Copyright 2012 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +// Data-types common to the mux and demux libraries. +// +// Author: Urvang (urvang@google.com) + +#ifndef WEBP_WEBP_MUX_TYPES_H_ +#define WEBP_WEBP_MUX_TYPES_H_ + +#include // memset() +#include "./types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Note: forward declaring enumerations is not allowed in (strict) C and C++, +// the types are left here for reference. +// typedef enum WebPFeatureFlags WebPFeatureFlags; +// typedef enum WebPMuxAnimDispose WebPMuxAnimDispose; +// typedef enum WebPMuxAnimBlend WebPMuxAnimBlend; +typedef struct WebPData WebPData; + +// VP8X Feature Flags. +typedef enum WebPFeatureFlags { + ANIMATION_FLAG = 0x00000002, + XMP_FLAG = 0x00000004, + EXIF_FLAG = 0x00000008, + ALPHA_FLAG = 0x00000010, + ICCP_FLAG = 0x00000020, + + ALL_VALID_FLAGS = 0x0000003e +} WebPFeatureFlags; + +// Dispose method (animation only). Indicates how the area used by the current +// frame is to be treated before rendering the next frame on the canvas. +typedef enum WebPMuxAnimDispose { + WEBP_MUX_DISPOSE_NONE, // Do not dispose. + WEBP_MUX_DISPOSE_BACKGROUND // Dispose to background color. +} WebPMuxAnimDispose; + +// Blend operation (animation only). Indicates how transparent pixels of the +// current frame are blended with those of the previous canvas. +typedef enum WebPMuxAnimBlend { + WEBP_MUX_BLEND, // Blend. + WEBP_MUX_NO_BLEND // Do not blend. +} WebPMuxAnimBlend; + +// Data type used to describe 'raw' data, e.g., chunk data +// (ICC profile, metadata) and WebP compressed image data. +// 'bytes' memory must be allocated using WebPMalloc() and such. +struct WebPData { + const uint8_t* bytes; + size_t size; +}; + +// Initializes the contents of the 'webp_data' object with default values. +static WEBP_INLINE void WebPDataInit(WebPData* webp_data) { + if (webp_data != NULL) { + memset(webp_data, 0, sizeof(*webp_data)); + } +} + +// Clears the contents of the 'webp_data' object by calling WebPFree(). +// Does not deallocate the object itself. +static WEBP_INLINE void WebPDataClear(WebPData* webp_data) { + if (webp_data != NULL) { + WebPFree((void*)webp_data->bytes); + WebPDataInit(webp_data); + } +} + +// Allocates necessary storage for 'dst' and copies the contents of 'src'. +// Returns true on success. +static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) { + if (src == NULL || dst == NULL) return 0; + WebPDataInit(dst); + if (src->bytes != NULL && src->size != 0) { + dst->bytes = (uint8_t*)WebPMalloc(src->size); + if (dst->bytes == NULL) return 0; + memcpy((void*)dst->bytes, src->bytes, src->size); + dst->size = src->size; + } + return 1; +} + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // WEBP_WEBP_MUX_TYPES_H_ diff --git a/xLights/webp/types.h b/xLights/webp/types.h new file mode 100644 index 0000000000..f255432e41 --- /dev/null +++ b/xLights/webp/types.h @@ -0,0 +1,72 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +// Common types + memory wrappers +// +// Author: Skal (pascal.massimino@gmail.com) + +#ifndef WEBP_WEBP_TYPES_H_ +#define WEBP_WEBP_TYPES_H_ + +#include // for size_t + +#ifndef _MSC_VER +#include +#if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \ + (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) +#define WEBP_INLINE inline +#else +#define WEBP_INLINE +#endif +#else +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef unsigned long long int uint64_t; +typedef long long int int64_t; +#define WEBP_INLINE __forceinline +#endif /* _MSC_VER */ + +#ifndef WEBP_EXTERN +// This explicitly marks library functions and allows for changing the +// signature for e.g., Windows DLL builds. +# if defined(__GNUC__) && __GNUC__ >= 4 +# define WEBP_EXTERN extern __attribute__ ((visibility ("default"))) +# else +# if defined(_MSC_VER) && defined(WEBP_DLL) +# define WEBP_EXTERN __declspec(dllexport) +# else +# define WEBP_EXTERN extern +# endif +# endif /* __GNUC__ >= 4 */ +#endif /* WEBP_EXTERN */ + +// Macro to check ABI compatibility (same major revision number) +#define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8)) + +#ifdef __cplusplus +extern "C" { +#endif + +// Allocates 'size' bytes of memory. Returns NULL upon error. Memory +// must be deallocated by calling WebPFree(). This function is made available +// by the core 'libwebp' library. +WEBP_EXTERN void* WebPMalloc(size_t size); + +// Releases memory returned by the WebPDecode*() functions (from decode.h). +WEBP_EXTERN void WebPFree(void* ptr); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // WEBP_WEBP_TYPES_H_ diff --git a/xLights/wxWEBPHandler/imagwebp.cpp b/xLights/wxWEBPHandler/imagwebp.cpp new file mode 100644 index 0000000000..0fe86cbfb7 --- /dev/null +++ b/xLights/wxWEBPHandler/imagwebp.cpp @@ -0,0 +1,176 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagwebp.cpp +// Purpose: wxImage WebP handler +// Author: Hermann Höhne +// Copyright: (c) Hermann Höhne +// Licence: wxWidgets licence +///////////////////////////////////////////////////////////////////////////// + +// based on code by Sylvain Bougnoux and Khral Steelforge (https://forums.wxwidgets.org/viewtopic.php?t=39212) + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_IMAGE + +#include "wx/imagwebp.h" +#include "webp/demux.h" +#include "webp/decode.h" +#include "webp/encode.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif + +//----------------------------------------------------------------------------- +// wxWEBPHandler +//----------------------------------------------------------------------------- + +wxIMPLEMENT_DYNAMIC_CLASS(wxWEBPHandler, wxImageHandler); + +#if wxUSE_STREAMS + +#include + +bool DecodeWebPDataIntoImage(wxImage *image, WebPData *webp_data, bool verbose) { + WebPBitstreamFeatures features; + VP8StatusCode status = WebPGetFeatures(webp_data->bytes, webp_data->size, &features); + if (status != VP8_STATUS_OK) + { + if (verbose) + { + wxLogError("WebP: GetFeatures not OK."); + } + return false; + } + image->Create(features.width, features.height, false); // this allocates memory + if (features.has_alpha) + { + // image has alpha channel. needs to be decoded, then re-ordered. + uint8_t * rgba = WebPDecodeRGBA(webp_data->bytes, webp_data->size, &features.width, &features.height); + if (rgba == NULL) + { + if (verbose) + { + wxLogError("WebP: WebPDecodeRGBA failed."); + } + return false; + } + image->InitAlpha(); + unsigned char * rgb = image->GetData(); + unsigned char * alpha = image->GetAlpha(); + for (unsigned int index_pixel = 0; index_pixel < image->GetWidth() * image->GetHeight(); index_pixel++) { + unsigned int index_rgba = index_pixel*4; + unsigned int index_rgb = index_pixel*3; + unsigned int index_alpha = index_pixel; + rgb[index_rgb++] = rgba[index_rgba++]; // R + rgb[index_rgb++] = rgba[index_rgba++]; // G + rgb[index_rgb++] = rgba[index_rgba++]; // B + alpha[index_alpha] = rgba[index_rgba]; // A + } + WebPFree(rgba); + } + else + { + // image has no alpha channel. decode into target buffer directly. + int buffer_size = image->GetWidth() * image->GetHeight() * 3; + int stride = image->GetWidth() * 3; + uint8_t * output_buffer = WebPDecodeRGBInto(webp_data->bytes, webp_data->size, image->GetData(), buffer_size, stride); + if (output_buffer == NULL) + { + if (verbose) + { + wxLogError("WebP: WebPDecodeRGBInto failed."); + } + return false; + } + } + image->SetMask(false); // all examples do this, so I do so as well + return true; +} + +bool DecodeWebPFrameIntoImage(wxImage *image, int index, WebPData *webp_data, bool verbose) +{ + WebPDemuxer* demux = WebPDemux(webp_data); + if (demux == NULL) + { + if (verbose) + { + wxLogError("WebP: WebPDemux failed."); + } + return false; + } + //uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); + //uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); + bool ok = false; + WebPIterator iter; + // wxImageHandler index starts from 0, WebPDemuxGetFrame seems to start from 1 + if (WebPDemuxGetFrame(demux, index+1, &iter)) + { + ok = DecodeWebPDataIntoImage(image, &iter.fragment, verbose); + WebPDemuxReleaseIterator(&iter); + } + WebPDemuxDelete(demux); + return ok; +} + +#include + +bool wxWEBPHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose, int index) +{ + image->Destroy(); // all examples do this, so I do so as well + wxMemoryOutputStream mos; + stream.Read(mos); // this reads the entire file into memory + wxStreamBuffer * mosb = mos.GetOutputStreamBuffer(); + WebPData webp_data; + webp_data.bytes = reinterpret_cast(mosb->GetBufferStart()); + webp_data.size = mosb->GetBufferSize(); + // apparently, index can be -1 for "don't care", but libwebp does care + if (index < 0) + { + index = 0; + } + return DecodeWebPFrameIntoImage(image, index, &webp_data, verbose); +} + +bool wxWEBPHandler::SaveFile(wxImage *image, wxOutputStream& stream, bool verbose) +{ + if (image->HasAlpha() && verbose) + { + wxLogWarning("WebP: Saving with alpha not implemented."); + } + //unsigned char * rgb = image->GetData(); + int stride = image->GetWidth(); + float quality_factor = 90; + if (image->HasOption(wxIMAGE_OPTION_QUALITY)) + { + quality_factor = image->GetOptionInt(wxIMAGE_OPTION_QUALITY) / 100.0f; + } + uint8_t * output = NULL; + size_t output_size = WebPEncodeRGB(image->GetData(), image->GetWidth(), image->GetHeight(), stride, quality_factor, &output); + stream.WriteAll(output, output_size); + return true; +} + +// TODO: implement int wxWEBPHandler::DoGetImageCount(wxInputStream & stream) + +bool wxWEBPHandler::DoCanRead(wxInputStream& stream) +{ + // check header according to https://developers.google.com/speed/webp/docs/riff_container + const std::string riff = "RIFF"; + const std::string webp = "WEBP"; + const int buffer_size = 12; + char buffer[buffer_size]; + // it's ok to modify the stream position here + stream.Read(buffer, buffer_size); + if (stream.LastRead() != buffer_size) + { + return false; + } + return std::string(buffer, 4) == riff && std::string(&buffer[8], 4) == webp; +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_IMAGE diff --git a/xLights/wxWEBPHandler/wx/imagwebp.h b/xLights/wxWEBPHandler/wx/imagwebp.h new file mode 100644 index 0000000000..50ed869896 --- /dev/null +++ b/xLights/wxWEBPHandler/wx/imagwebp.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagwebp.hpp +// Purpose: wxImage WebP handler +// Author: Hermann Höhne +// Copyright: (c) Hermann Höhne +// Licence: wxWidgets licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGWEBP_H_ +#define _WX_IMAGWEBP_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxWEBPHandler +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxWEBPHandler : public wxImageHandler +{ +public: + inline wxWEBPHandler() + { + m_name = wxT("WebP file"); + m_extension = wxT("webp"); + //m_type = wxBITMAP_TYPE_INVALID; // no idea what to choose here + m_mime = wxT("image/webp"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile(wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1) wxOVERRIDE; + virtual bool SaveFile(wxImage *image, wxOutputStream& stream, bool verbose=true) wxOVERRIDE; +protected: + virtual bool DoCanRead(wxInputStream& stream) wxOVERRIDE; +#endif // wxUSE_STREAMS + +private: + wxDECLARE_DYNAMIC_CLASS(wxWEBPHandler); +}; + +#endif // _WX_IMAGWEBP_H_ diff --git a/xLights/wxsmith/AdjustPanel.wxs b/xLights/wxsmith/AdjustPanel.wxs new file mode 100644 index 0000000000..236c4cd8fd --- /dev/null +++ b/xLights/wxsmith/AdjustPanel.wxs @@ -0,0 +1,114 @@ + + + + 0 + + 2 + 1 + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + 0 + -255 + 255 + + wxALL|wxEXPAND + 5 + + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + 0 + -255 + 255 + + wxALL|wxEXPAND + 5 + + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + 1 + 1 + 32 + + wxALL|wxEXPAND + 5 + + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + 1 + 1 + + wxALL|wxEXPAND + 5 + + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + 0 + 10000 + + wxALL|wxEXPAND + 5 + + + + + diff --git a/xLights/wxsmith/CheckSequenceSettingsPanel.wxs b/xLights/wxsmith/CheckSequenceSettingsPanel.wxs index 1d1bdd40cb..8e8347645d 100644 --- a/xLights/wxsmith/CheckSequenceSettingsPanel.wxs +++ b/xLights/wxsmith/CheckSequenceSettingsPanel.wxs @@ -86,6 +86,18 @@ 5 + + + + Sketch effect image files are not essential to rendering. + + + 0 + 7 + wxALL|wxEXPAND + 5 + + diff --git a/xLights/wxsmith/ColorPanel.wxs b/xLights/wxsmith/ColorPanel.wxs index 64cb3d56a8..8d5a922ee3 100644 --- a/xLights/wxsmith/ColorPanel.wxs +++ b/xLights/wxsmith/ColorPanel.wxs @@ -51,58 +51,96 @@ 3 1 - - - 24,24 - - + + wxVERTICAL + + + + 26,16 + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 2 + + + + + + 26,16 + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 2 + + + + + + 26,16 + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 2 + + - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxALIGN_TOP|wxALIGN_CENTER_HORIZONTAL 5 - - $(THIS) = new $(CLASS)($(PARENT),$(ID),$(POS),$(SIZE),$(STYLE),wxDefaultValidator,$(NAME)); - + + wxVERTICAL + + + $(THIS) = new $(CLASS)($(PARENT),$(ID),$(POS),$(SIZE),$(STYLE),wxDefaultValidator,$(NAME)); + + + wxALL|wxEXPAND + 2 + + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + - wxALL|wxEXPAND - 2 - - - - - - 24,24 - - - - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL - 5 - - - - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL - 5 - - - - - - - - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxALIGN_TOP|wxALIGN_CENTER_HORIZONTAL 5 - - - 24,24 - - + + wxVERTICAL + + + + 24,24 + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + 24,24 + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxALIGN_TOP|wxALIGN_CENTER_HORIZONTAL 5 diff --git a/xLights/wxsmith/EditAliasesDialog.wxs b/xLights/wxsmith/EditAliasesDialog.wxs new file mode 100644 index 0000000000..16a815f2ba --- /dev/null +++ b/xLights/wxsmith/EditAliasesDialog.wxs @@ -0,0 +1,76 @@ + + + + Model Aliases + 0 + + + 2 + 0 + 0 + + + -1 + + + + wxALL|wxEXPAND + 5 + + + + + 1 + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + 3 + + + + 1 + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + diff --git a/xLights/wxsmith/FPPConnectDialog.wxs b/xLights/wxsmith/FPPConnectDialog.wxs index a9688ae195..7ab41aaaca 100644 --- a/xLights/wxsmith/FPPConnectDialog.wxs +++ b/xLights/wxsmith/FPPConnectDialog.wxs @@ -12,12 +12,12 @@ 0 - 100 + 100,100 800,100d - 11 + 12 diff --git a/xLights/wxsmith/FacesPanel.wxs b/xLights/wxsmith/FacesPanel.wxs index e78313a9b7..4b84c8ca26 100644 --- a/xLights/wxsmith/FacesPanel.wxs +++ b/xLights/wxsmith/FacesPanel.wxs @@ -23,7 +23,7 @@ - + AI E @@ -105,13 +105,38 @@ (off) 2 + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + Slowest + Slow + Normal + Fast + Fastest + + 2 + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL 5 - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxALIGN_CENTER_VERTICAL 5 @@ -183,7 +208,7 @@ - + 0 1000 100,-1 @@ -193,7 +218,7 @@ - + diff --git a/xLights/wxsmith/HinksPixExportDialog.wxs b/xLights/wxsmith/HinksPixExportDialog.wxs index b1c5519fb4..d9e86a54a3 100644 --- a/xLights/wxsmith/HinksPixExportDialog.wxs +++ b/xLights/wxsmith/HinksPixExportDialog.wxs @@ -47,7 +47,6 @@ Only Current Directory 0 - wxALL|wxEXPAND 5 @@ -64,7 +63,6 @@ 0 - wxALL|wxEXPAND 5 @@ -135,18 +133,17 @@ 0 23 - 50,-1 - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxEXPAND 5 0 59 - 50,-1 + 66,37 - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxEXPAND 5 @@ -160,18 +157,16 @@ 23 23 - 50,-1 - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxEXPAND 5 59 59 - 50,-1 - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxEXPAND 5 diff --git a/xLights/wxsmith/ModelChainDialog.wxs b/xLights/wxsmith/ModelChainDialog.wxs index 8f2d86cd06..ed67189f63 100644 --- a/xLights/wxsmith/ModelChainDialog.wxs +++ b/xLights/wxsmith/ModelChainDialog.wxs @@ -3,12 +3,15 @@ 1 1 + 1 0 - 3 + 2 + 1 + 1 @@ -22,12 +25,12 @@ 0 100,-1d - wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + wxALL|wxEXPAND 5 - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxEXPAND 5 diff --git a/xLights/wxsmith/ModelGroupPanel.wxs b/xLights/wxsmith/ModelGroupPanel.wxs index 05c0ce3947..5ef2a50476 100644 --- a/xLights/wxsmith/ModelGroupPanel.wxs +++ b/xLights/wxsmith/ModelGroupPanel.wxs @@ -180,11 +180,28 @@ - - #000000 - + + 3 + + + #000000 + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + - wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + wxALL|wxEXPAND 5 diff --git a/xLights/wxsmith/PathGenerationDialog.wxs b/xLights/wxsmith/PathGenerationDialog.wxs index 1b12f98c35..d4c803941f 100644 --- a/xLights/wxsmith/PathGenerationDialog.wxs +++ b/xLights/wxsmith/PathGenerationDialog.wxs @@ -32,7 +32,7 @@ Select an image file - *.jpg;*.gif;*.png;*.bmp;*.jpeg + *.jpg;*.gif;*.png;*.bmp;*.jpeg;*.webp wxALL|wxEXPAND diff --git a/xLights/wxsmith/ShockwavePanel.wxs b/xLights/wxsmith/ShockwavePanel.wxs index c48b4291ee..6a545d2aeb 100644 --- a/xLights/wxsmith/ShockwavePanel.wxs +++ b/xLights/wxsmith/ShockwavePanel.wxs @@ -51,7 +51,6 @@ - 14,14 wxSYS_COLOUR_BTNHIGHLIGHT @@ -100,7 +99,6 @@ - 14,14 wxSYS_COLOUR_BTNHIGHLIGHT @@ -150,7 +148,6 @@ - 14,14 wxSYS_COLOUR_BTNHIGHLIGHT @@ -164,7 +161,7 @@ - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 5 @@ -200,7 +197,6 @@ - 14,14 wxSYS_COLOUR_BTNHIGHLIGHT @@ -250,7 +246,6 @@ - 14,14 wxSYS_COLOUR_BTNHIGHLIGHT @@ -264,7 +259,7 @@ - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 5 @@ -300,7 +295,6 @@ - 14,14 wxSYS_COLOUR_BTNHIGHLIGHT @@ -349,7 +343,6 @@ - 14,14 wxSYS_COLOUR_BTNHIGHLIGHT @@ -359,6 +352,49 @@ 5 + + + + + wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL + 5 + + + + + 1 + 1 + + wxALL|wxEXPAND + 5 + + + + + 1 + 3 + 20,-1d + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + 14,14 + wxSYS_COLOUR_BTNHIGHLIGHT + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + @@ -369,6 +405,30 @@ 5 + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + diff --git a/xLights/xLights.cbp b/xLights/xLights.cbp index 4bfedbb37a..a604b67add 100644 --- a/xLights/xLights.cbp +++ b/xLights/xLights.cbp @@ -213,6 +213,8 @@ + + @@ -266,6 +268,8 @@ + + @@ -533,6 +537,8 @@ + + @@ -840,6 +846,10 @@ + + + + @@ -1398,8 +1408,11 @@ + + + @@ -1433,8 +1446,9 @@ - + + @@ -1703,6 +1717,7 @@ + @@ -1791,6 +1806,7 @@ + diff --git a/xLights/xLights.cbp.mak b/xLights/xLights.cbp.mak index bfcf1df616..e839d2a733 100644 --- a/xLights/xLights.cbp.mak +++ b/xLights/xLights.cbp.mak @@ -24,7 +24,7 @@ RESINC_LINUX_DEBUG = $(RESINC) RCFLAGS_LINUX_DEBUG = $(RCFLAGS) LIBDIR_LINUX_DEBUG = $(LIBDIR) LIB_LINUX_DEBUG = $(LIB)../lib/linux/libliquidfun.a ../dependencies/libxlsxwriter/lib/libxlsxwriter.a -LDFLAGS_LINUX_DEBUG = -lGL -lGLU -lglut -ldl -lX11 -lcurl `pkg-config --libs libavformat libavcodec libavutil libswresample libswscale` `pkg-config --libs log4cpp` `sdl2-config --libs` `wx-config --version=3.3 --libs std,media,gl,aui,propgrid` `pkg-config --libs gstreamer-1.0 gstreamer-video-1.0` `pkg-config --libs lua53` -lexpat -rdynamic -lz -lzstd -lstdc++fs $(LDFLAGS) +LDFLAGS_LINUX_DEBUG = -lGL -lGLU -lglut -ldl -lX11 -lcurl `pkg-config --libs libavformat libavcodec libavutil libswresample libswscale` `pkg-config --libs log4cpp` `sdl2-config --libs` `wx-config --version=3.3 --libs std,media,gl,aui,propgrid` `pkg-config --libs gstreamer-1.0 gstreamer-video-1.0` `pkg-config --libs lua53` -lexpat -rdynamic -lz -lzstd -lwebp -lwebpdemux -lstdc++fs $(LDFLAGS) OBJDIR_LINUX_DEBUG = .objs_debug DEP_LINUX_DEBUG = OUT_LINUX_DEBUG = ../bin/xLights @@ -35,14 +35,14 @@ RESINC_LINUX_RELEASE = $(RESINC) RCFLAGS_LINUX_RELEASE = $(RCFLAGS) -Wno-reorder -Wno-sign-compare -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-function -Wno-unknown-pragmas LIBDIR_LINUX_RELEASE = $(LIBDIR) LIB_LINUX_RELEASE = $(LIB)../lib/linux/libliquidfun.a ../dependencies/libxlsxwriter/lib/libxlsxwriter.a -LDFLAGS_LINUX_RELEASE = -lGL -lGLU -lglut -ldl -lX11 -lcurl `pkg-config --libs libavformat libavcodec libavutil libswresample libswscale` `pkg-config --libs log4cpp` `sdl2-config --libs` `wx-config --version=3.3 --libs std,media,gl,aui,propgrid` `pkg-config --libs gstreamer-1.0 gstreamer-video-1.0` `pkg-config --libs lua53` -lexpat -rdynamic -lz -lzstd -lstdc++fs $(LDFLAGS) +LDFLAGS_LINUX_RELEASE = -lGL -lGLU -lglut -ldl -lX11 -lcurl `pkg-config --libs libavformat libavcodec libavutil libswresample libswscale` `pkg-config --libs log4cpp` `sdl2-config --libs` `wx-config --version=3.3 --libs std,media,gl,aui,propgrid` `pkg-config --libs gstreamer-1.0 gstreamer-video-1.0` `pkg-config --libs lua53` -lexpat -rdynamic -lz -lzstd -lwebp -lwebpdemux -lstdc++fs $(LDFLAGS) OBJDIR_LINUX_RELEASE = .objs_lr DEP_LINUX_RELEASE = OUT_LINUX_RELEASE = ../bin/xLights -OBJ_LINUX_DEBUG = $(OBJDIR_LINUX_DEBUG)/models/SpinnerModel.o $(OBJDIR_LINUX_DEBUG)/models/TerrianObject.o $(OBJDIR_LINUX_DEBUG)/models/TerrainScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/SubModel.o $(OBJDIR_LINUX_DEBUG)/models/StarModel.o $(OBJDIR_LINUX_DEBUG)/models/SphereModel.o $(OBJDIR_LINUX_DEBUG)/models/SingleLineModel.o $(OBJDIR_LINUX_DEBUG)/models/Shapes.o $(OBJDIR_LINUX_DEBUG)/models/RulerObject.o $(OBJDIR_LINUX_DEBUG)/models/ViewObjectManager.o $(OBJDIR_LINUX_DEBUG)/outputs/ArtNetOutput.o $(OBJDIR_LINUX_DEBUG)/models/WreathModel.o $(OBJDIR_LINUX_DEBUG)/models/WindowFrameModel.o $(OBJDIR_LINUX_DEBUG)/models/WholeHouseModel.o $(OBJDIR_LINUX_DEBUG)/models/ViewObject.o $(OBJDIR_LINUX_DEBUG)/models/TwoPointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/TreeModel.o $(OBJDIR_LINUX_DEBUG)/models/ThreePointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/ImageModel.o $(OBJDIR_LINUX_DEBUG)/models/Model.o $(OBJDIR_LINUX_DEBUG)/models/MeshObject.o $(OBJDIR_LINUX_DEBUG)/models/MatrixModel.o $(OBJDIR_LINUX_DEBUG)/models/ImageObject.o $(OBJDIR_LINUX_DEBUG)/models/IciclesModel.o $(OBJDIR_LINUX_DEBUG)/models/GridlinesObject.o $(OBJDIR_LINUX_DEBUG)/models/DMX/SkullConfigDialog.o $(OBJDIR_LINUX_DEBUG)/models/MultiPointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/PolyPointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/PolyLineModel.o $(OBJDIR_LINUX_DEBUG)/models/ObjectManager.o $(OBJDIR_LINUX_DEBUG)/models/Node.o $(OBJDIR_LINUX_DEBUG)/models/MultiPointModel.o $(OBJDIR_LINUX_DEBUG)/models/ModelScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/ModelManager.o $(OBJDIR_LINUX_DEBUG)/models/ModelGroup.o $(OBJDIR_LINUX_DEBUG)/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/TwinklyOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/TestPreset.o $(OBJDIR_LINUX_DEBUG)/outputs/SerialOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/ZCPPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/PixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/OutputManager.o $(OBJDIR_LINUX_DEBUG)/outputs/Output.o $(OBJDIR_LINUX_DEBUG)/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/preferences/OtherSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/EffectsGridSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/ColorManagerSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/CheckSequenceSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/BackupSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/serial.o $(OBJDIR_LINUX_DEBUG)/outputs/DDPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/E131Output.o $(OBJDIR_LINUX_DEBUG)/outputs/DMXOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerSerial.o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerNull.o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerEthernet.o $(OBJDIR_LINUX_DEBUG)/outputs/Controller.o $(OBJDIR_LINUX_DEBUG)/outputs/LorController.o $(OBJDIR_LINUX_DEBUG)/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/OPCOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/NullOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/LorControllers.o $(OBJDIR_LINUX_DEBUG)/models/DMX/ServoConfigDialog.o $(OBJDIR_LINUX_DEBUG)/outputs/LOROutput.o $(OBJDIR_LINUX_DEBUG)/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/KinetOutput.o $(OBJDIR_LINUX_DEBUG)/effects/WarpPanel.o $(OBJDIR_LINUX_DEBUG)/effects/WarpEffect.o $(OBJDIR_LINUX_DEBUG)/effects/VideoPanel.o $(OBJDIR_LINUX_DEBUG)/effects/VideoEffect.o $(OBJDIR_LINUX_DEBUG)/effects/WaveEffect.o $(OBJDIR_LINUX_DEBUG)/effects/VUMeterPanel.o $(OBJDIR_LINUX_DEBUG)/effects/VUMeterEffect.o $(OBJDIR_LINUX_DEBUG)/effects/TwinklePanel.o $(OBJDIR_LINUX_DEBUG)/effects/TwinkleEffect.o $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasPictures.o $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasMorph.o $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasEmpty.o $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchCanvasPanel.o $(OBJDIR_LINUX_DEBUG)/effects/TreePanel.o $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchAssistPanel.o $(OBJDIR_LINUX_DEBUG)/effects/assist/PicturesAssistPanel.o $(OBJDIR_LINUX_DEBUG)/effects/assist/AssistPanel.o $(OBJDIR_LINUX_DEBUG)/effects/WavePanel.o $(OBJDIR_LINUX_DEBUG)/effects/SpiralsEffect.o $(OBJDIR_LINUX_DEBUG)/effects/StateEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SpirographPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SpirographEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SpiralsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SnowstormPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SnowstormEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SnowflakesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SnowflakesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/TreeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/TextPanel.o $(OBJDIR_LINUX_DEBUG)/effects/TextEffect.o $(OBJDIR_LINUX_DEBUG)/effects/TendrilPanel.o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/DrawGLUtils.o $(OBJDIR_LINUX_DEBUG)/effects/TendrilEffect.o $(OBJDIR_LINUX_DEBUG)/effects/StrobePanel.o $(OBJDIR_LINUX_DEBUG)/effects/StrobeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/StatePanel.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxMovingHead3D.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxMovingHead.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxModel.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxImage.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxPanTiltAbility.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxGeneral.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxFloodlight.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxFloodArea.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbilityWheel.o $(OBJDIR_LINUX_DEBUG)/models/DMX/Servo.o $(OBJDIR_LINUX_DEBUG)/models/DMX/Mesh.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxSkulltronix.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxSkull.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbilityRGB.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxShutterAbility.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxServo3D.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxServo.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxPresetAbility.o $(OBJDIR_LINUX_DEBUG)/models/ArchesModel.o $(OBJDIR_LINUX_DEBUG)/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_DEBUG)/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_DEBUG)/graphics/xlMesh.o $(OBJDIR_LINUX_DEBUG)/models/BaseObject.o $(OBJDIR_LINUX_DEBUG)/graphics/xlGraphicsAccumulators.o $(OBJDIR_LINUX_DEBUG)/graphics/xlFontInfo.o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/xlOGL3GraphicsContext.o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/xlGLCanvas.o $(OBJDIR_LINUX_DEBUG)/models/CircleModel.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbilityCMY.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbility.o $(OBJDIR_LINUX_DEBUG)/models/CustomModel.o $(OBJDIR_LINUX_DEBUG)/models/CubeModel.o $(OBJDIR_LINUX_DEBUG)/preferences/OutputSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/models/ChannelBlockModel.o $(OBJDIR_LINUX_DEBUG)/models/CandyCaneModel.o $(OBJDIR_LINUX_DEBUG)/models/BoxedScreenLocation.o $(OBJDIR_LINUX_DEBUG)/xLightsMain.o $(OBJDIR_LINUX_DEBUG)/xLightsImportChannelMapDialog.o $(OBJDIR_LINUX_DEBUG)/xLightsApp.o $(OBJDIR_LINUX_DEBUG)/xLightsTimer.o $(OBJDIR_LINUX_DEBUG)/xlColorPickerFields.o $(OBJDIR_LINUX_DEBUG)/xlSlider.o $(OBJDIR_LINUX_DEBUG)/xlLockButton.o $(OBJDIR_LINUX_DEBUG)/xlGridCanvas.o $(OBJDIR_LINUX_DEBUG)/xlColorPicker.o $(OBJDIR_LINUX_DEBUG)/xlColorCanvas.o $(OBJDIR_LINUX_DEBUG)/xLightsXmlFile.o $(OBJDIR_LINUX_DEBUG)/xLightsVersion.o $(OBJDIR_LINUX_DEBUG)/tmGridCell.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/Files.o $(OBJDIR_LINUX_DEBUG)/utils/string_utils.o $(OBJDIR_LINUX_DEBUG)/utils/ip_utils.o $(OBJDIR_LINUX_DEBUG)/utils/Curl.o $(OBJDIR_LINUX_DEBUG)/support/VectorMath.o $(OBJDIR_LINUX_DEBUG)/support/GridCellChoiceRenderer.o $(OBJDIR_LINUX_DEBUG)/support/FastComboEditor.o $(OBJDIR_LINUX_DEBUG)/support/EzGrid.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginSummarisingAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectLayer.o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectDropTarget.o $(OBJDIR_LINUX_DEBUG)/sequencer/Effect.o $(OBJDIR_LINUX_DEBUG)/sequencer/DragEffectBitmapButton.o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectsGrid.o $(OBJDIR_LINUX_DEBUG)/preferences/xLightsPreferences.o $(OBJDIR_LINUX_DEBUG)/preferences/ViewSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/SequenceFileSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/RandomEffectsSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/sequencer/SequenceElements.o $(OBJDIR_LINUX_DEBUG)/sequencer/tabSequencer.o $(OBJDIR_LINUX_DEBUG)/sequencer/Waveform.o $(OBJDIR_LINUX_DEBUG)/sequencer/UndoManager.o $(OBJDIR_LINUX_DEBUG)/sequencer/TimeLine.o $(OBJDIR_LINUX_DEBUG)/sequencer/RowHeading.o $(OBJDIR_LINUX_DEBUG)/sequencer/MainSequencer.o $(OBJDIR_LINUX_DEBUG)/sequencer/Element.o $(OBJDIR_LINUX_DEBUG)/wxModelGridCellRenderer.o $(OBJDIR_LINUX_DEBUG)/wxCheckedListCtrl.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/host-c.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/acsymbols.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_DEBUG)/MultiControllerUploadDialog.o $(OBJDIR_LINUX_DEBUG)/Mouse3DManager.o $(OBJDIR_LINUX_DEBUG)/ModelStateDialog.o $(OBJDIR_LINUX_DEBUG)/ModelRemap.o $(OBJDIR_LINUX_DEBUG)/MusicXML.o $(OBJDIR_LINUX_DEBUG)/ModelPreview.o $(OBJDIR_LINUX_DEBUG)/ModelGroupPanel.o $(OBJDIR_LINUX_DEBUG)/ModelFaceDialog.o $(OBJDIR_LINUX_DEBUG)/ModelDimmingCurveDialog.o $(OBJDIR_LINUX_DEBUG)/PaletteMgmtDialog.o $(OBJDIR_LINUX_DEBUG)/OutputModelManager.o $(OBJDIR_LINUX_DEBUG)/OptionChooser.o $(OBJDIR_LINUX_DEBUG)/OpenGLShaders.o $(OBJDIR_LINUX_DEBUG)/NoteRangeDialog.o $(OBJDIR_LINUX_DEBUG)/ModelChainDialog.o $(OBJDIR_LINUX_DEBUG)/NoteImportDialog.o $(OBJDIR_LINUX_DEBUG)/NodesGridCellEditor.o $(OBJDIR_LINUX_DEBUG)/NodeSelectGrid.o $(OBJDIR_LINUX_DEBUG)/NewTimingDialog.o $(OBJDIR_LINUX_DEBUG)/LORPreview.o $(OBJDIR_LINUX_DEBUG)/LayoutUtils.o $(OBJDIR_LINUX_DEBUG)/LayoutPanel.o $(OBJDIR_LINUX_DEBUG)/LayoutGroup.o $(OBJDIR_LINUX_DEBUG)/LayerSelectDialog.o $(OBJDIR_LINUX_DEBUG)/LOREdit.o $(OBJDIR_LINUX_DEBUG)/LMSImportChannelMapDialog.o $(OBJDIR_LINUX_DEBUG)/KeyBindings.o $(OBJDIR_LINUX_DEBUG)/KeyBindingEditDialog.o $(OBJDIR_LINUX_DEBUG)/MIDI/Binasc.o $(OBJDIR_LINUX_DEBUG)/MediaImportOptionsDialog.o $(OBJDIR_LINUX_DEBUG)/MatrixFaceDownloadDialog.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiMessage.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiFile.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiEventList.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiEvent.o $(OBJDIR_LINUX_DEBUG)/LyricsDialog.o $(OBJDIR_LINUX_DEBUG)/LyricUserDictDialog.o $(OBJDIR_LINUX_DEBUG)/LorConvertDialog.o $(OBJDIR_LINUX_DEBUG)/LinkJukeboxButtonDialog.o $(OBJDIR_LINUX_DEBUG)/SeqElementMismatchDialog.o $(OBJDIR_LINUX_DEBUG)/SequenceData.o $(OBJDIR_LINUX_DEBUG)/SeqSettingsDialog.o $(OBJDIR_LINUX_DEBUG)/SeqFileUtilities.o $(OBJDIR_LINUX_DEBUG)/SeqExportDialog.o $(OBJDIR_LINUX_DEBUG)/SelectTimingsDialog.o $(OBJDIR_LINUX_DEBUG)/SelectPanel.o $(OBJDIR_LINUX_DEBUG)/SearchPanel.o $(OBJDIR_LINUX_DEBUG)/ScriptsDialog.o $(OBJDIR_LINUX_DEBUG)/SevenSegmentDialog.o $(OBJDIR_LINUX_DEBUG)/StrandNodeNamesDialog.o $(OBJDIR_LINUX_DEBUG)/StartChannelDialog.o $(OBJDIR_LINUX_DEBUG)/SplashDialog.o $(OBJDIR_LINUX_DEBUG)/ShaderDownloadDialog.o $(OBJDIR_LINUX_DEBUG)/SequenceViewManager.o $(OBJDIR_LINUX_DEBUG)/SequenceVideoPreview.o $(OBJDIR_LINUX_DEBUG)/SequenceVideoPanel.o $(OBJDIR_LINUX_DEBUG)/SequencePackage.o $(OBJDIR_LINUX_DEBUG)/PixelBuffer.o $(OBJDIR_LINUX_DEBUG)/RemapDMXChannelsDialog.o $(OBJDIR_LINUX_DEBUG)/PreviewPane.o $(OBJDIR_LINUX_DEBUG)/Pixels.o $(OBJDIR_LINUX_DEBUG)/PixelTestDialog.o $(OBJDIR_LINUX_DEBUG)/PhonemeDictionary.o $(OBJDIR_LINUX_DEBUG)/PerspectivesPanel.o $(OBJDIR_LINUX_DEBUG)/PathGenerationDialog.o $(OBJDIR_LINUX_DEBUG)/Parallel.o $(OBJDIR_LINUX_DEBUG)/SaveChangesDialog.o $(OBJDIR_LINUX_DEBUG)/RestoreBackupDialog.o $(OBJDIR_LINUX_DEBUG)/ResizeImageDialog.o $(OBJDIR_LINUX_DEBUG)/RenderProgressDialog.o $(OBJDIR_LINUX_DEBUG)/RenderCache.o $(OBJDIR_LINUX_DEBUG)/RenderBuffer.o $(OBJDIR_LINUX_DEBUG)/Render.o $(OBJDIR_LINUX_DEBUG)/RenameTextDialog.o $(OBJDIR_LINUX_DEBUG)/BulkEditFontPickerDialog.o $(OBJDIR_LINUX_DEBUG)/CharMapDialog.o $(OBJDIR_LINUX_DEBUG)/ChannelLayoutDialog.o $(OBJDIR_LINUX_DEBUG)/CachedFileDownloader.o $(OBJDIR_LINUX_DEBUG)/BulkEditSliderDialog.o $(OBJDIR_LINUX_DEBUG)/BulkEditControls.o $(OBJDIR_LINUX_DEBUG)/BulkEditComboDialog.o $(OBJDIR_LINUX_DEBUG)/BulkEditColourPickerDialog.o $(OBJDIR_LINUX_DEBUG)/BufferSizeDialog.o $(OBJDIR_LINUX_DEBUG)/ControllerConnectionDialog.o $(OBJDIR_LINUX_DEBUG)/ColoursPanel.o $(OBJDIR_LINUX_DEBUG)/ColourReplaceDialog.o $(OBJDIR_LINUX_DEBUG)/ColorPanel.o $(OBJDIR_LINUX_DEBUG)/ColorManager.o $(OBJDIR_LINUX_DEBUG)/ColorCurveDialog.o $(OBJDIR_LINUX_DEBUG)/ColorCurve.o $(OBJDIR_LINUX_DEBUG)/Color.o $(OBJDIR_LINUX_DEBUG)/CheckboxSelectDialog.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/message.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/status.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/sha1.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/server.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/response.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/request.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/pages.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/context.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/connection.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/md5.o $(OBJDIR_LINUX_DEBUG)/__/xFade/wxLED.o $(OBJDIR_LINUX_DEBUG)/BufferPanel.o $(OBJDIR_LINUX_DEBUG)/BitmapCache.o $(OBJDIR_LINUX_DEBUG)/BatchRenderDialog.o $(OBJDIR_LINUX_DEBUG)/AudioManager.o $(OBJDIR_LINUX_DEBUG)/AlignmentDialog.o $(OBJDIR_LINUX_DEBUG)/ControllerModelDialog.o $(OBJDIR_LINUX_DEBUG)/AboutDialog.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_DEBUG)/FlickerFreeBitmapButton.o $(OBJDIR_LINUX_DEBUG)/FindDataPanel.o $(OBJDIR_LINUX_DEBUG)/FileConverter.o $(OBJDIR_LINUX_DEBUG)/FSEQFile.o $(OBJDIR_LINUX_DEBUG)/FontManager.o $(OBJDIR_LINUX_DEBUG)/ExportSettings.o $(OBJDIR_LINUX_DEBUG)/ExportModelSelect.o $(OBJDIR_LINUX_DEBUG)/EmailDialog.o $(OBJDIR_LINUX_DEBUG)/EffectsPanel.o $(OBJDIR_LINUX_DEBUG)/JukeboxPanel.o $(OBJDIR_LINUX_DEBUG)/JobPool.o $(OBJDIR_LINUX_DEBUG)/ImportPreviewsModelsDialog.o $(OBJDIR_LINUX_DEBUG)/IPEntryDialog.o $(OBJDIR_LINUX_DEBUG)/EffectTreeDialog.o $(OBJDIR_LINUX_DEBUG)/HousePreviewPanel.o $(OBJDIR_LINUX_DEBUG)/GenerateLyricsDialog.o $(OBJDIR_LINUX_DEBUG)/GenerateCustomModelDialog.o $(OBJDIR_LINUX_DEBUG)/GPURenderUtils.o $(OBJDIR_LINUX_DEBUG)/DimmingCurvePanel.o $(OBJDIR_LINUX_DEBUG)/DimmingCurve.o $(OBJDIR_LINUX_DEBUG)/DataLayer.o $(OBJDIR_LINUX_DEBUG)/CustomTimingDialog.o $(OBJDIR_LINUX_DEBUG)/Discovery.o $(OBJDIR_LINUX_DEBUG)/CustomModelDialog.o $(OBJDIR_LINUX_DEBUG)/CopyFormat1.o $(OBJDIR_LINUX_DEBUG)/ConvertLogDialog.o $(OBJDIR_LINUX_DEBUG)/ConvertDialog.o $(OBJDIR_LINUX_DEBUG)/EffectTimingDialog.o $(OBJDIR_LINUX_DEBUG)/EffectListDialog.o $(OBJDIR_LINUX_DEBUG)/EffectIconPanel.o $(OBJDIR_LINUX_DEBUG)/EffectAssist.o $(OBJDIR_LINUX_DEBUG)/DuplicateDialog.o $(OBJDIR_LINUX_DEBUG)/DragValueCurveBitmapButton.o $(OBJDIR_LINUX_DEBUG)/DragColoursBitmapButton.o $(OBJDIR_LINUX_DEBUG)/DissolveTransitionPattern.o $(OBJDIR_LINUX_DEBUG)/effects/LifeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopePanel.o $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GuitarPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LifePanel.o $(OBJDIR_LINUX_DEBUG)/effects/GuitarEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GlediatorPanel.o $(OBJDIR_LINUX_DEBUG)/effects/GlediatorEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GarlandsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/MarqueePanel.o $(OBJDIR_LINUX_DEBUG)/effects/MarqueeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/LiquidPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LiquidEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GarlandsEffect.o $(OBJDIR_LINUX_DEBUG)/effects/LinesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LinesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/LightningPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LightningEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FacesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FillEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FanPanel.o $(OBJDIR_LINUX_DEBUG)/effects/FanEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FacesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/FX.o $(OBJDIR_LINUX_DEBUG)/effects/EffectPanelUtils.o $(OBJDIR_LINUX_DEBUG)/effects/EffectManager.o $(OBJDIR_LINUX_DEBUG)/effects/DMXPanel.o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyPanel.o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GIFImage.o $(OBJDIR_LINUX_DEBUG)/effects/FireworksPanel.o $(OBJDIR_LINUX_DEBUG)/effects/MeteorsEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FireworksEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FirePanel.o $(OBJDIR_LINUX_DEBUG)/effects/FireEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FillPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ServoPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShapePanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShapeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ShaderPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShaderEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ServoEffect.o $(OBJDIR_LINUX_DEBUG)/effects/RipplePanel.o $(OBJDIR_LINUX_DEBUG)/effects/RippleEffect.o $(OBJDIR_LINUX_DEBUG)/effects/RenderableEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SketchPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffectDrawing.o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShockwavePanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShockwaveEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ShimmerPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShimmerEffect.o $(OBJDIR_LINUX_DEBUG)/effects/OnEffect.o $(OBJDIR_LINUX_DEBUG)/effects/OffPanel.o $(OBJDIR_LINUX_DEBUG)/effects/OffEffect.o $(OBJDIR_LINUX_DEBUG)/effects/MusicPanel.o $(OBJDIR_LINUX_DEBUG)/effects/OnPanel.o $(OBJDIR_LINUX_DEBUG)/effects/MusicEffect.o $(OBJDIR_LINUX_DEBUG)/effects/MorphPanel.o $(OBJDIR_LINUX_DEBUG)/effects/MorphEffect.o $(OBJDIR_LINUX_DEBUG)/effects/MeteorsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PicturesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaEffect.o $(OBJDIR_LINUX_DEBUG)/effects/PinwheelPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PinwheelEffect.o $(OBJDIR_LINUX_DEBUG)/effects/PicturesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/PianoPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PianoEffect.o $(OBJDIR_LINUX_DEBUG)/ViewpointDialog.o $(OBJDIR_LINUX_DEBUG)/ViewObjectPanel.o $(OBJDIR_LINUX_DEBUG)/VideoReader.o $(OBJDIR_LINUX_DEBUG)/VideoExporter.o $(OBJDIR_LINUX_DEBUG)/ViewpointMgr.o $(OBJDIR_LINUX_DEBUG)/VendorMusicHelpers.o $(OBJDIR_LINUX_DEBUG)/VendorMusicDialog.o $(OBJDIR_LINUX_DEBUG)/VendorModelDialog.o $(OBJDIR_LINUX_DEBUG)/ValueCurvesPanel.o $(OBJDIR_LINUX_DEBUG)/cad/CADModel.o $(OBJDIR_LINUX_DEBUG)/automation/xLightsAutomations.o $(OBJDIR_LINUX_DEBUG)/automation/automation.o $(OBJDIR_LINUX_DEBUG)/automation/LuaRunner.o $(OBJDIR_LINUX_DEBUG)/ValueCurveDialog.o $(OBJDIR_LINUX_DEBUG)/WiringDialog.o $(OBJDIR_LINUX_DEBUG)/VsaImportDialog.o $(OBJDIR_LINUX_DEBUG)/Vixen3.o $(OBJDIR_LINUX_DEBUG)/ViewsModelsPanel.o $(OBJDIR_LINUX_DEBUG)/TabConvert.o $(OBJDIR_LINUX_DEBUG)/TopEffectsPanel.o $(OBJDIR_LINUX_DEBUG)/TipOfTheDayDialog.o $(OBJDIR_LINUX_DEBUG)/TimingPanel.o $(OBJDIR_LINUX_DEBUG)/TabSetup.o $(OBJDIR_LINUX_DEBUG)/TabSequence.o $(OBJDIR_LINUX_DEBUG)/TabPreview.o $(OBJDIR_LINUX_DEBUG)/SuperStarImportDialog.o $(OBJDIR_LINUX_DEBUG)/SubModelsDialog.o $(OBJDIR_LINUX_DEBUG)/SubModelGenerateDialog.o $(OBJDIR_LINUX_DEBUG)/SubBufferPanel.o $(OBJDIR_LINUX_DEBUG)/ValueCurveButton.o $(OBJDIR_LINUX_DEBUG)/ValueCurve.o $(OBJDIR_LINUX_DEBUG)/VSAFile.o $(OBJDIR_LINUX_DEBUG)/VAMPPluginDialog.o $(OBJDIR_LINUX_DEBUG)/UtilFunctions.o $(OBJDIR_LINUX_DEBUG)/UtilClasses.o $(OBJDIR_LINUX_DEBUG)/UpdaterDialog.o $(OBJDIR_LINUX_DEBUG)/TraceLog.o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyEffect.o $(OBJDIR_LINUX_DEBUG)/effects/BarsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/BarsEffect.o $(OBJDIR_LINUX_DEBUG)/controllers/WebSocketClient.o $(OBJDIR_LINUX_DEBUG)/controllers/WLED.o $(OBJDIR_LINUX_DEBUG)/controllers/SanDevices.o $(OBJDIR_LINUX_DEBUG)/controllers/Pixlite16.o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashEffect.o $(OBJDIR_LINUX_DEBUG)/effects/DMXEffect.o $(OBJDIR_LINUX_DEBUG)/effects/CurtainPanel.o $(OBJDIR_LINUX_DEBUG)/effects/CurtainEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashPanel.o $(OBJDIR_LINUX_DEBUG)/controllers/Minleon.o $(OBJDIR_LINUX_DEBUG)/effects/CirclesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/CirclesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/CandlePanel.o $(OBJDIR_LINUX_DEBUG)/effects/CandleEffect.o $(OBJDIR_LINUX_DEBUG)/cad/VRMLWriter.o $(OBJDIR_LINUX_DEBUG)/controllers/ControllerUploadData.o $(OBJDIR_LINUX_DEBUG)/controllers/ControllerCaps.o $(OBJDIR_LINUX_DEBUG)/controllers/BaseController.o $(OBJDIR_LINUX_DEBUG)/controllers/AlphaPix.o $(OBJDIR_LINUX_DEBUG)/cad/STLWriter.o $(OBJDIR_LINUX_DEBUG)/cad/ModelToCAD.o $(OBJDIR_LINUX_DEBUG)/cad/DXFWriter.o $(OBJDIR_LINUX_DEBUG)/cad/CADWriter.o $(OBJDIR_LINUX_DEBUG)/controllers/J1Sys.o $(OBJDIR_LINUX_DEBUG)/controllers/HinksPixExportDialog.o $(OBJDIR_LINUX_DEBUG)/controllers/HinksPix.o $(OBJDIR_LINUX_DEBUG)/controllers/Falcon.o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o $(OBJDIR_LINUX_DEBUG)/controllers/FPPConnectDialog.o $(OBJDIR_LINUX_DEBUG)/controllers/FPP.o $(OBJDIR_LINUX_DEBUG)/controllers/Experience.o $(OBJDIR_LINUX_DEBUG)/controllers/ESPixelStick.o +OBJ_LINUX_DEBUG = $(OBJDIR_LINUX_DEBUG)/models/SpinnerModel.o $(OBJDIR_LINUX_DEBUG)/models/TerrianObject.o $(OBJDIR_LINUX_DEBUG)/models/TerrainScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/SubModel.o $(OBJDIR_LINUX_DEBUG)/models/StarModel.o $(OBJDIR_LINUX_DEBUG)/models/ThreePointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/SphereModel.o $(OBJDIR_LINUX_DEBUG)/models/SingleLineModel.o $(OBJDIR_LINUX_DEBUG)/models/Shapes.o $(OBJDIR_LINUX_DEBUG)/models/RulerObject.o $(OBJDIR_LINUX_DEBUG)/outputs/ArtNetOutput.o $(OBJDIR_LINUX_DEBUG)/models/WreathModel.o $(OBJDIR_LINUX_DEBUG)/models/WindowFrameModel.o $(OBJDIR_LINUX_DEBUG)/models/WholeHouseModel.o $(OBJDIR_LINUX_DEBUG)/models/ViewObjectManager.o $(OBJDIR_LINUX_DEBUG)/models/ViewObject.o $(OBJDIR_LINUX_DEBUG)/models/TwoPointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/TreeModel.o $(OBJDIR_LINUX_DEBUG)/models/ImageModel.o $(OBJDIR_LINUX_DEBUG)/models/Model.o $(OBJDIR_LINUX_DEBUG)/models/MeshObject.o $(OBJDIR_LINUX_DEBUG)/models/MatrixModel.o $(OBJDIR_LINUX_DEBUG)/models/ImageObject.o $(OBJDIR_LINUX_DEBUG)/models/IciclesModel.o $(OBJDIR_LINUX_DEBUG)/models/GridlinesObject.o $(OBJDIR_LINUX_DEBUG)/models/DMX/SkullConfigDialog.o $(OBJDIR_LINUX_DEBUG)/models/MultiPointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/PolyPointScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/PolyLineModel.o $(OBJDIR_LINUX_DEBUG)/models/ObjectManager.o $(OBJDIR_LINUX_DEBUG)/models/Node.o $(OBJDIR_LINUX_DEBUG)/outputs/Controller.o $(OBJDIR_LINUX_DEBUG)/models/MultiPointModel.o $(OBJDIR_LINUX_DEBUG)/models/ModelScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/ModelManager.o $(OBJDIR_LINUX_DEBUG)/models/ModelGroup.o $(OBJDIR_LINUX_DEBUG)/outputs/SerialOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/serial.o $(OBJDIR_LINUX_DEBUG)/outputs/ZCPPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/TwinklyOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/TestPreset.o $(OBJDIR_LINUX_DEBUG)/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/PixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/OutputManager.o $(OBJDIR_LINUX_DEBUG)/outputs/Output.o $(OBJDIR_LINUX_DEBUG)/preferences/ColorManagerSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/RandomEffectsSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/OutputSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/OtherSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/EffectsGridSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/CheckSequenceSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/BackupSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/E131Output.o $(OBJDIR_LINUX_DEBUG)/outputs/DMXOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/DDPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerSerial.o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerNull.o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerEthernet.o $(OBJDIR_LINUX_DEBUG)/outputs/LorControllers.o $(OBJDIR_LINUX_DEBUG)/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/OPCOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/NullOutput.o $(OBJDIR_LINUX_DEBUG)/models/DMX/ServoConfigDialog.o $(OBJDIR_LINUX_DEBUG)/outputs/LorController.o $(OBJDIR_LINUX_DEBUG)/outputs/LOROutput.o $(OBJDIR_LINUX_DEBUG)/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/KinetOutput.o $(OBJDIR_LINUX_DEBUG)/effects/WarpPanel.o $(OBJDIR_LINUX_DEBUG)/effects/WarpEffect.o $(OBJDIR_LINUX_DEBUG)/effects/VideoPanel.o $(OBJDIR_LINUX_DEBUG)/effects/VideoEffect.o $(OBJDIR_LINUX_DEBUG)/effects/VUMeterPanel.o $(OBJDIR_LINUX_DEBUG)/effects/VUMeterEffect.o $(OBJDIR_LINUX_DEBUG)/effects/TwinklePanel.o $(OBJDIR_LINUX_DEBUG)/effects/TwinkleEffect.o $(OBJDIR_LINUX_DEBUG)/effects/TreePanel.o $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchAssistPanel.o $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasPictures.o $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasMorph.o $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasEmpty.o $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchCanvasPanel.o $(OBJDIR_LINUX_DEBUG)/effects/TreeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/assist/PicturesAssistPanel.o $(OBJDIR_LINUX_DEBUG)/effects/assist/AssistPanel.o $(OBJDIR_LINUX_DEBUG)/effects/WavePanel.o $(OBJDIR_LINUX_DEBUG)/effects/WaveEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SpirographEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SpiralsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SpiralsEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SnowstormPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SpirographPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SnowstormEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SnowflakesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SnowflakesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SketchPanel.o $(OBJDIR_LINUX_DEBUG)/effects/TextPanel.o $(OBJDIR_LINUX_DEBUG)/effects/TextEffect.o $(OBJDIR_LINUX_DEBUG)/effects/TendrilPanel.o $(OBJDIR_LINUX_DEBUG)/effects/TendrilEffect.o $(OBJDIR_LINUX_DEBUG)/effects/StrobePanel.o $(OBJDIR_LINUX_DEBUG)/effects/StrobeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/StatePanel.o $(OBJDIR_LINUX_DEBUG)/effects/StateEffect.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxMovingHead3D.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxMovingHead.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxModel.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxImage.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxPanTiltAbility.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxGeneral.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxFloodlight.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxFloodArea.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbilityWheel.o $(OBJDIR_LINUX_DEBUG)/models/DMX/Servo.o $(OBJDIR_LINUX_DEBUG)/models/DMX/Mesh.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxSkulltronix.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxSkull.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbilityRGB.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxShutterAbility.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxServo3D.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxServo.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxPresetAbility.o $(OBJDIR_LINUX_DEBUG)/graphics/xlGraphicsAccumulators.o $(OBJDIR_LINUX_DEBUG)/models/ArchesModel.o $(OBJDIR_LINUX_DEBUG)/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_DEBUG)/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_DEBUG)/graphics/xlMesh.o $(OBJDIR_LINUX_DEBUG)/graphics/xlFontInfo.o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/xlOGL3GraphicsContext.o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/xlGLCanvas.o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/DrawGLUtils.o $(OBJDIR_LINUX_DEBUG)/models/CircleModel.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbilityCMY.o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxColorAbility.o $(OBJDIR_LINUX_DEBUG)/models/CustomModel.o $(OBJDIR_LINUX_DEBUG)/models/CubeModel.o $(OBJDIR_LINUX_DEBUG)/models/ChannelBlockModel.o $(OBJDIR_LINUX_DEBUG)/models/CandyCaneModel.o $(OBJDIR_LINUX_DEBUG)/models/BoxedScreenLocation.o $(OBJDIR_LINUX_DEBUG)/models/BaseObject.o $(OBJDIR_LINUX_DEBUG)/xLightsMain.o $(OBJDIR_LINUX_DEBUG)/xLightsImportChannelMapDialog.o $(OBJDIR_LINUX_DEBUG)/xLightsApp.o $(OBJDIR_LINUX_DEBUG)/xLightsTimer.o $(OBJDIR_LINUX_DEBUG)/xlColorPickerFields.o $(OBJDIR_LINUX_DEBUG)/xlSlider.o $(OBJDIR_LINUX_DEBUG)/xlLockButton.o $(OBJDIR_LINUX_DEBUG)/xlGridCanvas.o $(OBJDIR_LINUX_DEBUG)/xlColorPicker.o $(OBJDIR_LINUX_DEBUG)/xlColorCanvas.o $(OBJDIR_LINUX_DEBUG)/xLightsXmlFile.o $(OBJDIR_LINUX_DEBUG)/xLightsVersion.o $(OBJDIR_LINUX_DEBUG)/utils/CurlManager.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/Files.o $(OBJDIR_LINUX_DEBUG)/utils/string_utils.o $(OBJDIR_LINUX_DEBUG)/utils/ip_utils.o $(OBJDIR_LINUX_DEBUG)/utils/Curl.o $(OBJDIR_LINUX_DEBUG)/tmGridCell.o $(OBJDIR_LINUX_DEBUG)/support/VectorMath.o $(OBJDIR_LINUX_DEBUG)/support/GridCellChoiceRenderer.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginSummarisingAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_DEBUG)/sequencer/Effect.o $(OBJDIR_LINUX_DEBUG)/sequencer/Element.o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectsGrid.o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectLayer.o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectDropTarget.o $(OBJDIR_LINUX_DEBUG)/sequencer/DragEffectBitmapButton.o $(OBJDIR_LINUX_DEBUG)/preferences/xLightsPreferences.o $(OBJDIR_LINUX_DEBUG)/preferences/ViewSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/SequenceFileSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/sequencer/UndoManager.o $(OBJDIR_LINUX_DEBUG)/support/FastComboEditor.o $(OBJDIR_LINUX_DEBUG)/support/EzGrid.o $(OBJDIR_LINUX_DEBUG)/sequencer/tabSequencer.o $(OBJDIR_LINUX_DEBUG)/sequencer/Waveform.o $(OBJDIR_LINUX_DEBUG)/sequencer/TimeLine.o $(OBJDIR_LINUX_DEBUG)/sequencer/SequenceElements.o $(OBJDIR_LINUX_DEBUG)/sequencer/RowHeading.o $(OBJDIR_LINUX_DEBUG)/sequencer/MainSequencer.o $(OBJDIR_LINUX_DEBUG)/wxCheckedListCtrl.o $(OBJDIR_LINUX_DEBUG)/wxWEBPHandler/imagwebp.o $(OBJDIR_LINUX_DEBUG)/wxModelGridCellRenderer.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/host-c.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/acsymbols.o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffectDrawing.o $(OBJDIR_LINUX_DEBUG)/ModelGroupPanel.o $(OBJDIR_LINUX_DEBUG)/Mouse3DManager.o $(OBJDIR_LINUX_DEBUG)/ModelStateDialog.o $(OBJDIR_LINUX_DEBUG)/ModelRemap.o $(OBJDIR_LINUX_DEBUG)/ModelPreview.o $(OBJDIR_LINUX_DEBUG)/MultiControllerUploadDialog.o $(OBJDIR_LINUX_DEBUG)/ModelFaceDialog.o $(OBJDIR_LINUX_DEBUG)/ModelDimmingCurveDialog.o $(OBJDIR_LINUX_DEBUG)/ModelChainDialog.o $(OBJDIR_LINUX_DEBUG)/MetronomeLabelDialog.o $(OBJDIR_LINUX_DEBUG)/OutputModelManager.o $(OBJDIR_LINUX_DEBUG)/OptionChooser.o $(OBJDIR_LINUX_DEBUG)/OpenGLShaders.o $(OBJDIR_LINUX_DEBUG)/NoteRangeDialog.o $(OBJDIR_LINUX_DEBUG)/NoteImportDialog.o $(OBJDIR_LINUX_DEBUG)/NodesGridCellEditor.o $(OBJDIR_LINUX_DEBUG)/NodeSelectGrid.o $(OBJDIR_LINUX_DEBUG)/NewTimingDialog.o $(OBJDIR_LINUX_DEBUG)/MusicXML.o $(OBJDIR_LINUX_DEBUG)/LayoutPanel.o $(OBJDIR_LINUX_DEBUG)/LayoutGroup.o $(OBJDIR_LINUX_DEBUG)/LayerSelectDialog.o $(OBJDIR_LINUX_DEBUG)/LORPreview.o $(OBJDIR_LINUX_DEBUG)/LayoutUtils.o $(OBJDIR_LINUX_DEBUG)/LOREdit.o $(OBJDIR_LINUX_DEBUG)/LMSImportChannelMapDialog.o $(OBJDIR_LINUX_DEBUG)/KeyBindings.o $(OBJDIR_LINUX_DEBUG)/KeyBindingEditDialog.o $(OBJDIR_LINUX_DEBUG)/MediaImportOptionsDialog.o $(OBJDIR_LINUX_DEBUG)/MatrixFaceDownloadDialog.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiMessage.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiFile.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiEventList.o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiEvent.o $(OBJDIR_LINUX_DEBUG)/MIDI/Binasc.o $(OBJDIR_LINUX_DEBUG)/LyricsDialog.o $(OBJDIR_LINUX_DEBUG)/LyricUserDictDialog.o $(OBJDIR_LINUX_DEBUG)/LorConvertDialog.o $(OBJDIR_LINUX_DEBUG)/LinkJukeboxButtonDialog.o $(OBJDIR_LINUX_DEBUG)/SequenceData.o $(OBJDIR_LINUX_DEBUG)/SeqSettingsDialog.o $(OBJDIR_LINUX_DEBUG)/SeqFileUtilities.o $(OBJDIR_LINUX_DEBUG)/SeqExportDialog.o $(OBJDIR_LINUX_DEBUG)/SeqElementMismatchDialog.o $(OBJDIR_LINUX_DEBUG)/SelectTimingsDialog.o $(OBJDIR_LINUX_DEBUG)/SelectPanel.o $(OBJDIR_LINUX_DEBUG)/SearchPanel.o $(OBJDIR_LINUX_DEBUG)/ScriptsDialog.o $(OBJDIR_LINUX_DEBUG)/SevenSegmentDialog.o $(OBJDIR_LINUX_DEBUG)/StrandNodeNamesDialog.o $(OBJDIR_LINUX_DEBUG)/StartChannelDialog.o $(OBJDIR_LINUX_DEBUG)/SplashDialog.o $(OBJDIR_LINUX_DEBUG)/ShaderDownloadDialog.o $(OBJDIR_LINUX_DEBUG)/SaveChangesDialog.o $(OBJDIR_LINUX_DEBUG)/SequenceViewManager.o $(OBJDIR_LINUX_DEBUG)/SequenceVideoPreview.o $(OBJDIR_LINUX_DEBUG)/SequenceVideoPanel.o $(OBJDIR_LINUX_DEBUG)/SequencePackage.o $(OBJDIR_LINUX_DEBUG)/PhonemeDictionary.o $(OBJDIR_LINUX_DEBUG)/PreviewPane.o $(OBJDIR_LINUX_DEBUG)/Pixels.o $(OBJDIR_LINUX_DEBUG)/PixelTestDialog.o $(OBJDIR_LINUX_DEBUG)/PixelBuffer.o $(OBJDIR_LINUX_DEBUG)/PerspectivesPanel.o $(OBJDIR_LINUX_DEBUG)/PathGenerationDialog.o $(OBJDIR_LINUX_DEBUG)/Parallel.o $(OBJDIR_LINUX_DEBUG)/PaletteMgmtDialog.o $(OBJDIR_LINUX_DEBUG)/RestoreBackupDialog.o $(OBJDIR_LINUX_DEBUG)/ResizeImageDialog.o $(OBJDIR_LINUX_DEBUG)/RenderProgressDialog.o $(OBJDIR_LINUX_DEBUG)/JukeboxPanel.o $(OBJDIR_LINUX_DEBUG)/RenderCache.o $(OBJDIR_LINUX_DEBUG)/RenderBuffer.o $(OBJDIR_LINUX_DEBUG)/Render.o $(OBJDIR_LINUX_DEBUG)/RenameTextDialog.o $(OBJDIR_LINUX_DEBUG)/RemapDMXChannelsDialog.o $(OBJDIR_LINUX_DEBUG)/CharMapDialog.o $(OBJDIR_LINUX_DEBUG)/ChannelLayoutDialog.o $(OBJDIR_LINUX_DEBUG)/CachedFileDownloader.o $(OBJDIR_LINUX_DEBUG)/BulkEditSliderDialog.o $(OBJDIR_LINUX_DEBUG)/BulkEditFontPickerDialog.o $(OBJDIR_LINUX_DEBUG)/BulkEditControls.o $(OBJDIR_LINUX_DEBUG)/BulkEditComboDialog.o $(OBJDIR_LINUX_DEBUG)/BulkEditColourPickerDialog.o $(OBJDIR_LINUX_DEBUG)/BufferSizeDialog.o $(OBJDIR_LINUX_DEBUG)/ControllerConnectionDialog.o $(OBJDIR_LINUX_DEBUG)/ColoursPanel.o $(OBJDIR_LINUX_DEBUG)/ColourReplaceDialog.o $(OBJDIR_LINUX_DEBUG)/ColorPanel.o $(OBJDIR_LINUX_DEBUG)/BufferPanel.o $(OBJDIR_LINUX_DEBUG)/ColorManager.o $(OBJDIR_LINUX_DEBUG)/ColorCurveDialog.o $(OBJDIR_LINUX_DEBUG)/ColorCurve.o $(OBJDIR_LINUX_DEBUG)/Color.o $(OBJDIR_LINUX_DEBUG)/CheckboxSelectDialog.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/message.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/status.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/sha1.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/server.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/response.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/request.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/pages.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/context.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer/connection.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/md5.o $(OBJDIR_LINUX_DEBUG)/__/xFade/wxLED.o $(OBJDIR_LINUX_DEBUG)/AlignmentDialog.o $(OBJDIR_LINUX_DEBUG)/BitmapCache.o $(OBJDIR_LINUX_DEBUG)/BatchRenderDialog.o $(OBJDIR_LINUX_DEBUG)/AutoLabelDialog.o $(OBJDIR_LINUX_DEBUG)/AudioManager.o $(OBJDIR_LINUX_DEBUG)/ControllerModelDialog.o $(OBJDIR_LINUX_DEBUG)/AboutDialog.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_DEBUG)/ExportSettings.o $(OBJDIR_LINUX_DEBUG)/FlickerFreeBitmapButton.o $(OBJDIR_LINUX_DEBUG)/FindDataPanel.o $(OBJDIR_LINUX_DEBUG)/FileConverter.o $(OBJDIR_LINUX_DEBUG)/FSEQFile.o $(OBJDIR_LINUX_DEBUG)/ExportModelSelect.o $(OBJDIR_LINUX_DEBUG)/EmailDialog.o $(OBJDIR_LINUX_DEBUG)/EffectsPanel.o $(OBJDIR_LINUX_DEBUG)/EffectTreeDialog.o $(OBJDIR_LINUX_DEBUG)/HousePreviewPanel.o $(OBJDIR_LINUX_DEBUG)/JobPool.o $(OBJDIR_LINUX_DEBUG)/ImportPreviewsModelsDialog.o $(OBJDIR_LINUX_DEBUG)/IPEntryDialog.o $(OBJDIR_LINUX_DEBUG)/GenerateLyricsDialog.o $(OBJDIR_LINUX_DEBUG)/GenerateCustomModelDialog.o $(OBJDIR_LINUX_DEBUG)/GPURenderUtils.o $(OBJDIR_LINUX_DEBUG)/FontManager.o $(OBJDIR_LINUX_DEBUG)/DimmingCurvePanel.o $(OBJDIR_LINUX_DEBUG)/DimmingCurve.o $(OBJDIR_LINUX_DEBUG)/DataLayer.o $(OBJDIR_LINUX_DEBUG)/CustomTimingDialog.o $(OBJDIR_LINUX_DEBUG)/Discovery.o $(OBJDIR_LINUX_DEBUG)/CustomModelDialog.o $(OBJDIR_LINUX_DEBUG)/CopyFormat1.o $(OBJDIR_LINUX_DEBUG)/ConvertLogDialog.o $(OBJDIR_LINUX_DEBUG)/ConvertDialog.o $(OBJDIR_LINUX_DEBUG)/EditAliasesDialog.o $(OBJDIR_LINUX_DEBUG)/EffectTimingDialog.o $(OBJDIR_LINUX_DEBUG)/EffectListDialog.o $(OBJDIR_LINUX_DEBUG)/EffectIconPanel.o $(OBJDIR_LINUX_DEBUG)/EffectAssist.o $(OBJDIR_LINUX_DEBUG)/DuplicateDialog.o $(OBJDIR_LINUX_DEBUG)/DragValueCurveBitmapButton.o $(OBJDIR_LINUX_DEBUG)/DragColoursBitmapButton.o $(OBJDIR_LINUX_DEBUG)/DissolveTransitionPattern.o $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GuitarPanel.o $(OBJDIR_LINUX_DEBUG)/effects/GuitarEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GlediatorPanel.o $(OBJDIR_LINUX_DEBUG)/effects/GlediatorEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GarlandsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/GarlandsEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyPanel.o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyEffect.o $(OBJDIR_LINUX_DEBUG)/effects/LightningPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LiquidPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LiquidEffect.o $(OBJDIR_LINUX_DEBUG)/effects/LinesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LinesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GIFImage.o $(OBJDIR_LINUX_DEBUG)/effects/LightningEffect.o $(OBJDIR_LINUX_DEBUG)/effects/LifePanel.o $(OBJDIR_LINUX_DEBUG)/effects/LifeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopePanel.o $(OBJDIR_LINUX_DEBUG)/effects/FacesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FX.o $(OBJDIR_LINUX_DEBUG)/effects/EffectPanelUtils.o $(OBJDIR_LINUX_DEBUG)/effects/EffectManager.o $(OBJDIR_LINUX_DEBUG)/effects/FacesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/DuplicatePanel.o $(OBJDIR_LINUX_DEBUG)/effects/DuplicateEffect.o $(OBJDIR_LINUX_DEBUG)/effects/DMXPanel.o $(OBJDIR_LINUX_DEBUG)/effects/DMXEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FireworksPanel.o $(OBJDIR_LINUX_DEBUG)/effects/FireworksEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FirePanel.o $(OBJDIR_LINUX_DEBUG)/effects/FireEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FillPanel.o $(OBJDIR_LINUX_DEBUG)/effects/FillEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FanPanel.o $(OBJDIR_LINUX_DEBUG)/effects/FanEffect.o $(OBJDIR_LINUX_DEBUG)/effects/RipplePanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShaderPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShaderEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ServoPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ServoEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ShapeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/RippleEffect.o $(OBJDIR_LINUX_DEBUG)/effects/RenderableEffect.o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandPanel.o $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ShockwavePanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShockwaveEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ShimmerPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShimmerEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ShapePanel.o $(OBJDIR_LINUX_DEBUG)/effects/MorphEffect.o $(OBJDIR_LINUX_DEBUG)/effects/OffEffect.o $(OBJDIR_LINUX_DEBUG)/effects/MusicPanel.o $(OBJDIR_LINUX_DEBUG)/effects/MusicEffect.o $(OBJDIR_LINUX_DEBUG)/effects/MorphPanel.o $(OBJDIR_LINUX_DEBUG)/effects/MeteorsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/MeteorsEffect.o $(OBJDIR_LINUX_DEBUG)/effects/MarqueePanel.o $(OBJDIR_LINUX_DEBUG)/effects/MarqueeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/PianoPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PinwheelPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PinwheelEffect.o $(OBJDIR_LINUX_DEBUG)/effects/PicturesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PicturesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/CurtainPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PianoEffect.o $(OBJDIR_LINUX_DEBUG)/effects/OnPanel.o $(OBJDIR_LINUX_DEBUG)/effects/OnEffect.o $(OBJDIR_LINUX_DEBUG)/effects/OffPanel.o $(OBJDIR_LINUX_DEBUG)/VideoExporter.o $(OBJDIR_LINUX_DEBUG)/ViewpointMgr.o $(OBJDIR_LINUX_DEBUG)/ViewpointDialog.o $(OBJDIR_LINUX_DEBUG)/ViewObjectPanel.o $(OBJDIR_LINUX_DEBUG)/VideoReader.o $(OBJDIR_LINUX_DEBUG)/ViewsModelsPanel.o $(OBJDIR_LINUX_DEBUG)/VendorMusicHelpers.o $(OBJDIR_LINUX_DEBUG)/VendorMusicDialog.o $(OBJDIR_LINUX_DEBUG)/VendorModelDialog.o $(OBJDIR_LINUX_DEBUG)/ValueCurvesPanel.o $(OBJDIR_LINUX_DEBUG)/automation/LuaRunner.o $(OBJDIR_LINUX_DEBUG)/cad/CADWriter.o $(OBJDIR_LINUX_DEBUG)/cad/CADModel.o $(OBJDIR_LINUX_DEBUG)/automation/xLightsAutomations.o $(OBJDIR_LINUX_DEBUG)/automation/automation.o $(OBJDIR_LINUX_DEBUG)/WiringDialog.o $(OBJDIR_LINUX_DEBUG)/VsaImportDialog.o $(OBJDIR_LINUX_DEBUG)/Vixen3.o $(OBJDIR_LINUX_DEBUG)/TabConvert.o $(OBJDIR_LINUX_DEBUG)/TopEffectsPanel.o $(OBJDIR_LINUX_DEBUG)/TipOfTheDayDialog.o $(OBJDIR_LINUX_DEBUG)/TimingPanel.o $(OBJDIR_LINUX_DEBUG)/TabSetup.o $(OBJDIR_LINUX_DEBUG)/TabSequence.o $(OBJDIR_LINUX_DEBUG)/TabPreview.o $(OBJDIR_LINUX_DEBUG)/SuperStarImportDialog.o $(OBJDIR_LINUX_DEBUG)/SubModelsDialog.o $(OBJDIR_LINUX_DEBUG)/SubModelGenerateDialog.o $(OBJDIR_LINUX_DEBUG)/SubBufferPanel.o $(OBJDIR_LINUX_DEBUG)/VAMPPluginDialog.o $(OBJDIR_LINUX_DEBUG)/ValueCurveDialog.o $(OBJDIR_LINUX_DEBUG)/ValueCurveButton.o $(OBJDIR_LINUX_DEBUG)/ValueCurve.o $(OBJDIR_LINUX_DEBUG)/VSAFile.o $(OBJDIR_LINUX_DEBUG)/UtilFunctions.o $(OBJDIR_LINUX_DEBUG)/UtilClasses.o $(OBJDIR_LINUX_DEBUG)/UpdaterDialog.o $(OBJDIR_LINUX_DEBUG)/TraceLog.o $(OBJDIR_LINUX_DEBUG)/effects/AdjustEffect.o $(OBJDIR_LINUX_DEBUG)/effects/BarsPanel.o $(OBJDIR_LINUX_DEBUG)/effects/BarsEffect.o $(OBJDIR_LINUX_DEBUG)/effects/AdjustPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyEffect.o $(OBJDIR_LINUX_DEBUG)/controllers/WebSocketClient.o $(OBJDIR_LINUX_DEBUG)/controllers/WLED.o $(OBJDIR_LINUX_DEBUG)/controllers/SanDevices.o $(OBJDIR_LINUX_DEBUG)/controllers/Pixlite16.o $(OBJDIR_LINUX_DEBUG)/effects/CurtainEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashPanel.o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashEffect.o $(OBJDIR_LINUX_DEBUG)/effects/CirclesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/CirclesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/CandlePanel.o $(OBJDIR_LINUX_DEBUG)/effects/CandleEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyPanel.o $(OBJDIR_LINUX_DEBUG)/controllers/AlphaPix.o $(OBJDIR_LINUX_DEBUG)/controllers/ESPixelStick.o $(OBJDIR_LINUX_DEBUG)/controllers/ControllerUploadData.o $(OBJDIR_LINUX_DEBUG)/controllers/ControllerCaps.o $(OBJDIR_LINUX_DEBUG)/controllers/BaseController.o $(OBJDIR_LINUX_DEBUG)/cad/VRMLWriter.o $(OBJDIR_LINUX_DEBUG)/cad/STLWriter.o $(OBJDIR_LINUX_DEBUG)/cad/ModelToCAD.o $(OBJDIR_LINUX_DEBUG)/cad/DXFWriter.o $(OBJDIR_LINUX_DEBUG)/controllers/Falcon.o $(OBJDIR_LINUX_DEBUG)/controllers/Minleon.o $(OBJDIR_LINUX_DEBUG)/controllers/J1Sys.o $(OBJDIR_LINUX_DEBUG)/controllers/HinksPixExportDialog.o $(OBJDIR_LINUX_DEBUG)/controllers/HinksPix.o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o $(OBJDIR_LINUX_DEBUG)/controllers/FPPUploadProgressDialog.o $(OBJDIR_LINUX_DEBUG)/controllers/FPPConnectDialog.o $(OBJDIR_LINUX_DEBUG)/controllers/FPP.o $(OBJDIR_LINUX_DEBUG)/controllers/Experience.o -OBJ_LINUX_RELEASE = $(OBJDIR_LINUX_RELEASE)/models/SpinnerModel.o $(OBJDIR_LINUX_RELEASE)/models/TerrianObject.o $(OBJDIR_LINUX_RELEASE)/models/TerrainScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/SubModel.o $(OBJDIR_LINUX_RELEASE)/models/StarModel.o $(OBJDIR_LINUX_RELEASE)/models/SphereModel.o $(OBJDIR_LINUX_RELEASE)/models/SingleLineModel.o $(OBJDIR_LINUX_RELEASE)/models/Shapes.o $(OBJDIR_LINUX_RELEASE)/models/RulerObject.o $(OBJDIR_LINUX_RELEASE)/models/ViewObjectManager.o $(OBJDIR_LINUX_RELEASE)/outputs/ArtNetOutput.o $(OBJDIR_LINUX_RELEASE)/models/WreathModel.o $(OBJDIR_LINUX_RELEASE)/models/WindowFrameModel.o $(OBJDIR_LINUX_RELEASE)/models/WholeHouseModel.o $(OBJDIR_LINUX_RELEASE)/models/ViewObject.o $(OBJDIR_LINUX_RELEASE)/models/TwoPointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/TreeModel.o $(OBJDIR_LINUX_RELEASE)/models/ThreePointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/ImageModel.o $(OBJDIR_LINUX_RELEASE)/models/Model.o $(OBJDIR_LINUX_RELEASE)/models/MeshObject.o $(OBJDIR_LINUX_RELEASE)/models/MatrixModel.o $(OBJDIR_LINUX_RELEASE)/models/ImageObject.o $(OBJDIR_LINUX_RELEASE)/models/IciclesModel.o $(OBJDIR_LINUX_RELEASE)/models/GridlinesObject.o $(OBJDIR_LINUX_RELEASE)/models/DMX/SkullConfigDialog.o $(OBJDIR_LINUX_RELEASE)/models/MultiPointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/PolyPointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/PolyLineModel.o $(OBJDIR_LINUX_RELEASE)/models/ObjectManager.o $(OBJDIR_LINUX_RELEASE)/models/Node.o $(OBJDIR_LINUX_RELEASE)/models/MultiPointModel.o $(OBJDIR_LINUX_RELEASE)/models/ModelScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/ModelManager.o $(OBJDIR_LINUX_RELEASE)/models/ModelGroup.o $(OBJDIR_LINUX_RELEASE)/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/TwinklyOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/TestPreset.o $(OBJDIR_LINUX_RELEASE)/outputs/SerialOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/ZCPPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/PixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/OutputManager.o $(OBJDIR_LINUX_RELEASE)/outputs/Output.o $(OBJDIR_LINUX_RELEASE)/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/preferences/OtherSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/EffectsGridSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/ColorManagerSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/CheckSequenceSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/BackupSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/serial.o $(OBJDIR_LINUX_RELEASE)/outputs/DDPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/E131Output.o $(OBJDIR_LINUX_RELEASE)/outputs/DMXOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerSerial.o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerNull.o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerEthernet.o $(OBJDIR_LINUX_RELEASE)/outputs/Controller.o $(OBJDIR_LINUX_RELEASE)/outputs/LorController.o $(OBJDIR_LINUX_RELEASE)/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/OPCOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/NullOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/LorControllers.o $(OBJDIR_LINUX_RELEASE)/models/DMX/ServoConfigDialog.o $(OBJDIR_LINUX_RELEASE)/outputs/LOROutput.o $(OBJDIR_LINUX_RELEASE)/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/KinetOutput.o $(OBJDIR_LINUX_RELEASE)/effects/WarpPanel.o $(OBJDIR_LINUX_RELEASE)/effects/WarpEffect.o $(OBJDIR_LINUX_RELEASE)/effects/VideoPanel.o $(OBJDIR_LINUX_RELEASE)/effects/VideoEffect.o $(OBJDIR_LINUX_RELEASE)/effects/WaveEffect.o $(OBJDIR_LINUX_RELEASE)/effects/VUMeterPanel.o $(OBJDIR_LINUX_RELEASE)/effects/VUMeterEffect.o $(OBJDIR_LINUX_RELEASE)/effects/TwinklePanel.o $(OBJDIR_LINUX_RELEASE)/effects/TwinkleEffect.o $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasPictures.o $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasMorph.o $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasEmpty.o $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchCanvasPanel.o $(OBJDIR_LINUX_RELEASE)/effects/TreePanel.o $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchAssistPanel.o $(OBJDIR_LINUX_RELEASE)/effects/assist/PicturesAssistPanel.o $(OBJDIR_LINUX_RELEASE)/effects/assist/AssistPanel.o $(OBJDIR_LINUX_RELEASE)/effects/WavePanel.o $(OBJDIR_LINUX_RELEASE)/effects/SpiralsEffect.o $(OBJDIR_LINUX_RELEASE)/effects/StateEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SpirographPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SpirographEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SpiralsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SnowstormPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SnowstormEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SnowflakesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SnowflakesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/TreeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/TextPanel.o $(OBJDIR_LINUX_RELEASE)/effects/TextEffect.o $(OBJDIR_LINUX_RELEASE)/effects/TendrilPanel.o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/DrawGLUtils.o $(OBJDIR_LINUX_RELEASE)/effects/TendrilEffect.o $(OBJDIR_LINUX_RELEASE)/effects/StrobePanel.o $(OBJDIR_LINUX_RELEASE)/effects/StrobeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/StatePanel.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxMovingHead3D.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxMovingHead.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxModel.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxImage.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxPanTiltAbility.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxGeneral.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxFloodlight.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxFloodArea.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbilityWheel.o $(OBJDIR_LINUX_RELEASE)/models/DMX/Servo.o $(OBJDIR_LINUX_RELEASE)/models/DMX/Mesh.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxSkulltronix.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxSkull.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbilityRGB.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxShutterAbility.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxServo3D.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxServo.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxPresetAbility.o $(OBJDIR_LINUX_RELEASE)/models/ArchesModel.o $(OBJDIR_LINUX_RELEASE)/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_RELEASE)/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_RELEASE)/graphics/xlMesh.o $(OBJDIR_LINUX_RELEASE)/models/BaseObject.o $(OBJDIR_LINUX_RELEASE)/graphics/xlGraphicsAccumulators.o $(OBJDIR_LINUX_RELEASE)/graphics/xlFontInfo.o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/xlOGL3GraphicsContext.o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/xlGLCanvas.o $(OBJDIR_LINUX_RELEASE)/models/CircleModel.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbilityCMY.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbility.o $(OBJDIR_LINUX_RELEASE)/models/CustomModel.o $(OBJDIR_LINUX_RELEASE)/models/CubeModel.o $(OBJDIR_LINUX_RELEASE)/preferences/OutputSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/models/ChannelBlockModel.o $(OBJDIR_LINUX_RELEASE)/models/CandyCaneModel.o $(OBJDIR_LINUX_RELEASE)/models/BoxedScreenLocation.o $(OBJDIR_LINUX_RELEASE)/xLightsMain.o $(OBJDIR_LINUX_RELEASE)/xLightsImportChannelMapDialog.o $(OBJDIR_LINUX_RELEASE)/xLightsApp.o $(OBJDIR_LINUX_RELEASE)/xLightsTimer.o $(OBJDIR_LINUX_RELEASE)/xlColorPickerFields.o $(OBJDIR_LINUX_RELEASE)/xlSlider.o $(OBJDIR_LINUX_RELEASE)/xlLockButton.o $(OBJDIR_LINUX_RELEASE)/xlGridCanvas.o $(OBJDIR_LINUX_RELEASE)/xlColorPicker.o $(OBJDIR_LINUX_RELEASE)/xlColorCanvas.o $(OBJDIR_LINUX_RELEASE)/xLightsXmlFile.o $(OBJDIR_LINUX_RELEASE)/xLightsVersion.o $(OBJDIR_LINUX_RELEASE)/tmGridCell.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/Files.o $(OBJDIR_LINUX_RELEASE)/utils/string_utils.o $(OBJDIR_LINUX_RELEASE)/utils/ip_utils.o $(OBJDIR_LINUX_RELEASE)/utils/Curl.o $(OBJDIR_LINUX_RELEASE)/support/VectorMath.o $(OBJDIR_LINUX_RELEASE)/support/GridCellChoiceRenderer.o $(OBJDIR_LINUX_RELEASE)/support/FastComboEditor.o $(OBJDIR_LINUX_RELEASE)/support/EzGrid.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginSummarisingAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectLayer.o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectDropTarget.o $(OBJDIR_LINUX_RELEASE)/sequencer/Effect.o $(OBJDIR_LINUX_RELEASE)/sequencer/DragEffectBitmapButton.o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectsGrid.o $(OBJDIR_LINUX_RELEASE)/preferences/xLightsPreferences.o $(OBJDIR_LINUX_RELEASE)/preferences/ViewSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/SequenceFileSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/RandomEffectsSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/sequencer/SequenceElements.o $(OBJDIR_LINUX_RELEASE)/sequencer/tabSequencer.o $(OBJDIR_LINUX_RELEASE)/sequencer/Waveform.o $(OBJDIR_LINUX_RELEASE)/sequencer/UndoManager.o $(OBJDIR_LINUX_RELEASE)/sequencer/TimeLine.o $(OBJDIR_LINUX_RELEASE)/sequencer/RowHeading.o $(OBJDIR_LINUX_RELEASE)/sequencer/MainSequencer.o $(OBJDIR_LINUX_RELEASE)/sequencer/Element.o $(OBJDIR_LINUX_RELEASE)/wxModelGridCellRenderer.o $(OBJDIR_LINUX_RELEASE)/wxCheckedListCtrl.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/host-c.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/acsymbols.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_RELEASE)/MultiControllerUploadDialog.o $(OBJDIR_LINUX_RELEASE)/Mouse3DManager.o $(OBJDIR_LINUX_RELEASE)/ModelStateDialog.o $(OBJDIR_LINUX_RELEASE)/ModelRemap.o $(OBJDIR_LINUX_RELEASE)/MusicXML.o $(OBJDIR_LINUX_RELEASE)/ModelPreview.o $(OBJDIR_LINUX_RELEASE)/ModelGroupPanel.o $(OBJDIR_LINUX_RELEASE)/ModelFaceDialog.o $(OBJDIR_LINUX_RELEASE)/ModelDimmingCurveDialog.o $(OBJDIR_LINUX_RELEASE)/PaletteMgmtDialog.o $(OBJDIR_LINUX_RELEASE)/OutputModelManager.o $(OBJDIR_LINUX_RELEASE)/OptionChooser.o $(OBJDIR_LINUX_RELEASE)/OpenGLShaders.o $(OBJDIR_LINUX_RELEASE)/NoteRangeDialog.o $(OBJDIR_LINUX_RELEASE)/ModelChainDialog.o $(OBJDIR_LINUX_RELEASE)/NoteImportDialog.o $(OBJDIR_LINUX_RELEASE)/NodesGridCellEditor.o $(OBJDIR_LINUX_RELEASE)/NodeSelectGrid.o $(OBJDIR_LINUX_RELEASE)/NewTimingDialog.o $(OBJDIR_LINUX_RELEASE)/LORPreview.o $(OBJDIR_LINUX_RELEASE)/LayoutUtils.o $(OBJDIR_LINUX_RELEASE)/LayoutPanel.o $(OBJDIR_LINUX_RELEASE)/LayoutGroup.o $(OBJDIR_LINUX_RELEASE)/LayerSelectDialog.o $(OBJDIR_LINUX_RELEASE)/LOREdit.o $(OBJDIR_LINUX_RELEASE)/LMSImportChannelMapDialog.o $(OBJDIR_LINUX_RELEASE)/KeyBindings.o $(OBJDIR_LINUX_RELEASE)/KeyBindingEditDialog.o $(OBJDIR_LINUX_RELEASE)/MIDI/Binasc.o $(OBJDIR_LINUX_RELEASE)/MediaImportOptionsDialog.o $(OBJDIR_LINUX_RELEASE)/MatrixFaceDownloadDialog.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiMessage.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiFile.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiEventList.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiEvent.o $(OBJDIR_LINUX_RELEASE)/LyricsDialog.o $(OBJDIR_LINUX_RELEASE)/LyricUserDictDialog.o $(OBJDIR_LINUX_RELEASE)/LorConvertDialog.o $(OBJDIR_LINUX_RELEASE)/LinkJukeboxButtonDialog.o $(OBJDIR_LINUX_RELEASE)/SeqElementMismatchDialog.o $(OBJDIR_LINUX_RELEASE)/SequenceData.o $(OBJDIR_LINUX_RELEASE)/SeqSettingsDialog.o $(OBJDIR_LINUX_RELEASE)/SeqFileUtilities.o $(OBJDIR_LINUX_RELEASE)/SeqExportDialog.o $(OBJDIR_LINUX_RELEASE)/SelectTimingsDialog.o $(OBJDIR_LINUX_RELEASE)/SelectPanel.o $(OBJDIR_LINUX_RELEASE)/SearchPanel.o $(OBJDIR_LINUX_RELEASE)/ScriptsDialog.o $(OBJDIR_LINUX_RELEASE)/SevenSegmentDialog.o $(OBJDIR_LINUX_RELEASE)/StrandNodeNamesDialog.o $(OBJDIR_LINUX_RELEASE)/StartChannelDialog.o $(OBJDIR_LINUX_RELEASE)/SplashDialog.o $(OBJDIR_LINUX_RELEASE)/ShaderDownloadDialog.o $(OBJDIR_LINUX_RELEASE)/SequenceViewManager.o $(OBJDIR_LINUX_RELEASE)/SequenceVideoPreview.o $(OBJDIR_LINUX_RELEASE)/SequenceVideoPanel.o $(OBJDIR_LINUX_RELEASE)/SequencePackage.o $(OBJDIR_LINUX_RELEASE)/PixelBuffer.o $(OBJDIR_LINUX_RELEASE)/RemapDMXChannelsDialog.o $(OBJDIR_LINUX_RELEASE)/PreviewPane.o $(OBJDIR_LINUX_RELEASE)/Pixels.o $(OBJDIR_LINUX_RELEASE)/PixelTestDialog.o $(OBJDIR_LINUX_RELEASE)/PhonemeDictionary.o $(OBJDIR_LINUX_RELEASE)/PerspectivesPanel.o $(OBJDIR_LINUX_RELEASE)/PathGenerationDialog.o $(OBJDIR_LINUX_RELEASE)/Parallel.o $(OBJDIR_LINUX_RELEASE)/SaveChangesDialog.o $(OBJDIR_LINUX_RELEASE)/RestoreBackupDialog.o $(OBJDIR_LINUX_RELEASE)/ResizeImageDialog.o $(OBJDIR_LINUX_RELEASE)/RenderProgressDialog.o $(OBJDIR_LINUX_RELEASE)/RenderCache.o $(OBJDIR_LINUX_RELEASE)/RenderBuffer.o $(OBJDIR_LINUX_RELEASE)/Render.o $(OBJDIR_LINUX_RELEASE)/RenameTextDialog.o $(OBJDIR_LINUX_RELEASE)/BulkEditFontPickerDialog.o $(OBJDIR_LINUX_RELEASE)/CharMapDialog.o $(OBJDIR_LINUX_RELEASE)/ChannelLayoutDialog.o $(OBJDIR_LINUX_RELEASE)/CachedFileDownloader.o $(OBJDIR_LINUX_RELEASE)/BulkEditSliderDialog.o $(OBJDIR_LINUX_RELEASE)/BulkEditControls.o $(OBJDIR_LINUX_RELEASE)/BulkEditComboDialog.o $(OBJDIR_LINUX_RELEASE)/BulkEditColourPickerDialog.o $(OBJDIR_LINUX_RELEASE)/BufferSizeDialog.o $(OBJDIR_LINUX_RELEASE)/ControllerConnectionDialog.o $(OBJDIR_LINUX_RELEASE)/ColoursPanel.o $(OBJDIR_LINUX_RELEASE)/ColourReplaceDialog.o $(OBJDIR_LINUX_RELEASE)/ColorPanel.o $(OBJDIR_LINUX_RELEASE)/ColorManager.o $(OBJDIR_LINUX_RELEASE)/ColorCurveDialog.o $(OBJDIR_LINUX_RELEASE)/ColorCurve.o $(OBJDIR_LINUX_RELEASE)/Color.o $(OBJDIR_LINUX_RELEASE)/CheckboxSelectDialog.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/message.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/status.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/sha1.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/server.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/response.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/request.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/pages.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/context.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/connection.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/md5.o $(OBJDIR_LINUX_RELEASE)/__/xFade/wxLED.o $(OBJDIR_LINUX_RELEASE)/BufferPanel.o $(OBJDIR_LINUX_RELEASE)/BitmapCache.o $(OBJDIR_LINUX_RELEASE)/BatchRenderDialog.o $(OBJDIR_LINUX_RELEASE)/AudioManager.o $(OBJDIR_LINUX_RELEASE)/AlignmentDialog.o $(OBJDIR_LINUX_RELEASE)/ControllerModelDialog.o $(OBJDIR_LINUX_RELEASE)/AboutDialog.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_RELEASE)/FlickerFreeBitmapButton.o $(OBJDIR_LINUX_RELEASE)/FindDataPanel.o $(OBJDIR_LINUX_RELEASE)/FileConverter.o $(OBJDIR_LINUX_RELEASE)/FSEQFile.o $(OBJDIR_LINUX_RELEASE)/FontManager.o $(OBJDIR_LINUX_RELEASE)/ExportSettings.o $(OBJDIR_LINUX_RELEASE)/ExportModelSelect.o $(OBJDIR_LINUX_RELEASE)/EmailDialog.o $(OBJDIR_LINUX_RELEASE)/EffectsPanel.o $(OBJDIR_LINUX_RELEASE)/JukeboxPanel.o $(OBJDIR_LINUX_RELEASE)/JobPool.o $(OBJDIR_LINUX_RELEASE)/ImportPreviewsModelsDialog.o $(OBJDIR_LINUX_RELEASE)/IPEntryDialog.o $(OBJDIR_LINUX_RELEASE)/EffectTreeDialog.o $(OBJDIR_LINUX_RELEASE)/HousePreviewPanel.o $(OBJDIR_LINUX_RELEASE)/GenerateLyricsDialog.o $(OBJDIR_LINUX_RELEASE)/GenerateCustomModelDialog.o $(OBJDIR_LINUX_RELEASE)/GPURenderUtils.o $(OBJDIR_LINUX_RELEASE)/DimmingCurvePanel.o $(OBJDIR_LINUX_RELEASE)/DimmingCurve.o $(OBJDIR_LINUX_RELEASE)/DataLayer.o $(OBJDIR_LINUX_RELEASE)/CustomTimingDialog.o $(OBJDIR_LINUX_RELEASE)/Discovery.o $(OBJDIR_LINUX_RELEASE)/CustomModelDialog.o $(OBJDIR_LINUX_RELEASE)/CopyFormat1.o $(OBJDIR_LINUX_RELEASE)/ConvertLogDialog.o $(OBJDIR_LINUX_RELEASE)/ConvertDialog.o $(OBJDIR_LINUX_RELEASE)/EffectTimingDialog.o $(OBJDIR_LINUX_RELEASE)/EffectListDialog.o $(OBJDIR_LINUX_RELEASE)/EffectIconPanel.o $(OBJDIR_LINUX_RELEASE)/EffectAssist.o $(OBJDIR_LINUX_RELEASE)/DuplicateDialog.o $(OBJDIR_LINUX_RELEASE)/DragValueCurveBitmapButton.o $(OBJDIR_LINUX_RELEASE)/DragColoursBitmapButton.o $(OBJDIR_LINUX_RELEASE)/DissolveTransitionPattern.o $(OBJDIR_LINUX_RELEASE)/effects/LifeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopePanel.o $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GuitarPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LifePanel.o $(OBJDIR_LINUX_RELEASE)/effects/GuitarEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GlediatorPanel.o $(OBJDIR_LINUX_RELEASE)/effects/GlediatorEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GarlandsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/MarqueePanel.o $(OBJDIR_LINUX_RELEASE)/effects/MarqueeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/LiquidPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LiquidEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GarlandsEffect.o $(OBJDIR_LINUX_RELEASE)/effects/LinesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LinesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/LightningPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LightningEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FacesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FillEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FanPanel.o $(OBJDIR_LINUX_RELEASE)/effects/FanEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FacesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/FX.o $(OBJDIR_LINUX_RELEASE)/effects/EffectPanelUtils.o $(OBJDIR_LINUX_RELEASE)/effects/EffectManager.o $(OBJDIR_LINUX_RELEASE)/effects/DMXPanel.o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyPanel.o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GIFImage.o $(OBJDIR_LINUX_RELEASE)/effects/FireworksPanel.o $(OBJDIR_LINUX_RELEASE)/effects/MeteorsEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FireworksEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FirePanel.o $(OBJDIR_LINUX_RELEASE)/effects/FireEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FillPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ServoPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShapePanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShapeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ShaderPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShaderEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ServoEffect.o $(OBJDIR_LINUX_RELEASE)/effects/RipplePanel.o $(OBJDIR_LINUX_RELEASE)/effects/RippleEffect.o $(OBJDIR_LINUX_RELEASE)/effects/RenderableEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SketchPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffectDrawing.o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShockwavePanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShockwaveEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ShimmerPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShimmerEffect.o $(OBJDIR_LINUX_RELEASE)/effects/OnEffect.o $(OBJDIR_LINUX_RELEASE)/effects/OffPanel.o $(OBJDIR_LINUX_RELEASE)/effects/OffEffect.o $(OBJDIR_LINUX_RELEASE)/effects/MusicPanel.o $(OBJDIR_LINUX_RELEASE)/effects/OnPanel.o $(OBJDIR_LINUX_RELEASE)/effects/MusicEffect.o $(OBJDIR_LINUX_RELEASE)/effects/MorphPanel.o $(OBJDIR_LINUX_RELEASE)/effects/MorphEffect.o $(OBJDIR_LINUX_RELEASE)/effects/MeteorsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PicturesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaEffect.o $(OBJDIR_LINUX_RELEASE)/effects/PinwheelPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PinwheelEffect.o $(OBJDIR_LINUX_RELEASE)/effects/PicturesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/PianoPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PianoEffect.o $(OBJDIR_LINUX_RELEASE)/ViewpointDialog.o $(OBJDIR_LINUX_RELEASE)/ViewObjectPanel.o $(OBJDIR_LINUX_RELEASE)/VideoReader.o $(OBJDIR_LINUX_RELEASE)/VideoExporter.o $(OBJDIR_LINUX_RELEASE)/ViewpointMgr.o $(OBJDIR_LINUX_RELEASE)/VendorMusicHelpers.o $(OBJDIR_LINUX_RELEASE)/VendorMusicDialog.o $(OBJDIR_LINUX_RELEASE)/VendorModelDialog.o $(OBJDIR_LINUX_RELEASE)/ValueCurvesPanel.o $(OBJDIR_LINUX_RELEASE)/cad/CADModel.o $(OBJDIR_LINUX_RELEASE)/automation/xLightsAutomations.o $(OBJDIR_LINUX_RELEASE)/automation/automation.o $(OBJDIR_LINUX_RELEASE)/automation/LuaRunner.o $(OBJDIR_LINUX_RELEASE)/ValueCurveDialog.o $(OBJDIR_LINUX_RELEASE)/WiringDialog.o $(OBJDIR_LINUX_RELEASE)/VsaImportDialog.o $(OBJDIR_LINUX_RELEASE)/Vixen3.o $(OBJDIR_LINUX_RELEASE)/ViewsModelsPanel.o $(OBJDIR_LINUX_RELEASE)/TabConvert.o $(OBJDIR_LINUX_RELEASE)/TopEffectsPanel.o $(OBJDIR_LINUX_RELEASE)/TipOfTheDayDialog.o $(OBJDIR_LINUX_RELEASE)/TimingPanel.o $(OBJDIR_LINUX_RELEASE)/TabSetup.o $(OBJDIR_LINUX_RELEASE)/TabSequence.o $(OBJDIR_LINUX_RELEASE)/TabPreview.o $(OBJDIR_LINUX_RELEASE)/SuperStarImportDialog.o $(OBJDIR_LINUX_RELEASE)/SubModelsDialog.o $(OBJDIR_LINUX_RELEASE)/SubModelGenerateDialog.o $(OBJDIR_LINUX_RELEASE)/SubBufferPanel.o $(OBJDIR_LINUX_RELEASE)/ValueCurveButton.o $(OBJDIR_LINUX_RELEASE)/ValueCurve.o $(OBJDIR_LINUX_RELEASE)/VSAFile.o $(OBJDIR_LINUX_RELEASE)/VAMPPluginDialog.o $(OBJDIR_LINUX_RELEASE)/UtilFunctions.o $(OBJDIR_LINUX_RELEASE)/UtilClasses.o $(OBJDIR_LINUX_RELEASE)/UpdaterDialog.o $(OBJDIR_LINUX_RELEASE)/TraceLog.o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyEffect.o $(OBJDIR_LINUX_RELEASE)/effects/BarsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/BarsEffect.o $(OBJDIR_LINUX_RELEASE)/controllers/WebSocketClient.o $(OBJDIR_LINUX_RELEASE)/controllers/WLED.o $(OBJDIR_LINUX_RELEASE)/controllers/SanDevices.o $(OBJDIR_LINUX_RELEASE)/controllers/Pixlite16.o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashEffect.o $(OBJDIR_LINUX_RELEASE)/effects/DMXEffect.o $(OBJDIR_LINUX_RELEASE)/effects/CurtainPanel.o $(OBJDIR_LINUX_RELEASE)/effects/CurtainEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashPanel.o $(OBJDIR_LINUX_RELEASE)/controllers/Minleon.o $(OBJDIR_LINUX_RELEASE)/effects/CirclesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/CirclesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/CandlePanel.o $(OBJDIR_LINUX_RELEASE)/effects/CandleEffect.o $(OBJDIR_LINUX_RELEASE)/cad/VRMLWriter.o $(OBJDIR_LINUX_RELEASE)/controllers/ControllerUploadData.o $(OBJDIR_LINUX_RELEASE)/controllers/ControllerCaps.o $(OBJDIR_LINUX_RELEASE)/controllers/BaseController.o $(OBJDIR_LINUX_RELEASE)/controllers/AlphaPix.o $(OBJDIR_LINUX_RELEASE)/cad/STLWriter.o $(OBJDIR_LINUX_RELEASE)/cad/ModelToCAD.o $(OBJDIR_LINUX_RELEASE)/cad/DXFWriter.o $(OBJDIR_LINUX_RELEASE)/cad/CADWriter.o $(OBJDIR_LINUX_RELEASE)/controllers/J1Sys.o $(OBJDIR_LINUX_RELEASE)/controllers/HinksPixExportDialog.o $(OBJDIR_LINUX_RELEASE)/controllers/HinksPix.o $(OBJDIR_LINUX_RELEASE)/controllers/Falcon.o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o $(OBJDIR_LINUX_RELEASE)/controllers/FPPConnectDialog.o $(OBJDIR_LINUX_RELEASE)/controllers/FPP.o $(OBJDIR_LINUX_RELEASE)/controllers/Experience.o $(OBJDIR_LINUX_RELEASE)/controllers/ESPixelStick.o +OBJ_LINUX_RELEASE = $(OBJDIR_LINUX_RELEASE)/models/SpinnerModel.o $(OBJDIR_LINUX_RELEASE)/models/TerrianObject.o $(OBJDIR_LINUX_RELEASE)/models/TerrainScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/SubModel.o $(OBJDIR_LINUX_RELEASE)/models/StarModel.o $(OBJDIR_LINUX_RELEASE)/models/ThreePointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/SphereModel.o $(OBJDIR_LINUX_RELEASE)/models/SingleLineModel.o $(OBJDIR_LINUX_RELEASE)/models/Shapes.o $(OBJDIR_LINUX_RELEASE)/models/RulerObject.o $(OBJDIR_LINUX_RELEASE)/outputs/ArtNetOutput.o $(OBJDIR_LINUX_RELEASE)/models/WreathModel.o $(OBJDIR_LINUX_RELEASE)/models/WindowFrameModel.o $(OBJDIR_LINUX_RELEASE)/models/WholeHouseModel.o $(OBJDIR_LINUX_RELEASE)/models/ViewObjectManager.o $(OBJDIR_LINUX_RELEASE)/models/ViewObject.o $(OBJDIR_LINUX_RELEASE)/models/TwoPointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/TreeModel.o $(OBJDIR_LINUX_RELEASE)/models/ImageModel.o $(OBJDIR_LINUX_RELEASE)/models/Model.o $(OBJDIR_LINUX_RELEASE)/models/MeshObject.o $(OBJDIR_LINUX_RELEASE)/models/MatrixModel.o $(OBJDIR_LINUX_RELEASE)/models/ImageObject.o $(OBJDIR_LINUX_RELEASE)/models/IciclesModel.o $(OBJDIR_LINUX_RELEASE)/models/GridlinesObject.o $(OBJDIR_LINUX_RELEASE)/models/DMX/SkullConfigDialog.o $(OBJDIR_LINUX_RELEASE)/models/MultiPointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/PolyPointScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/PolyLineModel.o $(OBJDIR_LINUX_RELEASE)/models/ObjectManager.o $(OBJDIR_LINUX_RELEASE)/models/Node.o $(OBJDIR_LINUX_RELEASE)/outputs/Controller.o $(OBJDIR_LINUX_RELEASE)/models/MultiPointModel.o $(OBJDIR_LINUX_RELEASE)/models/ModelScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/ModelManager.o $(OBJDIR_LINUX_RELEASE)/models/ModelGroup.o $(OBJDIR_LINUX_RELEASE)/outputs/SerialOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/serial.o $(OBJDIR_LINUX_RELEASE)/outputs/ZCPPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/TwinklyOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/TestPreset.o $(OBJDIR_LINUX_RELEASE)/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/PixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/OutputManager.o $(OBJDIR_LINUX_RELEASE)/outputs/Output.o $(OBJDIR_LINUX_RELEASE)/preferences/ColorManagerSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/RandomEffectsSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/OutputSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/OtherSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/EffectsGridSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/CheckSequenceSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/BackupSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/E131Output.o $(OBJDIR_LINUX_RELEASE)/outputs/DMXOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/DDPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerSerial.o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerNull.o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerEthernet.o $(OBJDIR_LINUX_RELEASE)/outputs/LorControllers.o $(OBJDIR_LINUX_RELEASE)/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/OPCOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/NullOutput.o $(OBJDIR_LINUX_RELEASE)/models/DMX/ServoConfigDialog.o $(OBJDIR_LINUX_RELEASE)/outputs/LorController.o $(OBJDIR_LINUX_RELEASE)/outputs/LOROutput.o $(OBJDIR_LINUX_RELEASE)/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/KinetOutput.o $(OBJDIR_LINUX_RELEASE)/effects/WarpPanel.o $(OBJDIR_LINUX_RELEASE)/effects/WarpEffect.o $(OBJDIR_LINUX_RELEASE)/effects/VideoPanel.o $(OBJDIR_LINUX_RELEASE)/effects/VideoEffect.o $(OBJDIR_LINUX_RELEASE)/effects/VUMeterPanel.o $(OBJDIR_LINUX_RELEASE)/effects/VUMeterEffect.o $(OBJDIR_LINUX_RELEASE)/effects/TwinklePanel.o $(OBJDIR_LINUX_RELEASE)/effects/TwinkleEffect.o $(OBJDIR_LINUX_RELEASE)/effects/TreePanel.o $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchAssistPanel.o $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasPictures.o $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasMorph.o $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasEmpty.o $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchCanvasPanel.o $(OBJDIR_LINUX_RELEASE)/effects/TreeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/assist/PicturesAssistPanel.o $(OBJDIR_LINUX_RELEASE)/effects/assist/AssistPanel.o $(OBJDIR_LINUX_RELEASE)/effects/WavePanel.o $(OBJDIR_LINUX_RELEASE)/effects/WaveEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SpirographEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SpiralsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SpiralsEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SnowstormPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SpirographPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SnowstormEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SnowflakesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SnowflakesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SketchPanel.o $(OBJDIR_LINUX_RELEASE)/effects/TextPanel.o $(OBJDIR_LINUX_RELEASE)/effects/TextEffect.o $(OBJDIR_LINUX_RELEASE)/effects/TendrilPanel.o $(OBJDIR_LINUX_RELEASE)/effects/TendrilEffect.o $(OBJDIR_LINUX_RELEASE)/effects/StrobePanel.o $(OBJDIR_LINUX_RELEASE)/effects/StrobeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/StatePanel.o $(OBJDIR_LINUX_RELEASE)/effects/StateEffect.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxMovingHead3D.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxMovingHead.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxModel.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxImage.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxPanTiltAbility.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxGeneral.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxFloodlight.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxFloodArea.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbilityWheel.o $(OBJDIR_LINUX_RELEASE)/models/DMX/Servo.o $(OBJDIR_LINUX_RELEASE)/models/DMX/Mesh.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxSkulltronix.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxSkull.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbilityRGB.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxShutterAbility.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxServo3D.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxServo.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxPresetAbility.o $(OBJDIR_LINUX_RELEASE)/graphics/xlGraphicsAccumulators.o $(OBJDIR_LINUX_RELEASE)/models/ArchesModel.o $(OBJDIR_LINUX_RELEASE)/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_RELEASE)/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_RELEASE)/graphics/xlMesh.o $(OBJDIR_LINUX_RELEASE)/graphics/xlFontInfo.o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/xlOGL3GraphicsContext.o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/xlGLCanvas.o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/DrawGLUtils.o $(OBJDIR_LINUX_RELEASE)/models/CircleModel.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbilityCMY.o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxColorAbility.o $(OBJDIR_LINUX_RELEASE)/models/CustomModel.o $(OBJDIR_LINUX_RELEASE)/models/CubeModel.o $(OBJDIR_LINUX_RELEASE)/models/ChannelBlockModel.o $(OBJDIR_LINUX_RELEASE)/models/CandyCaneModel.o $(OBJDIR_LINUX_RELEASE)/models/BoxedScreenLocation.o $(OBJDIR_LINUX_RELEASE)/models/BaseObject.o $(OBJDIR_LINUX_RELEASE)/xLightsMain.o $(OBJDIR_LINUX_RELEASE)/xLightsImportChannelMapDialog.o $(OBJDIR_LINUX_RELEASE)/xLightsApp.o $(OBJDIR_LINUX_RELEASE)/xLightsTimer.o $(OBJDIR_LINUX_RELEASE)/xlColorPickerFields.o $(OBJDIR_LINUX_RELEASE)/xlSlider.o $(OBJDIR_LINUX_RELEASE)/xlLockButton.o $(OBJDIR_LINUX_RELEASE)/xlGridCanvas.o $(OBJDIR_LINUX_RELEASE)/xlColorPicker.o $(OBJDIR_LINUX_RELEASE)/xlColorCanvas.o $(OBJDIR_LINUX_RELEASE)/xLightsXmlFile.o $(OBJDIR_LINUX_RELEASE)/xLightsVersion.o $(OBJDIR_LINUX_RELEASE)/utils/CurlManager.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/Files.o $(OBJDIR_LINUX_RELEASE)/utils/string_utils.o $(OBJDIR_LINUX_RELEASE)/utils/ip_utils.o $(OBJDIR_LINUX_RELEASE)/utils/Curl.o $(OBJDIR_LINUX_RELEASE)/tmGridCell.o $(OBJDIR_LINUX_RELEASE)/support/VectorMath.o $(OBJDIR_LINUX_RELEASE)/support/GridCellChoiceRenderer.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginSummarisingAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_RELEASE)/sequencer/Effect.o $(OBJDIR_LINUX_RELEASE)/sequencer/Element.o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectsGrid.o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectLayer.o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectDropTarget.o $(OBJDIR_LINUX_RELEASE)/sequencer/DragEffectBitmapButton.o $(OBJDIR_LINUX_RELEASE)/preferences/xLightsPreferences.o $(OBJDIR_LINUX_RELEASE)/preferences/ViewSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/SequenceFileSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/sequencer/UndoManager.o $(OBJDIR_LINUX_RELEASE)/support/FastComboEditor.o $(OBJDIR_LINUX_RELEASE)/support/EzGrid.o $(OBJDIR_LINUX_RELEASE)/sequencer/tabSequencer.o $(OBJDIR_LINUX_RELEASE)/sequencer/Waveform.o $(OBJDIR_LINUX_RELEASE)/sequencer/TimeLine.o $(OBJDIR_LINUX_RELEASE)/sequencer/SequenceElements.o $(OBJDIR_LINUX_RELEASE)/sequencer/RowHeading.o $(OBJDIR_LINUX_RELEASE)/sequencer/MainSequencer.o $(OBJDIR_LINUX_RELEASE)/wxCheckedListCtrl.o $(OBJDIR_LINUX_RELEASE)/wxWEBPHandler/imagwebp.o $(OBJDIR_LINUX_RELEASE)/wxModelGridCellRenderer.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/host-c.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/acsymbols.o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffectDrawing.o $(OBJDIR_LINUX_RELEASE)/ModelGroupPanel.o $(OBJDIR_LINUX_RELEASE)/Mouse3DManager.o $(OBJDIR_LINUX_RELEASE)/ModelStateDialog.o $(OBJDIR_LINUX_RELEASE)/ModelRemap.o $(OBJDIR_LINUX_RELEASE)/ModelPreview.o $(OBJDIR_LINUX_RELEASE)/MultiControllerUploadDialog.o $(OBJDIR_LINUX_RELEASE)/ModelFaceDialog.o $(OBJDIR_LINUX_RELEASE)/ModelDimmingCurveDialog.o $(OBJDIR_LINUX_RELEASE)/ModelChainDialog.o $(OBJDIR_LINUX_RELEASE)/MetronomeLabelDialog.o $(OBJDIR_LINUX_RELEASE)/OutputModelManager.o $(OBJDIR_LINUX_RELEASE)/OptionChooser.o $(OBJDIR_LINUX_RELEASE)/OpenGLShaders.o $(OBJDIR_LINUX_RELEASE)/NoteRangeDialog.o $(OBJDIR_LINUX_RELEASE)/NoteImportDialog.o $(OBJDIR_LINUX_RELEASE)/NodesGridCellEditor.o $(OBJDIR_LINUX_RELEASE)/NodeSelectGrid.o $(OBJDIR_LINUX_RELEASE)/NewTimingDialog.o $(OBJDIR_LINUX_RELEASE)/MusicXML.o $(OBJDIR_LINUX_RELEASE)/LayoutPanel.o $(OBJDIR_LINUX_RELEASE)/LayoutGroup.o $(OBJDIR_LINUX_RELEASE)/LayerSelectDialog.o $(OBJDIR_LINUX_RELEASE)/LORPreview.o $(OBJDIR_LINUX_RELEASE)/LayoutUtils.o $(OBJDIR_LINUX_RELEASE)/LOREdit.o $(OBJDIR_LINUX_RELEASE)/LMSImportChannelMapDialog.o $(OBJDIR_LINUX_RELEASE)/KeyBindings.o $(OBJDIR_LINUX_RELEASE)/KeyBindingEditDialog.o $(OBJDIR_LINUX_RELEASE)/MediaImportOptionsDialog.o $(OBJDIR_LINUX_RELEASE)/MatrixFaceDownloadDialog.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiMessage.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiFile.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiEventList.o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiEvent.o $(OBJDIR_LINUX_RELEASE)/MIDI/Binasc.o $(OBJDIR_LINUX_RELEASE)/LyricsDialog.o $(OBJDIR_LINUX_RELEASE)/LyricUserDictDialog.o $(OBJDIR_LINUX_RELEASE)/LorConvertDialog.o $(OBJDIR_LINUX_RELEASE)/LinkJukeboxButtonDialog.o $(OBJDIR_LINUX_RELEASE)/SequenceData.o $(OBJDIR_LINUX_RELEASE)/SeqSettingsDialog.o $(OBJDIR_LINUX_RELEASE)/SeqFileUtilities.o $(OBJDIR_LINUX_RELEASE)/SeqExportDialog.o $(OBJDIR_LINUX_RELEASE)/SeqElementMismatchDialog.o $(OBJDIR_LINUX_RELEASE)/SelectTimingsDialog.o $(OBJDIR_LINUX_RELEASE)/SelectPanel.o $(OBJDIR_LINUX_RELEASE)/SearchPanel.o $(OBJDIR_LINUX_RELEASE)/ScriptsDialog.o $(OBJDIR_LINUX_RELEASE)/SevenSegmentDialog.o $(OBJDIR_LINUX_RELEASE)/StrandNodeNamesDialog.o $(OBJDIR_LINUX_RELEASE)/StartChannelDialog.o $(OBJDIR_LINUX_RELEASE)/SplashDialog.o $(OBJDIR_LINUX_RELEASE)/ShaderDownloadDialog.o $(OBJDIR_LINUX_RELEASE)/SaveChangesDialog.o $(OBJDIR_LINUX_RELEASE)/SequenceViewManager.o $(OBJDIR_LINUX_RELEASE)/SequenceVideoPreview.o $(OBJDIR_LINUX_RELEASE)/SequenceVideoPanel.o $(OBJDIR_LINUX_RELEASE)/SequencePackage.o $(OBJDIR_LINUX_RELEASE)/PhonemeDictionary.o $(OBJDIR_LINUX_RELEASE)/PreviewPane.o $(OBJDIR_LINUX_RELEASE)/Pixels.o $(OBJDIR_LINUX_RELEASE)/PixelTestDialog.o $(OBJDIR_LINUX_RELEASE)/PixelBuffer.o $(OBJDIR_LINUX_RELEASE)/PerspectivesPanel.o $(OBJDIR_LINUX_RELEASE)/PathGenerationDialog.o $(OBJDIR_LINUX_RELEASE)/Parallel.o $(OBJDIR_LINUX_RELEASE)/PaletteMgmtDialog.o $(OBJDIR_LINUX_RELEASE)/RestoreBackupDialog.o $(OBJDIR_LINUX_RELEASE)/ResizeImageDialog.o $(OBJDIR_LINUX_RELEASE)/RenderProgressDialog.o $(OBJDIR_LINUX_RELEASE)/JukeboxPanel.o $(OBJDIR_LINUX_RELEASE)/RenderCache.o $(OBJDIR_LINUX_RELEASE)/RenderBuffer.o $(OBJDIR_LINUX_RELEASE)/Render.o $(OBJDIR_LINUX_RELEASE)/RenameTextDialog.o $(OBJDIR_LINUX_RELEASE)/RemapDMXChannelsDialog.o $(OBJDIR_LINUX_RELEASE)/CharMapDialog.o $(OBJDIR_LINUX_RELEASE)/ChannelLayoutDialog.o $(OBJDIR_LINUX_RELEASE)/CachedFileDownloader.o $(OBJDIR_LINUX_RELEASE)/BulkEditSliderDialog.o $(OBJDIR_LINUX_RELEASE)/BulkEditFontPickerDialog.o $(OBJDIR_LINUX_RELEASE)/BulkEditControls.o $(OBJDIR_LINUX_RELEASE)/BulkEditComboDialog.o $(OBJDIR_LINUX_RELEASE)/BulkEditColourPickerDialog.o $(OBJDIR_LINUX_RELEASE)/BufferSizeDialog.o $(OBJDIR_LINUX_RELEASE)/ControllerConnectionDialog.o $(OBJDIR_LINUX_RELEASE)/ColoursPanel.o $(OBJDIR_LINUX_RELEASE)/ColourReplaceDialog.o $(OBJDIR_LINUX_RELEASE)/ColorPanel.o $(OBJDIR_LINUX_RELEASE)/BufferPanel.o $(OBJDIR_LINUX_RELEASE)/ColorManager.o $(OBJDIR_LINUX_RELEASE)/ColorCurveDialog.o $(OBJDIR_LINUX_RELEASE)/ColorCurve.o $(OBJDIR_LINUX_RELEASE)/Color.o $(OBJDIR_LINUX_RELEASE)/CheckboxSelectDialog.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/message.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/status.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/sha1.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/server.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/response.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/request.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/pages.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/context.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer/connection.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/md5.o $(OBJDIR_LINUX_RELEASE)/__/xFade/wxLED.o $(OBJDIR_LINUX_RELEASE)/AlignmentDialog.o $(OBJDIR_LINUX_RELEASE)/BitmapCache.o $(OBJDIR_LINUX_RELEASE)/BatchRenderDialog.o $(OBJDIR_LINUX_RELEASE)/AutoLabelDialog.o $(OBJDIR_LINUX_RELEASE)/AudioManager.o $(OBJDIR_LINUX_RELEASE)/ControllerModelDialog.o $(OBJDIR_LINUX_RELEASE)/AboutDialog.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_RELEASE)/ExportSettings.o $(OBJDIR_LINUX_RELEASE)/FlickerFreeBitmapButton.o $(OBJDIR_LINUX_RELEASE)/FindDataPanel.o $(OBJDIR_LINUX_RELEASE)/FileConverter.o $(OBJDIR_LINUX_RELEASE)/FSEQFile.o $(OBJDIR_LINUX_RELEASE)/ExportModelSelect.o $(OBJDIR_LINUX_RELEASE)/EmailDialog.o $(OBJDIR_LINUX_RELEASE)/EffectsPanel.o $(OBJDIR_LINUX_RELEASE)/EffectTreeDialog.o $(OBJDIR_LINUX_RELEASE)/HousePreviewPanel.o $(OBJDIR_LINUX_RELEASE)/JobPool.o $(OBJDIR_LINUX_RELEASE)/ImportPreviewsModelsDialog.o $(OBJDIR_LINUX_RELEASE)/IPEntryDialog.o $(OBJDIR_LINUX_RELEASE)/GenerateLyricsDialog.o $(OBJDIR_LINUX_RELEASE)/GenerateCustomModelDialog.o $(OBJDIR_LINUX_RELEASE)/GPURenderUtils.o $(OBJDIR_LINUX_RELEASE)/FontManager.o $(OBJDIR_LINUX_RELEASE)/DimmingCurvePanel.o $(OBJDIR_LINUX_RELEASE)/DimmingCurve.o $(OBJDIR_LINUX_RELEASE)/DataLayer.o $(OBJDIR_LINUX_RELEASE)/CustomTimingDialog.o $(OBJDIR_LINUX_RELEASE)/Discovery.o $(OBJDIR_LINUX_RELEASE)/CustomModelDialog.o $(OBJDIR_LINUX_RELEASE)/CopyFormat1.o $(OBJDIR_LINUX_RELEASE)/ConvertLogDialog.o $(OBJDIR_LINUX_RELEASE)/ConvertDialog.o $(OBJDIR_LINUX_RELEASE)/EditAliasesDialog.o $(OBJDIR_LINUX_RELEASE)/EffectTimingDialog.o $(OBJDIR_LINUX_RELEASE)/EffectListDialog.o $(OBJDIR_LINUX_RELEASE)/EffectIconPanel.o $(OBJDIR_LINUX_RELEASE)/EffectAssist.o $(OBJDIR_LINUX_RELEASE)/DuplicateDialog.o $(OBJDIR_LINUX_RELEASE)/DragValueCurveBitmapButton.o $(OBJDIR_LINUX_RELEASE)/DragColoursBitmapButton.o $(OBJDIR_LINUX_RELEASE)/DissolveTransitionPattern.o $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GuitarPanel.o $(OBJDIR_LINUX_RELEASE)/effects/GuitarEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GlediatorPanel.o $(OBJDIR_LINUX_RELEASE)/effects/GlediatorEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GarlandsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/GarlandsEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyPanel.o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyEffect.o $(OBJDIR_LINUX_RELEASE)/effects/LightningPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LiquidPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LiquidEffect.o $(OBJDIR_LINUX_RELEASE)/effects/LinesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LinesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GIFImage.o $(OBJDIR_LINUX_RELEASE)/effects/LightningEffect.o $(OBJDIR_LINUX_RELEASE)/effects/LifePanel.o $(OBJDIR_LINUX_RELEASE)/effects/LifeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopePanel.o $(OBJDIR_LINUX_RELEASE)/effects/FacesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FX.o $(OBJDIR_LINUX_RELEASE)/effects/EffectPanelUtils.o $(OBJDIR_LINUX_RELEASE)/effects/EffectManager.o $(OBJDIR_LINUX_RELEASE)/effects/FacesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/DuplicatePanel.o $(OBJDIR_LINUX_RELEASE)/effects/DuplicateEffect.o $(OBJDIR_LINUX_RELEASE)/effects/DMXPanel.o $(OBJDIR_LINUX_RELEASE)/effects/DMXEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FireworksPanel.o $(OBJDIR_LINUX_RELEASE)/effects/FireworksEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FirePanel.o $(OBJDIR_LINUX_RELEASE)/effects/FireEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FillPanel.o $(OBJDIR_LINUX_RELEASE)/effects/FillEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FanPanel.o $(OBJDIR_LINUX_RELEASE)/effects/FanEffect.o $(OBJDIR_LINUX_RELEASE)/effects/RipplePanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShaderPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShaderEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ServoPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ServoEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ShapeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/RippleEffect.o $(OBJDIR_LINUX_RELEASE)/effects/RenderableEffect.o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandPanel.o $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ShockwavePanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShockwaveEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ShimmerPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShimmerEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ShapePanel.o $(OBJDIR_LINUX_RELEASE)/effects/MorphEffect.o $(OBJDIR_LINUX_RELEASE)/effects/OffEffect.o $(OBJDIR_LINUX_RELEASE)/effects/MusicPanel.o $(OBJDIR_LINUX_RELEASE)/effects/MusicEffect.o $(OBJDIR_LINUX_RELEASE)/effects/MorphPanel.o $(OBJDIR_LINUX_RELEASE)/effects/MeteorsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/MeteorsEffect.o $(OBJDIR_LINUX_RELEASE)/effects/MarqueePanel.o $(OBJDIR_LINUX_RELEASE)/effects/MarqueeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/PianoPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PinwheelPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PinwheelEffect.o $(OBJDIR_LINUX_RELEASE)/effects/PicturesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PicturesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/CurtainPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PianoEffect.o $(OBJDIR_LINUX_RELEASE)/effects/OnPanel.o $(OBJDIR_LINUX_RELEASE)/effects/OnEffect.o $(OBJDIR_LINUX_RELEASE)/effects/OffPanel.o $(OBJDIR_LINUX_RELEASE)/VideoExporter.o $(OBJDIR_LINUX_RELEASE)/ViewpointMgr.o $(OBJDIR_LINUX_RELEASE)/ViewpointDialog.o $(OBJDIR_LINUX_RELEASE)/ViewObjectPanel.o $(OBJDIR_LINUX_RELEASE)/VideoReader.o $(OBJDIR_LINUX_RELEASE)/ViewsModelsPanel.o $(OBJDIR_LINUX_RELEASE)/VendorMusicHelpers.o $(OBJDIR_LINUX_RELEASE)/VendorMusicDialog.o $(OBJDIR_LINUX_RELEASE)/VendorModelDialog.o $(OBJDIR_LINUX_RELEASE)/ValueCurvesPanel.o $(OBJDIR_LINUX_RELEASE)/automation/LuaRunner.o $(OBJDIR_LINUX_RELEASE)/cad/CADWriter.o $(OBJDIR_LINUX_RELEASE)/cad/CADModel.o $(OBJDIR_LINUX_RELEASE)/automation/xLightsAutomations.o $(OBJDIR_LINUX_RELEASE)/automation/automation.o $(OBJDIR_LINUX_RELEASE)/WiringDialog.o $(OBJDIR_LINUX_RELEASE)/VsaImportDialog.o $(OBJDIR_LINUX_RELEASE)/Vixen3.o $(OBJDIR_LINUX_RELEASE)/TabConvert.o $(OBJDIR_LINUX_RELEASE)/TopEffectsPanel.o $(OBJDIR_LINUX_RELEASE)/TipOfTheDayDialog.o $(OBJDIR_LINUX_RELEASE)/TimingPanel.o $(OBJDIR_LINUX_RELEASE)/TabSetup.o $(OBJDIR_LINUX_RELEASE)/TabSequence.o $(OBJDIR_LINUX_RELEASE)/TabPreview.o $(OBJDIR_LINUX_RELEASE)/SuperStarImportDialog.o $(OBJDIR_LINUX_RELEASE)/SubModelsDialog.o $(OBJDIR_LINUX_RELEASE)/SubModelGenerateDialog.o $(OBJDIR_LINUX_RELEASE)/SubBufferPanel.o $(OBJDIR_LINUX_RELEASE)/VAMPPluginDialog.o $(OBJDIR_LINUX_RELEASE)/ValueCurveDialog.o $(OBJDIR_LINUX_RELEASE)/ValueCurveButton.o $(OBJDIR_LINUX_RELEASE)/ValueCurve.o $(OBJDIR_LINUX_RELEASE)/VSAFile.o $(OBJDIR_LINUX_RELEASE)/UtilFunctions.o $(OBJDIR_LINUX_RELEASE)/UtilClasses.o $(OBJDIR_LINUX_RELEASE)/UpdaterDialog.o $(OBJDIR_LINUX_RELEASE)/TraceLog.o $(OBJDIR_LINUX_RELEASE)/effects/AdjustEffect.o $(OBJDIR_LINUX_RELEASE)/effects/BarsPanel.o $(OBJDIR_LINUX_RELEASE)/effects/BarsEffect.o $(OBJDIR_LINUX_RELEASE)/effects/AdjustPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyEffect.o $(OBJDIR_LINUX_RELEASE)/controllers/WebSocketClient.o $(OBJDIR_LINUX_RELEASE)/controllers/WLED.o $(OBJDIR_LINUX_RELEASE)/controllers/SanDevices.o $(OBJDIR_LINUX_RELEASE)/controllers/Pixlite16.o $(OBJDIR_LINUX_RELEASE)/effects/CurtainEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashPanel.o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashEffect.o $(OBJDIR_LINUX_RELEASE)/effects/CirclesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/CirclesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/CandlePanel.o $(OBJDIR_LINUX_RELEASE)/effects/CandleEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyPanel.o $(OBJDIR_LINUX_RELEASE)/controllers/AlphaPix.o $(OBJDIR_LINUX_RELEASE)/controllers/ESPixelStick.o $(OBJDIR_LINUX_RELEASE)/controllers/ControllerUploadData.o $(OBJDIR_LINUX_RELEASE)/controllers/ControllerCaps.o $(OBJDIR_LINUX_RELEASE)/controllers/BaseController.o $(OBJDIR_LINUX_RELEASE)/cad/VRMLWriter.o $(OBJDIR_LINUX_RELEASE)/cad/STLWriter.o $(OBJDIR_LINUX_RELEASE)/cad/ModelToCAD.o $(OBJDIR_LINUX_RELEASE)/cad/DXFWriter.o $(OBJDIR_LINUX_RELEASE)/controllers/Falcon.o $(OBJDIR_LINUX_RELEASE)/controllers/Minleon.o $(OBJDIR_LINUX_RELEASE)/controllers/J1Sys.o $(OBJDIR_LINUX_RELEASE)/controllers/HinksPixExportDialog.o $(OBJDIR_LINUX_RELEASE)/controllers/HinksPix.o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o $(OBJDIR_LINUX_RELEASE)/controllers/FPPUploadProgressDialog.o $(OBJDIR_LINUX_RELEASE)/controllers/FPPConnectDialog.o $(OBJDIR_LINUX_RELEASE)/controllers/FPP.o $(OBJDIR_LINUX_RELEASE)/controllers/Experience.o all: linux_debug linux_release @@ -56,22 +56,23 @@ before_linux_debug: @test -d $(OBJDIR_LINUX_DEBUG)/preferences || mkdir -p $(OBJDIR_LINUX_DEBUG)/preferences @test -d $(OBJDIR_LINUX_DEBUG)/effects || mkdir -p $(OBJDIR_LINUX_DEBUG)/effects @test -d $(OBJDIR_LINUX_DEBUG)/effects/assist || mkdir -p $(OBJDIR_LINUX_DEBUG)/effects/assist - @test -d $(OBJDIR_LINUX_DEBUG)/graphics/opengl || mkdir -p $(OBJDIR_LINUX_DEBUG)/graphics/opengl + @test -d $(OBJDIR_LINUX_DEBUG)/graphics || mkdir -p $(OBJDIR_LINUX_DEBUG)/graphics @test -d $(OBJDIR_LINUX_DEBUG)/kiss_fft/tools || mkdir -p $(OBJDIR_LINUX_DEBUG)/kiss_fft/tools @test -d $(OBJDIR_LINUX_DEBUG)/kiss_fft || mkdir -p $(OBJDIR_LINUX_DEBUG)/kiss_fft - @test -d $(OBJDIR_LINUX_DEBUG)/graphics || mkdir -p $(OBJDIR_LINUX_DEBUG)/graphics + @test -d $(OBJDIR_LINUX_DEBUG)/graphics/opengl || mkdir -p $(OBJDIR_LINUX_DEBUG)/graphics/opengl @test -d $(OBJDIR_LINUX_DEBUG) || mkdir -p $(OBJDIR_LINUX_DEBUG) - @test -d $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk @test -d $(OBJDIR_LINUX_DEBUG)/utils || mkdir -p $(OBJDIR_LINUX_DEBUG)/utils + @test -d $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk @test -d $(OBJDIR_LINUX_DEBUG)/support || mkdir -p $(OBJDIR_LINUX_DEBUG)/support @test -d $(OBJDIR_LINUX_DEBUG)/sequencer || mkdir -p $(OBJDIR_LINUX_DEBUG)/sequencer + @test -d $(OBJDIR_LINUX_DEBUG)/wxWEBPHandler || mkdir -p $(OBJDIR_LINUX_DEBUG)/wxWEBPHandler @test -d $(OBJDIR_LINUX_DEBUG)/MIDI || mkdir -p $(OBJDIR_LINUX_DEBUG)/MIDI @test -d $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxHTTPServer @test -d $(OBJDIR_LINUX_DEBUG)/__/xSchedule || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xSchedule @test -d $(OBJDIR_LINUX_DEBUG)/__/xFade || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xFade @test -d $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON - @test -d $(OBJDIR_LINUX_DEBUG)/cad || mkdir -p $(OBJDIR_LINUX_DEBUG)/cad @test -d $(OBJDIR_LINUX_DEBUG)/automation || mkdir -p $(OBJDIR_LINUX_DEBUG)/automation + @test -d $(OBJDIR_LINUX_DEBUG)/cad || mkdir -p $(OBJDIR_LINUX_DEBUG)/cad @test -d $(OBJDIR_LINUX_DEBUG)/controllers || mkdir -p $(OBJDIR_LINUX_DEBUG)/controllers @test -d $(OBJDIR_LINUX_DEBUG)/__/common || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/common @@ -97,6 +98,9 @@ $(OBJDIR_LINUX_DEBUG)/models/SubModel.o: models/SubModel.cpp $(OBJDIR_LINUX_DEBUG)/models/StarModel.o: models/StarModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/StarModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/StarModel.o +$(OBJDIR_LINUX_DEBUG)/models/ThreePointScreenLocation.o: models/ThreePointScreenLocation.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ThreePointScreenLocation.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ThreePointScreenLocation.o + $(OBJDIR_LINUX_DEBUG)/models/SphereModel.o: models/SphereModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/SphereModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/SphereModel.o @@ -109,9 +113,6 @@ $(OBJDIR_LINUX_DEBUG)/models/Shapes.o: models/Shapes.cpp $(OBJDIR_LINUX_DEBUG)/models/RulerObject.o: models/RulerObject.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/RulerObject.cpp -o $(OBJDIR_LINUX_DEBUG)/models/RulerObject.o -$(OBJDIR_LINUX_DEBUG)/models/ViewObjectManager.o: models/ViewObjectManager.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ViewObjectManager.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ViewObjectManager.o - $(OBJDIR_LINUX_DEBUG)/outputs/ArtNetOutput.o: outputs/ArtNetOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/ArtNetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/ArtNetOutput.o @@ -124,6 +125,9 @@ $(OBJDIR_LINUX_DEBUG)/models/WindowFrameModel.o: models/WindowFrameModel.cpp $(OBJDIR_LINUX_DEBUG)/models/WholeHouseModel.o: models/WholeHouseModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/WholeHouseModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/WholeHouseModel.o +$(OBJDIR_LINUX_DEBUG)/models/ViewObjectManager.o: models/ViewObjectManager.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ViewObjectManager.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ViewObjectManager.o + $(OBJDIR_LINUX_DEBUG)/models/ViewObject.o: models/ViewObject.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ViewObject.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ViewObject.o @@ -133,9 +137,6 @@ $(OBJDIR_LINUX_DEBUG)/models/TwoPointScreenLocation.o: models/TwoPointScreenLoca $(OBJDIR_LINUX_DEBUG)/models/TreeModel.o: models/TreeModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/TreeModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/TreeModel.o -$(OBJDIR_LINUX_DEBUG)/models/ThreePointScreenLocation.o: models/ThreePointScreenLocation.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ThreePointScreenLocation.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ThreePointScreenLocation.o - $(OBJDIR_LINUX_DEBUG)/models/ImageModel.o: models/ImageModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ImageModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ImageModel.o @@ -175,6 +176,9 @@ $(OBJDIR_LINUX_DEBUG)/models/ObjectManager.o: models/ObjectManager.cpp $(OBJDIR_LINUX_DEBUG)/models/Node.o: models/Node.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/Node.cpp -o $(OBJDIR_LINUX_DEBUG)/models/Node.o +$(OBJDIR_LINUX_DEBUG)/outputs/Controller.o: outputs/Controller.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/Controller.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/Controller.o + $(OBJDIR_LINUX_DEBUG)/models/MultiPointModel.o: models/MultiPointModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/MultiPointModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/MultiPointModel.o @@ -187,8 +191,14 @@ $(OBJDIR_LINUX_DEBUG)/models/ModelManager.o: models/ModelManager.cpp $(OBJDIR_LINUX_DEBUG)/models/ModelGroup.o: models/ModelGroup.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ModelGroup.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ModelGroup.o -$(OBJDIR_LINUX_DEBUG)/outputs/RenardOutput.o: outputs/RenardOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/RenardOutput.o +$(OBJDIR_LINUX_DEBUG)/outputs/SerialOutput.o: outputs/SerialOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/SerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/SerialOutput.o + +$(OBJDIR_LINUX_DEBUG)/outputs/serial.o: outputs/serial.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/serial.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/serial.o + +$(OBJDIR_LINUX_DEBUG)/outputs/ZCPPOutput.o: outputs/ZCPPOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/ZCPPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/ZCPPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/TwinklyOutput.o: outputs/TwinklyOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/TwinklyOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/TwinklyOutput.o @@ -196,11 +206,8 @@ $(OBJDIR_LINUX_DEBUG)/outputs/TwinklyOutput.o: outputs/TwinklyOutput.cpp $(OBJDIR_LINUX_DEBUG)/outputs/TestPreset.o: outputs/TestPreset.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/TestPreset.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/TestPreset.o -$(OBJDIR_LINUX_DEBUG)/outputs/SerialOutput.o: outputs/SerialOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/SerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/SerialOutput.o - -$(OBJDIR_LINUX_DEBUG)/outputs/ZCPPOutput.o: outputs/ZCPPOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/ZCPPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/ZCPPOutput.o +$(OBJDIR_LINUX_DEBUG)/outputs/RenardOutput.o: outputs/RenardOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/PixelNetOutput.o: outputs/PixelNetOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/PixelNetOutput.o @@ -211,8 +218,14 @@ $(OBJDIR_LINUX_DEBUG)/outputs/OutputManager.o: outputs/OutputManager.cpp $(OBJDIR_LINUX_DEBUG)/outputs/Output.o: outputs/Output.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/Output.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/Output.o -$(OBJDIR_LINUX_DEBUG)/outputs/OpenPixelNetOutput.o: outputs/OpenPixelNetOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/OpenPixelNetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/OpenPixelNetOutput.o +$(OBJDIR_LINUX_DEBUG)/preferences/ColorManagerSettingsPanel.o: preferences/ColorManagerSettingsPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/ColorManagerSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/ColorManagerSettingsPanel.o + +$(OBJDIR_LINUX_DEBUG)/preferences/RandomEffectsSettingsPanel.o: preferences/RandomEffectsSettingsPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/RandomEffectsSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/RandomEffectsSettingsPanel.o + +$(OBJDIR_LINUX_DEBUG)/preferences/OutputSettingsPanel.o: preferences/OutputSettingsPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/OutputSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/OutputSettingsPanel.o $(OBJDIR_LINUX_DEBUG)/preferences/OtherSettingsPanel.o: preferences/OtherSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/OtherSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/OtherSettingsPanel.o @@ -220,9 +233,6 @@ $(OBJDIR_LINUX_DEBUG)/preferences/OtherSettingsPanel.o: preferences/OtherSetting $(OBJDIR_LINUX_DEBUG)/preferences/EffectsGridSettingsPanel.o: preferences/EffectsGridSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/EffectsGridSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/EffectsGridSettingsPanel.o -$(OBJDIR_LINUX_DEBUG)/preferences/ColorManagerSettingsPanel.o: preferences/ColorManagerSettingsPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/ColorManagerSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/ColorManagerSettingsPanel.o - $(OBJDIR_LINUX_DEBUG)/preferences/CheckSequenceSettingsPanel.o: preferences/CheckSequenceSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/CheckSequenceSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/CheckSequenceSettingsPanel.o @@ -235,11 +245,8 @@ $(OBJDIR_LINUX_DEBUG)/outputs/xxxSerialOutput.o: outputs/xxxSerialOutput.cpp $(OBJDIR_LINUX_DEBUG)/outputs/xxxEthernetOutput.o: outputs/xxxEthernetOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/xxxEthernetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/xxxEthernetOutput.o -$(OBJDIR_LINUX_DEBUG)/outputs/serial.o: outputs/serial.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/serial.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/serial.o - -$(OBJDIR_LINUX_DEBUG)/outputs/DDPOutput.o: outputs/DDPOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/DDPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/DDPOutput.o +$(OBJDIR_LINUX_DEBUG)/outputs/IPOutput.o: outputs/IPOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/IPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/GenericSerialOutput.o: outputs/GenericSerialOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/GenericSerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/GenericSerialOutput.o @@ -250,8 +257,8 @@ $(OBJDIR_LINUX_DEBUG)/outputs/E131Output.o: outputs/E131Output.cpp $(OBJDIR_LINUX_DEBUG)/outputs/DMXOutput.o: outputs/DMXOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/DMXOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/DMXOutput.o -$(OBJDIR_LINUX_DEBUG)/outputs/IPOutput.o: outputs/IPOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/IPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/IPOutput.o +$(OBJDIR_LINUX_DEBUG)/outputs/DDPOutput.o: outputs/DDPOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/DDPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/DDPOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerSerial.o: outputs/ControllerSerial.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/ControllerSerial.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerSerial.o @@ -262,11 +269,11 @@ $(OBJDIR_LINUX_DEBUG)/outputs/ControllerNull.o: outputs/ControllerNull.cpp $(OBJDIR_LINUX_DEBUG)/outputs/ControllerEthernet.o: outputs/ControllerEthernet.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/ControllerEthernet.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/ControllerEthernet.o -$(OBJDIR_LINUX_DEBUG)/outputs/Controller.o: outputs/Controller.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/Controller.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/Controller.o +$(OBJDIR_LINUX_DEBUG)/outputs/LorControllers.o: outputs/LorControllers.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/LorControllers.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/LorControllers.o -$(OBJDIR_LINUX_DEBUG)/outputs/LorController.o: outputs/LorController.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/LorController.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/LorController.o +$(OBJDIR_LINUX_DEBUG)/outputs/OpenPixelNetOutput.o: outputs/OpenPixelNetOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/OpenPixelNetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/outputs/OpenDMXOutput.o: outputs/OpenDMXOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/OpenDMXOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/OpenDMXOutput.o @@ -277,12 +284,12 @@ $(OBJDIR_LINUX_DEBUG)/outputs/OPCOutput.o: outputs/OPCOutput.cpp $(OBJDIR_LINUX_DEBUG)/outputs/NullOutput.o: outputs/NullOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/NullOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/NullOutput.o -$(OBJDIR_LINUX_DEBUG)/outputs/LorControllers.o: outputs/LorControllers.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/LorControllers.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/LorControllers.o - $(OBJDIR_LINUX_DEBUG)/models/DMX/ServoConfigDialog.o: models/DMX/ServoConfigDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/DMX/ServoConfigDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/models/DMX/ServoConfigDialog.o +$(OBJDIR_LINUX_DEBUG)/outputs/LorController.o: outputs/LorController.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/LorController.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/LorController.o + $(OBJDIR_LINUX_DEBUG)/outputs/LOROutput.o: outputs/LOROutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c outputs/LOROutput.cpp -o $(OBJDIR_LINUX_DEBUG)/outputs/LOROutput.o @@ -304,9 +311,6 @@ $(OBJDIR_LINUX_DEBUG)/effects/VideoPanel.o: effects/VideoPanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/VideoEffect.o: effects/VideoEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/VideoEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/VideoEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/WaveEffect.o: effects/WaveEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/WaveEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/WaveEffect.o - $(OBJDIR_LINUX_DEBUG)/effects/VUMeterPanel.o: effects/VUMeterPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/VUMeterPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/VUMeterPanel.o @@ -319,6 +323,12 @@ $(OBJDIR_LINUX_DEBUG)/effects/TwinklePanel.o: effects/TwinklePanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/TwinkleEffect.o: effects/TwinkleEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TwinkleEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TwinkleEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/TreePanel.o: effects/TreePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TreePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TreePanel.o + +$(OBJDIR_LINUX_DEBUG)/effects/assist/SketchAssistPanel.o: effects/assist/SketchAssistPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/assist/SketchAssistPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchAssistPanel.o + $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasPictures.o: effects/assist/xlGridCanvasPictures.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/assist/xlGridCanvasPictures.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasPictures.o @@ -331,11 +341,8 @@ $(OBJDIR_LINUX_DEBUG)/effects/assist/xlGridCanvasEmpty.o: effects/assist/xlGridC $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchCanvasPanel.o: effects/assist/SketchCanvasPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/assist/SketchCanvasPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchCanvasPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/TreePanel.o: effects/TreePanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TreePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TreePanel.o - -$(OBJDIR_LINUX_DEBUG)/effects/assist/SketchAssistPanel.o: effects/assist/SketchAssistPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/assist/SketchAssistPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/assist/SketchAssistPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/TreeEffect.o: effects/TreeEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TreeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TreeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/assist/PicturesAssistPanel.o: effects/assist/PicturesAssistPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/assist/PicturesAssistPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/assist/PicturesAssistPanel.o @@ -346,14 +353,8 @@ $(OBJDIR_LINUX_DEBUG)/effects/assist/AssistPanel.o: effects/assist/AssistPanel.c $(OBJDIR_LINUX_DEBUG)/effects/WavePanel.o: effects/WavePanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/WavePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/WavePanel.o -$(OBJDIR_LINUX_DEBUG)/effects/SpiralsEffect.o: effects/SpiralsEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SpiralsEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SpiralsEffect.o - -$(OBJDIR_LINUX_DEBUG)/effects/StateEffect.o: effects/StateEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/StateEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/StateEffect.o - -$(OBJDIR_LINUX_DEBUG)/effects/SpirographPanel.o: effects/SpirographPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SpirographPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SpirographPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/WaveEffect.o: effects/WaveEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/WaveEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/WaveEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SpirographEffect.o: effects/SpirographEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SpirographEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SpirographEffect.o @@ -361,9 +362,15 @@ $(OBJDIR_LINUX_DEBUG)/effects/SpirographEffect.o: effects/SpirographEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/SpiralsPanel.o: effects/SpiralsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SpiralsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SpiralsPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/SpiralsEffect.o: effects/SpiralsEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SpiralsEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SpiralsEffect.o + $(OBJDIR_LINUX_DEBUG)/effects/SnowstormPanel.o: effects/SnowstormPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SnowstormPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SnowstormPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/SpirographPanel.o: effects/SpirographPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SpirographPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SpirographPanel.o + $(OBJDIR_LINUX_DEBUG)/effects/SnowstormEffect.o: effects/SnowstormEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SnowstormEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SnowstormEffect.o @@ -373,8 +380,8 @@ $(OBJDIR_LINUX_DEBUG)/effects/SnowflakesPanel.o: effects/SnowflakesPanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/SnowflakesEffect.o: effects/SnowflakesEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SnowflakesEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SnowflakesEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/TreeEffect.o: effects/TreeEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TreeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TreeEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/SketchPanel.o: effects/SketchPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SketchPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SketchPanel.o $(OBJDIR_LINUX_DEBUG)/effects/TextPanel.o: effects/TextPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TextPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TextPanel.o @@ -385,9 +392,6 @@ $(OBJDIR_LINUX_DEBUG)/effects/TextEffect.o: effects/TextEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/TendrilPanel.o: effects/TendrilPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TendrilPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TendrilPanel.o -$(OBJDIR_LINUX_DEBUG)/graphics/opengl/DrawGLUtils.o: graphics/opengl/DrawGLUtils.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c graphics/opengl/DrawGLUtils.cpp -o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/DrawGLUtils.o - $(OBJDIR_LINUX_DEBUG)/effects/TendrilEffect.o: effects/TendrilEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/TendrilEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/TendrilEffect.o @@ -400,6 +404,9 @@ $(OBJDIR_LINUX_DEBUG)/effects/StrobeEffect.o: effects/StrobeEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/StatePanel.o: effects/StatePanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/StatePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/StatePanel.o +$(OBJDIR_LINUX_DEBUG)/effects/StateEffect.o: effects/StateEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/StateEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/StateEffect.o + $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxMovingHead3D.o: models/DMX/DmxMovingHead3D.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/DMX/DmxMovingHead3D.cpp -o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxMovingHead3D.o @@ -454,6 +461,9 @@ $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxServo.o: models/DMX/DmxServo.cpp $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxPresetAbility.o: models/DMX/DmxPresetAbility.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/DMX/DmxPresetAbility.cpp -o $(OBJDIR_LINUX_DEBUG)/models/DMX/DmxPresetAbility.o +$(OBJDIR_LINUX_DEBUG)/graphics/xlGraphicsAccumulators.o: graphics/xlGraphicsAccumulators.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c graphics/xlGraphicsAccumulators.cpp -o $(OBJDIR_LINUX_DEBUG)/graphics/xlGraphicsAccumulators.o + $(OBJDIR_LINUX_DEBUG)/models/ArchesModel.o: models/ArchesModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ArchesModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ArchesModel.o @@ -466,12 +476,6 @@ $(OBJDIR_LINUX_DEBUG)/kiss_fft/kiss_fft.o: kiss_fft/kiss_fft.c $(OBJDIR_LINUX_DEBUG)/graphics/xlMesh.o: graphics/xlMesh.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c graphics/xlMesh.cpp -o $(OBJDIR_LINUX_DEBUG)/graphics/xlMesh.o -$(OBJDIR_LINUX_DEBUG)/models/BaseObject.o: models/BaseObject.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/BaseObject.cpp -o $(OBJDIR_LINUX_DEBUG)/models/BaseObject.o - -$(OBJDIR_LINUX_DEBUG)/graphics/xlGraphicsAccumulators.o: graphics/xlGraphicsAccumulators.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c graphics/xlGraphicsAccumulators.cpp -o $(OBJDIR_LINUX_DEBUG)/graphics/xlGraphicsAccumulators.o - $(OBJDIR_LINUX_DEBUG)/graphics/xlFontInfo.o: graphics/xlFontInfo.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c graphics/xlFontInfo.cpp -o $(OBJDIR_LINUX_DEBUG)/graphics/xlFontInfo.o @@ -481,6 +485,9 @@ $(OBJDIR_LINUX_DEBUG)/graphics/opengl/xlOGL3GraphicsContext.o: graphics/opengl/x $(OBJDIR_LINUX_DEBUG)/graphics/opengl/xlGLCanvas.o: graphics/opengl/xlGLCanvas.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c graphics/opengl/xlGLCanvas.cpp -o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/xlGLCanvas.o +$(OBJDIR_LINUX_DEBUG)/graphics/opengl/DrawGLUtils.o: graphics/opengl/DrawGLUtils.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c graphics/opengl/DrawGLUtils.cpp -o $(OBJDIR_LINUX_DEBUG)/graphics/opengl/DrawGLUtils.o + $(OBJDIR_LINUX_DEBUG)/models/CircleModel.o: models/CircleModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/CircleModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/CircleModel.o @@ -496,9 +503,6 @@ $(OBJDIR_LINUX_DEBUG)/models/CustomModel.o: models/CustomModel.cpp $(OBJDIR_LINUX_DEBUG)/models/CubeModel.o: models/CubeModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/CubeModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/CubeModel.o -$(OBJDIR_LINUX_DEBUG)/preferences/OutputSettingsPanel.o: preferences/OutputSettingsPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/OutputSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/OutputSettingsPanel.o - $(OBJDIR_LINUX_DEBUG)/models/ChannelBlockModel.o: models/ChannelBlockModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/ChannelBlockModel.cpp -o $(OBJDIR_LINUX_DEBUG)/models/ChannelBlockModel.o @@ -508,6 +512,9 @@ $(OBJDIR_LINUX_DEBUG)/models/CandyCaneModel.o: models/CandyCaneModel.cpp $(OBJDIR_LINUX_DEBUG)/models/BoxedScreenLocation.o: models/BoxedScreenLocation.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/BoxedScreenLocation.cpp -o $(OBJDIR_LINUX_DEBUG)/models/BoxedScreenLocation.o +$(OBJDIR_LINUX_DEBUG)/models/BaseObject.o: models/BaseObject.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c models/BaseObject.cpp -o $(OBJDIR_LINUX_DEBUG)/models/BaseObject.o + $(OBJDIR_LINUX_DEBUG)/xLightsMain.o: xLightsMain.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c xLightsMain.cpp -o $(OBJDIR_LINUX_DEBUG)/xLightsMain.o @@ -544,8 +551,8 @@ $(OBJDIR_LINUX_DEBUG)/xLightsXmlFile.o: xLightsXmlFile.cpp $(OBJDIR_LINUX_DEBUG)/xLightsVersion.o: xLightsVersion.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c xLightsVersion.cpp -o $(OBJDIR_LINUX_DEBUG)/xLightsVersion.o -$(OBJDIR_LINUX_DEBUG)/tmGridCell.o: tmGridCell.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c tmGridCell.cpp -o $(OBJDIR_LINUX_DEBUG)/tmGridCell.o +$(OBJDIR_LINUX_DEBUG)/utils/CurlManager.o: utils/CurlManager.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c utils/CurlManager.cpp -o $(OBJDIR_LINUX_DEBUG)/utils/CurlManager.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/Files.o: vamp-hostsdk/Files.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/Files.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/Files.o @@ -559,20 +566,17 @@ $(OBJDIR_LINUX_DEBUG)/utils/ip_utils.o: utils/ip_utils.cpp $(OBJDIR_LINUX_DEBUG)/utils/Curl.o: utils/Curl.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c utils/Curl.cpp -o $(OBJDIR_LINUX_DEBUG)/utils/Curl.o +$(OBJDIR_LINUX_DEBUG)/tmGridCell.o: tmGridCell.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c tmGridCell.cpp -o $(OBJDIR_LINUX_DEBUG)/tmGridCell.o + $(OBJDIR_LINUX_DEBUG)/support/VectorMath.o: support/VectorMath.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c support/VectorMath.cpp -o $(OBJDIR_LINUX_DEBUG)/support/VectorMath.o $(OBJDIR_LINUX_DEBUG)/support/GridCellChoiceRenderer.o: support/GridCellChoiceRenderer.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c support/GridCellChoiceRenderer.cpp -o $(OBJDIR_LINUX_DEBUG)/support/GridCellChoiceRenderer.o -$(OBJDIR_LINUX_DEBUG)/support/FastComboEditor.o: support/FastComboEditor.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c support/FastComboEditor.cpp -o $(OBJDIR_LINUX_DEBUG)/support/FastComboEditor.o - -$(OBJDIR_LINUX_DEBUG)/support/EzGrid.o: support/EzGrid.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c support/EzGrid.cpp -o $(OBJDIR_LINUX_DEBUG)/support/EzGrid.o - -$(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginHostAdapter.o: vamp-hostsdk/PluginHostAdapter.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/PluginHostAdapter.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginHostAdapter.o +$(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/RealTime.o: vamp-hostsdk/RealTime.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/RealTime.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginWrapper.o: vamp-hostsdk/PluginWrapper.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/PluginWrapper.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginWrapper.o @@ -586,27 +590,33 @@ $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginLoader.o: vamp-hostsdk/PluginLoader.cpp $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-hostsdk/PluginInputDomainAdapter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/PluginInputDomainAdapter.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginInputDomainAdapter.o +$(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginHostAdapter.o: vamp-hostsdk/PluginHostAdapter.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/PluginHostAdapter.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginHostAdapter.o + $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginChannelAdapter.o: vamp-hostsdk/PluginChannelAdapter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/PluginChannelAdapter.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginBufferingAdapter.o: vamp-hostsdk/PluginBufferingAdapter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/PluginBufferingAdapter.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/PluginBufferingAdapter.o +$(OBJDIR_LINUX_DEBUG)/sequencer/Effect.o: sequencer/Effect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/Effect.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/Effect.o + +$(OBJDIR_LINUX_DEBUG)/sequencer/Element.o: sequencer/Element.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/Element.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/Element.o + +$(OBJDIR_LINUX_DEBUG)/sequencer/EffectsGrid.o: sequencer/EffectsGrid.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/EffectsGrid.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectsGrid.o + $(OBJDIR_LINUX_DEBUG)/sequencer/EffectLayer.o: sequencer/EffectLayer.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/EffectLayer.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectLayer.o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectDropTarget.o: sequencer/EffectDropTarget.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/EffectDropTarget.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectDropTarget.o -$(OBJDIR_LINUX_DEBUG)/sequencer/Effect.o: sequencer/Effect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/Effect.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/Effect.o - $(OBJDIR_LINUX_DEBUG)/sequencer/DragEffectBitmapButton.o: sequencer/DragEffectBitmapButton.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/DragEffectBitmapButton.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/DragEffectBitmapButton.o -$(OBJDIR_LINUX_DEBUG)/sequencer/EffectsGrid.o: sequencer/EffectsGrid.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/EffectsGrid.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/EffectsGrid.o - $(OBJDIR_LINUX_DEBUG)/preferences/xLightsPreferences.o: preferences/xLightsPreferences.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/xLightsPreferences.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/xLightsPreferences.o @@ -616,11 +626,14 @@ $(OBJDIR_LINUX_DEBUG)/preferences/ViewSettingsPanel.o: preferences/ViewSettingsP $(OBJDIR_LINUX_DEBUG)/preferences/SequenceFileSettingsPanel.o: preferences/SequenceFileSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/SequenceFileSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/SequenceFileSettingsPanel.o -$(OBJDIR_LINUX_DEBUG)/preferences/RandomEffectsSettingsPanel.o: preferences/RandomEffectsSettingsPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c preferences/RandomEffectsSettingsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/preferences/RandomEffectsSettingsPanel.o +$(OBJDIR_LINUX_DEBUG)/sequencer/UndoManager.o: sequencer/UndoManager.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/UndoManager.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/UndoManager.o -$(OBJDIR_LINUX_DEBUG)/sequencer/SequenceElements.o: sequencer/SequenceElements.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/SequenceElements.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/SequenceElements.o +$(OBJDIR_LINUX_DEBUG)/support/FastComboEditor.o: support/FastComboEditor.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c support/FastComboEditor.cpp -o $(OBJDIR_LINUX_DEBUG)/support/FastComboEditor.o + +$(OBJDIR_LINUX_DEBUG)/support/EzGrid.o: support/EzGrid.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c support/EzGrid.cpp -o $(OBJDIR_LINUX_DEBUG)/support/EzGrid.o $(OBJDIR_LINUX_DEBUG)/sequencer/tabSequencer.o: sequencer/tabSequencer.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/tabSequencer.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/tabSequencer.o @@ -628,38 +641,38 @@ $(OBJDIR_LINUX_DEBUG)/sequencer/tabSequencer.o: sequencer/tabSequencer.cpp $(OBJDIR_LINUX_DEBUG)/sequencer/Waveform.o: sequencer/Waveform.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/Waveform.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/Waveform.o -$(OBJDIR_LINUX_DEBUG)/sequencer/UndoManager.o: sequencer/UndoManager.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/UndoManager.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/UndoManager.o - $(OBJDIR_LINUX_DEBUG)/sequencer/TimeLine.o: sequencer/TimeLine.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/TimeLine.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/TimeLine.o +$(OBJDIR_LINUX_DEBUG)/sequencer/SequenceElements.o: sequencer/SequenceElements.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/SequenceElements.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/SequenceElements.o + $(OBJDIR_LINUX_DEBUG)/sequencer/RowHeading.o: sequencer/RowHeading.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/RowHeading.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/RowHeading.o $(OBJDIR_LINUX_DEBUG)/sequencer/MainSequencer.o: sequencer/MainSequencer.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/MainSequencer.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/MainSequencer.o -$(OBJDIR_LINUX_DEBUG)/sequencer/Element.o: sequencer/Element.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c sequencer/Element.cpp -o $(OBJDIR_LINUX_DEBUG)/sequencer/Element.o +$(OBJDIR_LINUX_DEBUG)/wxCheckedListCtrl.o: wxCheckedListCtrl.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c wxCheckedListCtrl.cpp -o $(OBJDIR_LINUX_DEBUG)/wxCheckedListCtrl.o + +$(OBJDIR_LINUX_DEBUG)/wxWEBPHandler/imagwebp.o: wxWEBPHandler/imagwebp.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c wxWEBPHandler/imagwebp.cpp -o $(OBJDIR_LINUX_DEBUG)/wxWEBPHandler/imagwebp.o $(OBJDIR_LINUX_DEBUG)/wxModelGridCellRenderer.o: wxModelGridCellRenderer.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c wxModelGridCellRenderer.cpp -o $(OBJDIR_LINUX_DEBUG)/wxModelGridCellRenderer.o -$(OBJDIR_LINUX_DEBUG)/wxCheckedListCtrl.o: wxCheckedListCtrl.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c wxCheckedListCtrl.cpp -o $(OBJDIR_LINUX_DEBUG)/wxCheckedListCtrl.o - $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/host-c.o: vamp-hostsdk/host-c.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/host-c.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/host-c.o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/acsymbols.o: vamp-hostsdk/acsymbols.c $(CC) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/acsymbols.c -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/acsymbols.o -$(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/RealTime.o: vamp-hostsdk/RealTime.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c vamp-hostsdk/RealTime.cpp -o $(OBJDIR_LINUX_DEBUG)/vamp-hostsdk/RealTime.o +$(OBJDIR_LINUX_DEBUG)/effects/SketchEffectDrawing.o: effects/SketchEffectDrawing.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SketchEffectDrawing.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffectDrawing.o -$(OBJDIR_LINUX_DEBUG)/MultiControllerUploadDialog.o: MultiControllerUploadDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MultiControllerUploadDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/MultiControllerUploadDialog.o +$(OBJDIR_LINUX_DEBUG)/ModelGroupPanel.o: ModelGroupPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelGroupPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelGroupPanel.o $(OBJDIR_LINUX_DEBUG)/Mouse3DManager.o: Mouse3DManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c Mouse3DManager.cpp -o $(OBJDIR_LINUX_DEBUG)/Mouse3DManager.o @@ -670,14 +683,11 @@ $(OBJDIR_LINUX_DEBUG)/ModelStateDialog.o: ModelStateDialog.cpp $(OBJDIR_LINUX_DEBUG)/ModelRemap.o: ModelRemap.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelRemap.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelRemap.o -$(OBJDIR_LINUX_DEBUG)/MusicXML.o: MusicXML.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MusicXML.cpp -o $(OBJDIR_LINUX_DEBUG)/MusicXML.o - $(OBJDIR_LINUX_DEBUG)/ModelPreview.o: ModelPreview.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelPreview.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelPreview.o -$(OBJDIR_LINUX_DEBUG)/ModelGroupPanel.o: ModelGroupPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelGroupPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelGroupPanel.o +$(OBJDIR_LINUX_DEBUG)/MultiControllerUploadDialog.o: MultiControllerUploadDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MultiControllerUploadDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/MultiControllerUploadDialog.o $(OBJDIR_LINUX_DEBUG)/ModelFaceDialog.o: ModelFaceDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelFaceDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelFaceDialog.o @@ -685,8 +695,11 @@ $(OBJDIR_LINUX_DEBUG)/ModelFaceDialog.o: ModelFaceDialog.cpp $(OBJDIR_LINUX_DEBUG)/ModelDimmingCurveDialog.o: ModelDimmingCurveDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelDimmingCurveDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelDimmingCurveDialog.o -$(OBJDIR_LINUX_DEBUG)/PaletteMgmtDialog.o: PaletteMgmtDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PaletteMgmtDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/PaletteMgmtDialog.o +$(OBJDIR_LINUX_DEBUG)/ModelChainDialog.o: ModelChainDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelChainDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelChainDialog.o + +$(OBJDIR_LINUX_DEBUG)/MetronomeLabelDialog.o: MetronomeLabelDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MetronomeLabelDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/MetronomeLabelDialog.o $(OBJDIR_LINUX_DEBUG)/OutputModelManager.o: OutputModelManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputModelManager.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputModelManager.o @@ -700,9 +713,6 @@ $(OBJDIR_LINUX_DEBUG)/OpenGLShaders.o: OpenGLShaders.cpp $(OBJDIR_LINUX_DEBUG)/NoteRangeDialog.o: NoteRangeDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c NoteRangeDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/NoteRangeDialog.o -$(OBJDIR_LINUX_DEBUG)/ModelChainDialog.o: ModelChainDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ModelChainDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ModelChainDialog.o - $(OBJDIR_LINUX_DEBUG)/NoteImportDialog.o: NoteImportDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c NoteImportDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/NoteImportDialog.o @@ -715,11 +725,8 @@ $(OBJDIR_LINUX_DEBUG)/NodeSelectGrid.o: NodeSelectGrid.cpp $(OBJDIR_LINUX_DEBUG)/NewTimingDialog.o: NewTimingDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c NewTimingDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/NewTimingDialog.o -$(OBJDIR_LINUX_DEBUG)/LORPreview.o: LORPreview.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LORPreview.cpp -o $(OBJDIR_LINUX_DEBUG)/LORPreview.o - -$(OBJDIR_LINUX_DEBUG)/LayoutUtils.o: LayoutUtils.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LayoutUtils.cpp -o $(OBJDIR_LINUX_DEBUG)/LayoutUtils.o +$(OBJDIR_LINUX_DEBUG)/MusicXML.o: MusicXML.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MusicXML.cpp -o $(OBJDIR_LINUX_DEBUG)/MusicXML.o $(OBJDIR_LINUX_DEBUG)/LayoutPanel.o: LayoutPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LayoutPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/LayoutPanel.o @@ -730,6 +737,12 @@ $(OBJDIR_LINUX_DEBUG)/LayoutGroup.o: LayoutGroup.cpp $(OBJDIR_LINUX_DEBUG)/LayerSelectDialog.o: LayerSelectDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LayerSelectDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/LayerSelectDialog.o +$(OBJDIR_LINUX_DEBUG)/LORPreview.o: LORPreview.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LORPreview.cpp -o $(OBJDIR_LINUX_DEBUG)/LORPreview.o + +$(OBJDIR_LINUX_DEBUG)/LayoutUtils.o: LayoutUtils.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LayoutUtils.cpp -o $(OBJDIR_LINUX_DEBUG)/LayoutUtils.o + $(OBJDIR_LINUX_DEBUG)/LOREdit.o: LOREdit.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LOREdit.cpp -o $(OBJDIR_LINUX_DEBUG)/LOREdit.o @@ -742,9 +755,6 @@ $(OBJDIR_LINUX_DEBUG)/KeyBindings.o: KeyBindings.cpp $(OBJDIR_LINUX_DEBUG)/KeyBindingEditDialog.o: KeyBindingEditDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c KeyBindingEditDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/KeyBindingEditDialog.o -$(OBJDIR_LINUX_DEBUG)/MIDI/Binasc.o: MIDI/Binasc.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MIDI/Binasc.cpp -o $(OBJDIR_LINUX_DEBUG)/MIDI/Binasc.o - $(OBJDIR_LINUX_DEBUG)/MediaImportOptionsDialog.o: MediaImportOptionsDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MediaImportOptionsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/MediaImportOptionsDialog.o @@ -763,6 +773,9 @@ $(OBJDIR_LINUX_DEBUG)/MIDI/MidiEventList.o: MIDI/MidiEventList.cpp $(OBJDIR_LINUX_DEBUG)/MIDI/MidiEvent.o: MIDI/MidiEvent.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MIDI/MidiEvent.cpp -o $(OBJDIR_LINUX_DEBUG)/MIDI/MidiEvent.o +$(OBJDIR_LINUX_DEBUG)/MIDI/Binasc.o: MIDI/Binasc.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MIDI/Binasc.cpp -o $(OBJDIR_LINUX_DEBUG)/MIDI/Binasc.o + $(OBJDIR_LINUX_DEBUG)/LyricsDialog.o: LyricsDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LyricsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/LyricsDialog.o @@ -775,9 +788,6 @@ $(OBJDIR_LINUX_DEBUG)/LorConvertDialog.o: LorConvertDialog.cpp $(OBJDIR_LINUX_DEBUG)/LinkJukeboxButtonDialog.o: LinkJukeboxButtonDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c LinkJukeboxButtonDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/LinkJukeboxButtonDialog.o -$(OBJDIR_LINUX_DEBUG)/SeqElementMismatchDialog.o: SeqElementMismatchDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SeqElementMismatchDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/SeqElementMismatchDialog.o - $(OBJDIR_LINUX_DEBUG)/SequenceData.o: SequenceData.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SequenceData.cpp -o $(OBJDIR_LINUX_DEBUG)/SequenceData.o @@ -790,6 +800,9 @@ $(OBJDIR_LINUX_DEBUG)/SeqFileUtilities.o: SeqFileUtilities.cpp $(OBJDIR_LINUX_DEBUG)/SeqExportDialog.o: SeqExportDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SeqExportDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/SeqExportDialog.o +$(OBJDIR_LINUX_DEBUG)/SeqElementMismatchDialog.o: SeqElementMismatchDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SeqElementMismatchDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/SeqElementMismatchDialog.o + $(OBJDIR_LINUX_DEBUG)/SelectTimingsDialog.o: SelectTimingsDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SelectTimingsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/SelectTimingsDialog.o @@ -817,6 +830,9 @@ $(OBJDIR_LINUX_DEBUG)/SplashDialog.o: SplashDialog.cpp $(OBJDIR_LINUX_DEBUG)/ShaderDownloadDialog.o: ShaderDownloadDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ShaderDownloadDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ShaderDownloadDialog.o +$(OBJDIR_LINUX_DEBUG)/SaveChangesDialog.o: SaveChangesDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SaveChangesDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/SaveChangesDialog.o + $(OBJDIR_LINUX_DEBUG)/SequenceViewManager.o: SequenceViewManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SequenceViewManager.cpp -o $(OBJDIR_LINUX_DEBUG)/SequenceViewManager.o @@ -829,11 +845,8 @@ $(OBJDIR_LINUX_DEBUG)/SequenceVideoPanel.o: SequenceVideoPanel.cpp $(OBJDIR_LINUX_DEBUG)/SequencePackage.o: SequencePackage.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SequencePackage.cpp -o $(OBJDIR_LINUX_DEBUG)/SequencePackage.o -$(OBJDIR_LINUX_DEBUG)/PixelBuffer.o: PixelBuffer.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PixelBuffer.cpp -o $(OBJDIR_LINUX_DEBUG)/PixelBuffer.o - -$(OBJDIR_LINUX_DEBUG)/RemapDMXChannelsDialog.o: RemapDMXChannelsDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c RemapDMXChannelsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/RemapDMXChannelsDialog.o +$(OBJDIR_LINUX_DEBUG)/PhonemeDictionary.o: PhonemeDictionary.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PhonemeDictionary.cpp -o $(OBJDIR_LINUX_DEBUG)/PhonemeDictionary.o $(OBJDIR_LINUX_DEBUG)/PreviewPane.o: PreviewPane.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PreviewPane.cpp -o $(OBJDIR_LINUX_DEBUG)/PreviewPane.o @@ -844,8 +857,8 @@ $(OBJDIR_LINUX_DEBUG)/Pixels.o: Pixels.cpp $(OBJDIR_LINUX_DEBUG)/PixelTestDialog.o: PixelTestDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PixelTestDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/PixelTestDialog.o -$(OBJDIR_LINUX_DEBUG)/PhonemeDictionary.o: PhonemeDictionary.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PhonemeDictionary.cpp -o $(OBJDIR_LINUX_DEBUG)/PhonemeDictionary.o +$(OBJDIR_LINUX_DEBUG)/PixelBuffer.o: PixelBuffer.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PixelBuffer.cpp -o $(OBJDIR_LINUX_DEBUG)/PixelBuffer.o $(OBJDIR_LINUX_DEBUG)/PerspectivesPanel.o: PerspectivesPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PerspectivesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PerspectivesPanel.o @@ -856,8 +869,8 @@ $(OBJDIR_LINUX_DEBUG)/PathGenerationDialog.o: PathGenerationDialog.cpp $(OBJDIR_LINUX_DEBUG)/Parallel.o: Parallel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c Parallel.cpp -o $(OBJDIR_LINUX_DEBUG)/Parallel.o -$(OBJDIR_LINUX_DEBUG)/SaveChangesDialog.o: SaveChangesDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SaveChangesDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/SaveChangesDialog.o +$(OBJDIR_LINUX_DEBUG)/PaletteMgmtDialog.o: PaletteMgmtDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PaletteMgmtDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/PaletteMgmtDialog.o $(OBJDIR_LINUX_DEBUG)/RestoreBackupDialog.o: RestoreBackupDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c RestoreBackupDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/RestoreBackupDialog.o @@ -868,6 +881,9 @@ $(OBJDIR_LINUX_DEBUG)/ResizeImageDialog.o: ResizeImageDialog.cpp $(OBJDIR_LINUX_DEBUG)/RenderProgressDialog.o: RenderProgressDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c RenderProgressDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/RenderProgressDialog.o +$(OBJDIR_LINUX_DEBUG)/JukeboxPanel.o: JukeboxPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c JukeboxPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/JukeboxPanel.o + $(OBJDIR_LINUX_DEBUG)/RenderCache.o: RenderCache.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c RenderCache.cpp -o $(OBJDIR_LINUX_DEBUG)/RenderCache.o @@ -880,8 +896,8 @@ $(OBJDIR_LINUX_DEBUG)/Render.o: Render.cpp $(OBJDIR_LINUX_DEBUG)/RenameTextDialog.o: RenameTextDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c RenameTextDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/RenameTextDialog.o -$(OBJDIR_LINUX_DEBUG)/BulkEditFontPickerDialog.o: BulkEditFontPickerDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BulkEditFontPickerDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/BulkEditFontPickerDialog.o +$(OBJDIR_LINUX_DEBUG)/RemapDMXChannelsDialog.o: RemapDMXChannelsDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c RemapDMXChannelsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/RemapDMXChannelsDialog.o $(OBJDIR_LINUX_DEBUG)/CharMapDialog.o: CharMapDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c CharMapDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/CharMapDialog.o @@ -895,6 +911,9 @@ $(OBJDIR_LINUX_DEBUG)/CachedFileDownloader.o: CachedFileDownloader.cpp $(OBJDIR_LINUX_DEBUG)/BulkEditSliderDialog.o: BulkEditSliderDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BulkEditSliderDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/BulkEditSliderDialog.o +$(OBJDIR_LINUX_DEBUG)/BulkEditFontPickerDialog.o: BulkEditFontPickerDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BulkEditFontPickerDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/BulkEditFontPickerDialog.o + $(OBJDIR_LINUX_DEBUG)/BulkEditControls.o: BulkEditControls.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BulkEditControls.cpp -o $(OBJDIR_LINUX_DEBUG)/BulkEditControls.o @@ -919,6 +938,9 @@ $(OBJDIR_LINUX_DEBUG)/ColourReplaceDialog.o: ColourReplaceDialog.cpp $(OBJDIR_LINUX_DEBUG)/ColorPanel.o: ColorPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ColorPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/ColorPanel.o +$(OBJDIR_LINUX_DEBUG)/BufferPanel.o: BufferPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BufferPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/BufferPanel.o + $(OBJDIR_LINUX_DEBUG)/ColorManager.o: ColorManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ColorManager.cpp -o $(OBJDIR_LINUX_DEBUG)/ColorManager.o @@ -967,8 +989,8 @@ $(OBJDIR_LINUX_DEBUG)/__/xSchedule/md5.o: ../xSchedule/md5.cpp $(OBJDIR_LINUX_DEBUG)/__/xFade/wxLED.o: ../xFade/wxLED.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xFade/wxLED.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xFade/wxLED.o -$(OBJDIR_LINUX_DEBUG)/BufferPanel.o: BufferPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BufferPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/BufferPanel.o +$(OBJDIR_LINUX_DEBUG)/AlignmentDialog.o: AlignmentDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c AlignmentDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/AlignmentDialog.o $(OBJDIR_LINUX_DEBUG)/BitmapCache.o: BitmapCache.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BitmapCache.cpp -o $(OBJDIR_LINUX_DEBUG)/BitmapCache.o @@ -976,12 +998,12 @@ $(OBJDIR_LINUX_DEBUG)/BitmapCache.o: BitmapCache.cpp $(OBJDIR_LINUX_DEBUG)/BatchRenderDialog.o: BatchRenderDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c BatchRenderDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/BatchRenderDialog.o +$(OBJDIR_LINUX_DEBUG)/AutoLabelDialog.o: AutoLabelDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c AutoLabelDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/AutoLabelDialog.o + $(OBJDIR_LINUX_DEBUG)/AudioManager.o: AudioManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c AudioManager.cpp -o $(OBJDIR_LINUX_DEBUG)/AudioManager.o -$(OBJDIR_LINUX_DEBUG)/AlignmentDialog.o: AlignmentDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c AlignmentDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/AlignmentDialog.o - $(OBJDIR_LINUX_DEBUG)/ControllerModelDialog.o: ControllerModelDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ControllerModelDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ControllerModelDialog.o @@ -997,6 +1019,9 @@ $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonval.o: ../xSchedule/wxJSON/jsonval $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonreader.o: ../xSchedule/wxJSON/jsonreader.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xSchedule/wxJSON/jsonreader.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonreader.o +$(OBJDIR_LINUX_DEBUG)/ExportSettings.o: ExportSettings.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ExportSettings.cpp -o $(OBJDIR_LINUX_DEBUG)/ExportSettings.o + $(OBJDIR_LINUX_DEBUG)/FlickerFreeBitmapButton.o: FlickerFreeBitmapButton.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c FlickerFreeBitmapButton.cpp -o $(OBJDIR_LINUX_DEBUG)/FlickerFreeBitmapButton.o @@ -1009,12 +1034,6 @@ $(OBJDIR_LINUX_DEBUG)/FileConverter.o: FileConverter.cpp $(OBJDIR_LINUX_DEBUG)/FSEQFile.o: FSEQFile.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c FSEQFile.cpp -o $(OBJDIR_LINUX_DEBUG)/FSEQFile.o -$(OBJDIR_LINUX_DEBUG)/FontManager.o: FontManager.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c FontManager.cpp -o $(OBJDIR_LINUX_DEBUG)/FontManager.o - -$(OBJDIR_LINUX_DEBUG)/ExportSettings.o: ExportSettings.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ExportSettings.cpp -o $(OBJDIR_LINUX_DEBUG)/ExportSettings.o - $(OBJDIR_LINUX_DEBUG)/ExportModelSelect.o: ExportModelSelect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ExportModelSelect.cpp -o $(OBJDIR_LINUX_DEBUG)/ExportModelSelect.o @@ -1024,8 +1043,11 @@ $(OBJDIR_LINUX_DEBUG)/EmailDialog.o: EmailDialog.cpp $(OBJDIR_LINUX_DEBUG)/EffectsPanel.o: EffectsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EffectsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EffectsPanel.o -$(OBJDIR_LINUX_DEBUG)/JukeboxPanel.o: JukeboxPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c JukeboxPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/JukeboxPanel.o +$(OBJDIR_LINUX_DEBUG)/EffectTreeDialog.o: EffectTreeDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EffectTreeDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/EffectTreeDialog.o + +$(OBJDIR_LINUX_DEBUG)/HousePreviewPanel.o: HousePreviewPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c HousePreviewPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/HousePreviewPanel.o $(OBJDIR_LINUX_DEBUG)/JobPool.o: JobPool.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c JobPool.cpp -o $(OBJDIR_LINUX_DEBUG)/JobPool.o @@ -1036,12 +1058,6 @@ $(OBJDIR_LINUX_DEBUG)/ImportPreviewsModelsDialog.o: ImportPreviewsModelsDialog.c $(OBJDIR_LINUX_DEBUG)/IPEntryDialog.o: IPEntryDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c IPEntryDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/IPEntryDialog.o -$(OBJDIR_LINUX_DEBUG)/EffectTreeDialog.o: EffectTreeDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EffectTreeDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/EffectTreeDialog.o - -$(OBJDIR_LINUX_DEBUG)/HousePreviewPanel.o: HousePreviewPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c HousePreviewPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/HousePreviewPanel.o - $(OBJDIR_LINUX_DEBUG)/GenerateLyricsDialog.o: GenerateLyricsDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c GenerateLyricsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/GenerateLyricsDialog.o @@ -1051,6 +1067,9 @@ $(OBJDIR_LINUX_DEBUG)/GenerateCustomModelDialog.o: GenerateCustomModelDialog.cpp $(OBJDIR_LINUX_DEBUG)/GPURenderUtils.o: GPURenderUtils.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c GPURenderUtils.cpp -o $(OBJDIR_LINUX_DEBUG)/GPURenderUtils.o +$(OBJDIR_LINUX_DEBUG)/FontManager.o: FontManager.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c FontManager.cpp -o $(OBJDIR_LINUX_DEBUG)/FontManager.o + $(OBJDIR_LINUX_DEBUG)/DimmingCurvePanel.o: DimmingCurvePanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c DimmingCurvePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/DimmingCurvePanel.o @@ -1078,6 +1097,9 @@ $(OBJDIR_LINUX_DEBUG)/ConvertLogDialog.o: ConvertLogDialog.cpp $(OBJDIR_LINUX_DEBUG)/ConvertDialog.o: ConvertDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ConvertDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ConvertDialog.o +$(OBJDIR_LINUX_DEBUG)/EditAliasesDialog.o: EditAliasesDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EditAliasesDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/EditAliasesDialog.o + $(OBJDIR_LINUX_DEBUG)/EffectTimingDialog.o: EffectTimingDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EffectTimingDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/EffectTimingDialog.o @@ -1102,21 +1124,12 @@ $(OBJDIR_LINUX_DEBUG)/DragColoursBitmapButton.o: DragColoursBitmapButton.cpp $(OBJDIR_LINUX_DEBUG)/DissolveTransitionPattern.o: DissolveTransitionPattern.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c DissolveTransitionPattern.cpp -o $(OBJDIR_LINUX_DEBUG)/DissolveTransitionPattern.o -$(OBJDIR_LINUX_DEBUG)/effects/LifeEffect.o: effects/LifeEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LifeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LifeEffect.o - -$(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopePanel.o: effects/KaleidoscopePanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/KaleidoscopePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopePanel.o - $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopeEffect.o: effects/KaleidoscopeEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/KaleidoscopeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/GuitarPanel.o: effects/GuitarPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GuitarPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GuitarPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/LifePanel.o: effects/LifePanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LifePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LifePanel.o - $(OBJDIR_LINUX_DEBUG)/effects/GuitarEffect.o: effects/GuitarEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GuitarEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GuitarEffect.o @@ -1129,11 +1142,17 @@ $(OBJDIR_LINUX_DEBUG)/effects/GlediatorEffect.o: effects/GlediatorEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/GarlandsPanel.o: effects/GarlandsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GarlandsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GarlandsPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/MarqueePanel.o: effects/MarqueePanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MarqueePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MarqueePanel.o +$(OBJDIR_LINUX_DEBUG)/effects/GarlandsEffect.o: effects/GarlandsEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GarlandsEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GarlandsEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/MarqueeEffect.o: effects/MarqueeEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MarqueeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MarqueeEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/GalaxyPanel.o: effects/GalaxyPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GalaxyPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyPanel.o + +$(OBJDIR_LINUX_DEBUG)/effects/GalaxyEffect.o: effects/GalaxyEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GalaxyEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyEffect.o + +$(OBJDIR_LINUX_DEBUG)/effects/LightningPanel.o: effects/LightningPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LightningPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LightningPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LiquidPanel.o: effects/LiquidPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LiquidPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LiquidPanel.o @@ -1141,35 +1160,29 @@ $(OBJDIR_LINUX_DEBUG)/effects/LiquidPanel.o: effects/LiquidPanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/LiquidEffect.o: effects/LiquidEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LiquidEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LiquidEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/GarlandsEffect.o: effects/GarlandsEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GarlandsEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GarlandsEffect.o - $(OBJDIR_LINUX_DEBUG)/effects/LinesPanel.o: effects/LinesPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LinesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LinesPanel.o $(OBJDIR_LINUX_DEBUG)/effects/LinesEffect.o: effects/LinesEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LinesEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LinesEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/LightningPanel.o: effects/LightningPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LightningPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LightningPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/GIFImage.o: effects/GIFImage.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GIFImage.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GIFImage.o $(OBJDIR_LINUX_DEBUG)/effects/LightningEffect.o: effects/LightningEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LightningEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LightningEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/FacesEffect.o: effects/FacesEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FacesEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FacesEffect.o - -$(OBJDIR_LINUX_DEBUG)/effects/FillEffect.o: effects/FillEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FillEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FillEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/LifePanel.o: effects/LifePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LifePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LifePanel.o -$(OBJDIR_LINUX_DEBUG)/effects/FanPanel.o: effects/FanPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FanPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FanPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/LifeEffect.o: effects/LifeEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/LifeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/LifeEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/FanEffect.o: effects/FanEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FanEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FanEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopePanel.o: effects/KaleidoscopePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/KaleidoscopePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/KaleidoscopePanel.o -$(OBJDIR_LINUX_DEBUG)/effects/FacesPanel.o: effects/FacesPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FacesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FacesPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/FacesEffect.o: effects/FacesEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FacesEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FacesEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FX.o: effects/FX.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FX.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FX.o @@ -1180,24 +1193,24 @@ $(OBJDIR_LINUX_DEBUG)/effects/EffectPanelUtils.o: effects/EffectPanelUtils.cpp $(OBJDIR_LINUX_DEBUG)/effects/EffectManager.o: effects/EffectManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/EffectManager.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/EffectManager.o -$(OBJDIR_LINUX_DEBUG)/effects/DMXPanel.o: effects/DMXPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/DMXPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/DMXPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/FacesPanel.o: effects/FacesPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FacesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FacesPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/GalaxyPanel.o: effects/GalaxyPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GalaxyPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/DuplicatePanel.o: effects/DuplicatePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/DuplicatePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/DuplicatePanel.o -$(OBJDIR_LINUX_DEBUG)/effects/GalaxyEffect.o: effects/GalaxyEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GalaxyEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GalaxyEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/DuplicateEffect.o: effects/DuplicateEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/DuplicateEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/DuplicateEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/GIFImage.o: effects/GIFImage.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/GIFImage.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/GIFImage.o +$(OBJDIR_LINUX_DEBUG)/effects/DMXPanel.o: effects/DMXPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/DMXPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/DMXPanel.o + +$(OBJDIR_LINUX_DEBUG)/effects/DMXEffect.o: effects/DMXEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/DMXEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/DMXEffect.o $(OBJDIR_LINUX_DEBUG)/effects/FireworksPanel.o: effects/FireworksPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FireworksPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FireworksPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/MeteorsEffect.o: effects/MeteorsEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MeteorsEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MeteorsEffect.o - $(OBJDIR_LINUX_DEBUG)/effects/FireworksEffect.o: effects/FireworksEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FireworksEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FireworksEffect.o @@ -1210,14 +1223,17 @@ $(OBJDIR_LINUX_DEBUG)/effects/FireEffect.o: effects/FireEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/FillPanel.o: effects/FillPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FillPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FillPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/ServoPanel.o: effects/ServoPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ServoPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ServoPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/FillEffect.o: effects/FillEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FillEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FillEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/ShapePanel.o: effects/ShapePanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShapePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShapePanel.o +$(OBJDIR_LINUX_DEBUG)/effects/FanPanel.o: effects/FanPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FanPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FanPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/ShapeEffect.o: effects/ShapeEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShapeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShapeEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/FanEffect.o: effects/FanEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/FanEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/FanEffect.o + +$(OBJDIR_LINUX_DEBUG)/effects/RipplePanel.o: effects/RipplePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/RipplePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/RipplePanel.o $(OBJDIR_LINUX_DEBUG)/effects/ShaderPanel.o: effects/ShaderPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShaderPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShaderPanel.o @@ -1225,11 +1241,14 @@ $(OBJDIR_LINUX_DEBUG)/effects/ShaderPanel.o: effects/ShaderPanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/ShaderEffect.o: effects/ShaderEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShaderEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShaderEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/ServoPanel.o: effects/ServoPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ServoPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ServoPanel.o + $(OBJDIR_LINUX_DEBUG)/effects/ServoEffect.o: effects/ServoEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ServoEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ServoEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/RipplePanel.o: effects/RipplePanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/RipplePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/RipplePanel.o +$(OBJDIR_LINUX_DEBUG)/effects/ShapeEffect.o: effects/ShapeEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShapeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShapeEffect.o $(OBJDIR_LINUX_DEBUG)/effects/RippleEffect.o: effects/RippleEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/RippleEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/RippleEffect.o @@ -1237,14 +1256,11 @@ $(OBJDIR_LINUX_DEBUG)/effects/RippleEffect.o: effects/RippleEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/RenderableEffect.o: effects/RenderableEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/RenderableEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/RenderableEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/SingleStrandEffect.o: effects/SingleStrandEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SingleStrandEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandEffect.o - -$(OBJDIR_LINUX_DEBUG)/effects/SketchPanel.o: effects/SketchPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SketchPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SketchPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/PlasmaPanel.o: effects/PlasmaPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PlasmaPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/SketchEffectDrawing.o: effects/SketchEffectDrawing.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SketchEffectDrawing.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffectDrawing.o +$(OBJDIR_LINUX_DEBUG)/effects/PlasmaEffect.o: effects/PlasmaEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PlasmaEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaEffect.o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffect.o: effects/SketchEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SketchEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SketchEffect.o @@ -1252,6 +1268,9 @@ $(OBJDIR_LINUX_DEBUG)/effects/SketchEffect.o: effects/SketchEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandPanel.o: effects/SingleStrandPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SingleStrandPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/SingleStrandEffect.o: effects/SingleStrandEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/SingleStrandEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/SingleStrandEffect.o + $(OBJDIR_LINUX_DEBUG)/effects/ShockwavePanel.o: effects/ShockwavePanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShockwavePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShockwavePanel.o @@ -1264,11 +1283,11 @@ $(OBJDIR_LINUX_DEBUG)/effects/ShimmerPanel.o: effects/ShimmerPanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/ShimmerEffect.o: effects/ShimmerEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShimmerEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShimmerEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/OnEffect.o: effects/OnEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/OnEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/OnEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/ShapePanel.o: effects/ShapePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ShapePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ShapePanel.o -$(OBJDIR_LINUX_DEBUG)/effects/OffPanel.o: effects/OffPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/OffPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/OffPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/MorphEffect.o: effects/MorphEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MorphEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MorphEffect.o $(OBJDIR_LINUX_DEBUG)/effects/OffEffect.o: effects/OffEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/OffEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/OffEffect.o @@ -1276,29 +1295,26 @@ $(OBJDIR_LINUX_DEBUG)/effects/OffEffect.o: effects/OffEffect.cpp $(OBJDIR_LINUX_DEBUG)/effects/MusicPanel.o: effects/MusicPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MusicPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MusicPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/OnPanel.o: effects/OnPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/OnPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/OnPanel.o - $(OBJDIR_LINUX_DEBUG)/effects/MusicEffect.o: effects/MusicEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MusicEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MusicEffect.o $(OBJDIR_LINUX_DEBUG)/effects/MorphPanel.o: effects/MorphPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MorphPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MorphPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/MorphEffect.o: effects/MorphEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MorphEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MorphEffect.o - $(OBJDIR_LINUX_DEBUG)/effects/MeteorsPanel.o: effects/MeteorsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MeteorsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MeteorsPanel.o -$(OBJDIR_LINUX_DEBUG)/effects/PicturesPanel.o: effects/PicturesPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PicturesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PicturesPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/MeteorsEffect.o: effects/MeteorsEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MeteorsEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MeteorsEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/PlasmaPanel.o: effects/PlasmaPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PlasmaPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/MarqueePanel.o: effects/MarqueePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MarqueePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MarqueePanel.o -$(OBJDIR_LINUX_DEBUG)/effects/PlasmaEffect.o: effects/PlasmaEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PlasmaEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PlasmaEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/MarqueeEffect.o: effects/MarqueeEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/MarqueeEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/MarqueeEffect.o + +$(OBJDIR_LINUX_DEBUG)/effects/PianoPanel.o: effects/PianoPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PianoPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PianoPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PinwheelPanel.o: effects/PinwheelPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PinwheelPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PinwheelPanel.o @@ -1306,15 +1322,33 @@ $(OBJDIR_LINUX_DEBUG)/effects/PinwheelPanel.o: effects/PinwheelPanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/PinwheelEffect.o: effects/PinwheelEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PinwheelEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PinwheelEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/PicturesPanel.o: effects/PicturesPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PicturesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PicturesPanel.o + $(OBJDIR_LINUX_DEBUG)/effects/PicturesEffect.o: effects/PicturesEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PicturesEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PicturesEffect.o -$(OBJDIR_LINUX_DEBUG)/effects/PianoPanel.o: effects/PianoPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PianoPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PianoPanel.o +$(OBJDIR_LINUX_DEBUG)/effects/CurtainPanel.o: effects/CurtainPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/CurtainPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/CurtainPanel.o $(OBJDIR_LINUX_DEBUG)/effects/PianoEffect.o: effects/PianoEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/PianoEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/PianoEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/OnPanel.o: effects/OnPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/OnPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/OnPanel.o + +$(OBJDIR_LINUX_DEBUG)/effects/OnEffect.o: effects/OnEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/OnEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/OnEffect.o + +$(OBJDIR_LINUX_DEBUG)/effects/OffPanel.o: effects/OffPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/OffPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/OffPanel.o + +$(OBJDIR_LINUX_DEBUG)/VideoExporter.o: VideoExporter.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c VideoExporter.cpp -o $(OBJDIR_LINUX_DEBUG)/VideoExporter.o + +$(OBJDIR_LINUX_DEBUG)/ViewpointMgr.o: ViewpointMgr.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ViewpointMgr.cpp -o $(OBJDIR_LINUX_DEBUG)/ViewpointMgr.o + $(OBJDIR_LINUX_DEBUG)/ViewpointDialog.o: ViewpointDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ViewpointDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ViewpointDialog.o @@ -1324,11 +1358,8 @@ $(OBJDIR_LINUX_DEBUG)/ViewObjectPanel.o: ViewObjectPanel.cpp $(OBJDIR_LINUX_DEBUG)/VideoReader.o: VideoReader.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c VideoReader.cpp -o $(OBJDIR_LINUX_DEBUG)/VideoReader.o -$(OBJDIR_LINUX_DEBUG)/VideoExporter.o: VideoExporter.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c VideoExporter.cpp -o $(OBJDIR_LINUX_DEBUG)/VideoExporter.o - -$(OBJDIR_LINUX_DEBUG)/ViewpointMgr.o: ViewpointMgr.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ViewpointMgr.cpp -o $(OBJDIR_LINUX_DEBUG)/ViewpointMgr.o +$(OBJDIR_LINUX_DEBUG)/ViewsModelsPanel.o: ViewsModelsPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ViewsModelsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/ViewsModelsPanel.o $(OBJDIR_LINUX_DEBUG)/VendorMusicHelpers.o: VendorMusicHelpers.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c VendorMusicHelpers.cpp -o $(OBJDIR_LINUX_DEBUG)/VendorMusicHelpers.o @@ -1342,6 +1373,12 @@ $(OBJDIR_LINUX_DEBUG)/VendorModelDialog.o: VendorModelDialog.cpp $(OBJDIR_LINUX_DEBUG)/ValueCurvesPanel.o: ValueCurvesPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ValueCurvesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/ValueCurvesPanel.o +$(OBJDIR_LINUX_DEBUG)/automation/LuaRunner.o: automation/LuaRunner.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c automation/LuaRunner.cpp -o $(OBJDIR_LINUX_DEBUG)/automation/LuaRunner.o + +$(OBJDIR_LINUX_DEBUG)/cad/CADWriter.o: cad/CADWriter.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c cad/CADWriter.cpp -o $(OBJDIR_LINUX_DEBUG)/cad/CADWriter.o + $(OBJDIR_LINUX_DEBUG)/cad/CADModel.o: cad/CADModel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c cad/CADModel.cpp -o $(OBJDIR_LINUX_DEBUG)/cad/CADModel.o @@ -1351,12 +1388,6 @@ $(OBJDIR_LINUX_DEBUG)/automation/xLightsAutomations.o: automation/xLightsAutomat $(OBJDIR_LINUX_DEBUG)/automation/automation.o: automation/automation.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c automation/automation.cpp -o $(OBJDIR_LINUX_DEBUG)/automation/automation.o -$(OBJDIR_LINUX_DEBUG)/automation/LuaRunner.o: automation/LuaRunner.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c automation/LuaRunner.cpp -o $(OBJDIR_LINUX_DEBUG)/automation/LuaRunner.o - -$(OBJDIR_LINUX_DEBUG)/ValueCurveDialog.o: ValueCurveDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ValueCurveDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ValueCurveDialog.o - $(OBJDIR_LINUX_DEBUG)/WiringDialog.o: WiringDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c WiringDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/WiringDialog.o @@ -1366,9 +1397,6 @@ $(OBJDIR_LINUX_DEBUG)/VsaImportDialog.o: VsaImportDialog.cpp $(OBJDIR_LINUX_DEBUG)/Vixen3.o: Vixen3.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c Vixen3.cpp -o $(OBJDIR_LINUX_DEBUG)/Vixen3.o -$(OBJDIR_LINUX_DEBUG)/ViewsModelsPanel.o: ViewsModelsPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ViewsModelsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/ViewsModelsPanel.o - $(OBJDIR_LINUX_DEBUG)/TabConvert.o: TabConvert.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c TabConvert.cpp -o $(OBJDIR_LINUX_DEBUG)/TabConvert.o @@ -1402,6 +1430,12 @@ $(OBJDIR_LINUX_DEBUG)/SubModelGenerateDialog.o: SubModelGenerateDialog.cpp $(OBJDIR_LINUX_DEBUG)/SubBufferPanel.o: SubBufferPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c SubBufferPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/SubBufferPanel.o +$(OBJDIR_LINUX_DEBUG)/VAMPPluginDialog.o: VAMPPluginDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c VAMPPluginDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/VAMPPluginDialog.o + +$(OBJDIR_LINUX_DEBUG)/ValueCurveDialog.o: ValueCurveDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ValueCurveDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ValueCurveDialog.o + $(OBJDIR_LINUX_DEBUG)/ValueCurveButton.o: ValueCurveButton.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ValueCurveButton.cpp -o $(OBJDIR_LINUX_DEBUG)/ValueCurveButton.o @@ -1411,9 +1445,6 @@ $(OBJDIR_LINUX_DEBUG)/ValueCurve.o: ValueCurve.cpp $(OBJDIR_LINUX_DEBUG)/VSAFile.o: VSAFile.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c VSAFile.cpp -o $(OBJDIR_LINUX_DEBUG)/VSAFile.o -$(OBJDIR_LINUX_DEBUG)/VAMPPluginDialog.o: VAMPPluginDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c VAMPPluginDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/VAMPPluginDialog.o - $(OBJDIR_LINUX_DEBUG)/UtilFunctions.o: UtilFunctions.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c UtilFunctions.cpp -o $(OBJDIR_LINUX_DEBUG)/UtilFunctions.o @@ -1426,11 +1457,8 @@ $(OBJDIR_LINUX_DEBUG)/UpdaterDialog.o: UpdaterDialog.cpp $(OBJDIR_LINUX_DEBUG)/TraceLog.o: TraceLog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c TraceLog.cpp -o $(OBJDIR_LINUX_DEBUG)/TraceLog.o -$(OBJDIR_LINUX_DEBUG)/effects/ButterflyPanel.o: effects/ButterflyPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ButterflyPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyPanel.o - -$(OBJDIR_LINUX_DEBUG)/effects/ButterflyEffect.o: effects/ButterflyEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ButterflyEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/AdjustEffect.o: effects/AdjustEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/AdjustEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/AdjustEffect.o $(OBJDIR_LINUX_DEBUG)/effects/BarsPanel.o: effects/BarsPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/BarsPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/BarsPanel.o @@ -1438,6 +1466,12 @@ $(OBJDIR_LINUX_DEBUG)/effects/BarsPanel.o: effects/BarsPanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/BarsEffect.o: effects/BarsEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/BarsEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/BarsEffect.o +$(OBJDIR_LINUX_DEBUG)/effects/AdjustPanel.o: effects/AdjustPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/AdjustPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/AdjustPanel.o + +$(OBJDIR_LINUX_DEBUG)/effects/ButterflyEffect.o: effects/ButterflyEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ButterflyEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyEffect.o + $(OBJDIR_LINUX_DEBUG)/controllers/WebSocketClient.o: controllers/WebSocketClient.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/WebSocketClient.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/WebSocketClient.o @@ -1450,23 +1484,14 @@ $(OBJDIR_LINUX_DEBUG)/controllers/SanDevices.o: controllers/SanDevices.cpp $(OBJDIR_LINUX_DEBUG)/controllers/Pixlite16.o: controllers/Pixlite16.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/Pixlite16.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/Pixlite16.o -$(OBJDIR_LINUX_DEBUG)/effects/ColorWashEffect.o: effects/ColorWashEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ColorWashEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashEffect.o - -$(OBJDIR_LINUX_DEBUG)/effects/DMXEffect.o: effects/DMXEffect.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/DMXEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/DMXEffect.o - -$(OBJDIR_LINUX_DEBUG)/effects/CurtainPanel.o: effects/CurtainPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/CurtainPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/CurtainPanel.o - $(OBJDIR_LINUX_DEBUG)/effects/CurtainEffect.o: effects/CurtainEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/CurtainEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/CurtainEffect.o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashPanel.o: effects/ColorWashPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ColorWashPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashPanel.o -$(OBJDIR_LINUX_DEBUG)/controllers/Minleon.o: controllers/Minleon.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/Minleon.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/Minleon.o +$(OBJDIR_LINUX_DEBUG)/effects/ColorWashEffect.o: effects/ColorWashEffect.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ColorWashEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ColorWashEffect.o $(OBJDIR_LINUX_DEBUG)/effects/CirclesPanel.o: effects/CirclesPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/CirclesPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/CirclesPanel.o @@ -1480,8 +1505,14 @@ $(OBJDIR_LINUX_DEBUG)/effects/CandlePanel.o: effects/CandlePanel.cpp $(OBJDIR_LINUX_DEBUG)/effects/CandleEffect.o: effects/CandleEffect.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/CandleEffect.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/CandleEffect.o -$(OBJDIR_LINUX_DEBUG)/cad/VRMLWriter.o: cad/VRMLWriter.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c cad/VRMLWriter.cpp -o $(OBJDIR_LINUX_DEBUG)/cad/VRMLWriter.o +$(OBJDIR_LINUX_DEBUG)/effects/ButterflyPanel.o: effects/ButterflyPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c effects/ButterflyPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/effects/ButterflyPanel.o + +$(OBJDIR_LINUX_DEBUG)/controllers/AlphaPix.o: controllers/AlphaPix.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/AlphaPix.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/AlphaPix.o + +$(OBJDIR_LINUX_DEBUG)/controllers/ESPixelStick.o: controllers/ESPixelStick.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/ESPixelStick.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/ESPixelStick.o $(OBJDIR_LINUX_DEBUG)/controllers/ControllerUploadData.o: controllers/ControllerUploadData.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/ControllerUploadData.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/ControllerUploadData.o @@ -1492,8 +1523,8 @@ $(OBJDIR_LINUX_DEBUG)/controllers/ControllerCaps.o: controllers/ControllerCaps.c $(OBJDIR_LINUX_DEBUG)/controllers/BaseController.o: controllers/BaseController.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/BaseController.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/BaseController.o -$(OBJDIR_LINUX_DEBUG)/controllers/AlphaPix.o: controllers/AlphaPix.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/AlphaPix.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/AlphaPix.o +$(OBJDIR_LINUX_DEBUG)/cad/VRMLWriter.o: cad/VRMLWriter.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c cad/VRMLWriter.cpp -o $(OBJDIR_LINUX_DEBUG)/cad/VRMLWriter.o $(OBJDIR_LINUX_DEBUG)/cad/STLWriter.o: cad/STLWriter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c cad/STLWriter.cpp -o $(OBJDIR_LINUX_DEBUG)/cad/STLWriter.o @@ -1504,8 +1535,11 @@ $(OBJDIR_LINUX_DEBUG)/cad/ModelToCAD.o: cad/ModelToCAD.cpp $(OBJDIR_LINUX_DEBUG)/cad/DXFWriter.o: cad/DXFWriter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c cad/DXFWriter.cpp -o $(OBJDIR_LINUX_DEBUG)/cad/DXFWriter.o -$(OBJDIR_LINUX_DEBUG)/cad/CADWriter.o: cad/CADWriter.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c cad/CADWriter.cpp -o $(OBJDIR_LINUX_DEBUG)/cad/CADWriter.o +$(OBJDIR_LINUX_DEBUG)/controllers/Falcon.o: controllers/Falcon.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/Falcon.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/Falcon.o + +$(OBJDIR_LINUX_DEBUG)/controllers/Minleon.o: controllers/Minleon.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/Minleon.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/Minleon.o $(OBJDIR_LINUX_DEBUG)/controllers/J1Sys.o: controllers/J1Sys.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/J1Sys.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/J1Sys.o @@ -1516,12 +1550,12 @@ $(OBJDIR_LINUX_DEBUG)/controllers/HinksPixExportDialog.o: controllers/HinksPixEx $(OBJDIR_LINUX_DEBUG)/controllers/HinksPix.o: controllers/HinksPix.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/HinksPix.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/HinksPix.o -$(OBJDIR_LINUX_DEBUG)/controllers/Falcon.o: controllers/Falcon.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/Falcon.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/Falcon.o - $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o: ../common/xlBaseApp.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../common/xlBaseApp.cpp -o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o +$(OBJDIR_LINUX_DEBUG)/controllers/FPPUploadProgressDialog.o: controllers/FPPUploadProgressDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/FPPUploadProgressDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/FPPUploadProgressDialog.o + $(OBJDIR_LINUX_DEBUG)/controllers/FPPConnectDialog.o: controllers/FPPConnectDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/FPPConnectDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/FPPConnectDialog.o @@ -1531,9 +1565,6 @@ $(OBJDIR_LINUX_DEBUG)/controllers/FPP.o: controllers/FPP.cpp $(OBJDIR_LINUX_DEBUG)/controllers/Experience.o: controllers/Experience.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/Experience.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/Experience.o -$(OBJDIR_LINUX_DEBUG)/controllers/ESPixelStick.o: controllers/ESPixelStick.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c controllers/ESPixelStick.cpp -o $(OBJDIR_LINUX_DEBUG)/controllers/ESPixelStick.o - clean_linux_debug: rm -f $(OBJ_LINUX_DEBUG) $(OUT_LINUX_DEBUG) @@ -1545,22 +1576,23 @@ before_linux_release: @test -d $(OBJDIR_LINUX_RELEASE)/preferences || mkdir -p $(OBJDIR_LINUX_RELEASE)/preferences @test -d $(OBJDIR_LINUX_RELEASE)/effects || mkdir -p $(OBJDIR_LINUX_RELEASE)/effects @test -d $(OBJDIR_LINUX_RELEASE)/effects/assist || mkdir -p $(OBJDIR_LINUX_RELEASE)/effects/assist - @test -d $(OBJDIR_LINUX_RELEASE)/graphics/opengl || mkdir -p $(OBJDIR_LINUX_RELEASE)/graphics/opengl + @test -d $(OBJDIR_LINUX_RELEASE)/graphics || mkdir -p $(OBJDIR_LINUX_RELEASE)/graphics @test -d $(OBJDIR_LINUX_RELEASE)/kiss_fft/tools || mkdir -p $(OBJDIR_LINUX_RELEASE)/kiss_fft/tools @test -d $(OBJDIR_LINUX_RELEASE)/kiss_fft || mkdir -p $(OBJDIR_LINUX_RELEASE)/kiss_fft - @test -d $(OBJDIR_LINUX_RELEASE)/graphics || mkdir -p $(OBJDIR_LINUX_RELEASE)/graphics + @test -d $(OBJDIR_LINUX_RELEASE)/graphics/opengl || mkdir -p $(OBJDIR_LINUX_RELEASE)/graphics/opengl @test -d $(OBJDIR_LINUX_RELEASE) || mkdir -p $(OBJDIR_LINUX_RELEASE) - @test -d $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk @test -d $(OBJDIR_LINUX_RELEASE)/utils || mkdir -p $(OBJDIR_LINUX_RELEASE)/utils + @test -d $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk @test -d $(OBJDIR_LINUX_RELEASE)/support || mkdir -p $(OBJDIR_LINUX_RELEASE)/support @test -d $(OBJDIR_LINUX_RELEASE)/sequencer || mkdir -p $(OBJDIR_LINUX_RELEASE)/sequencer + @test -d $(OBJDIR_LINUX_RELEASE)/wxWEBPHandler || mkdir -p $(OBJDIR_LINUX_RELEASE)/wxWEBPHandler @test -d $(OBJDIR_LINUX_RELEASE)/MIDI || mkdir -p $(OBJDIR_LINUX_RELEASE)/MIDI @test -d $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxHTTPServer @test -d $(OBJDIR_LINUX_RELEASE)/__/xSchedule || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xSchedule @test -d $(OBJDIR_LINUX_RELEASE)/__/xFade || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xFade @test -d $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON - @test -d $(OBJDIR_LINUX_RELEASE)/cad || mkdir -p $(OBJDIR_LINUX_RELEASE)/cad @test -d $(OBJDIR_LINUX_RELEASE)/automation || mkdir -p $(OBJDIR_LINUX_RELEASE)/automation + @test -d $(OBJDIR_LINUX_RELEASE)/cad || mkdir -p $(OBJDIR_LINUX_RELEASE)/cad @test -d $(OBJDIR_LINUX_RELEASE)/controllers || mkdir -p $(OBJDIR_LINUX_RELEASE)/controllers @test -d $(OBJDIR_LINUX_RELEASE)/__/common || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/common @@ -1586,6 +1618,9 @@ $(OBJDIR_LINUX_RELEASE)/models/SubModel.o: models/SubModel.cpp $(OBJDIR_LINUX_RELEASE)/models/StarModel.o: models/StarModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/StarModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/StarModel.o +$(OBJDIR_LINUX_RELEASE)/models/ThreePointScreenLocation.o: models/ThreePointScreenLocation.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ThreePointScreenLocation.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ThreePointScreenLocation.o + $(OBJDIR_LINUX_RELEASE)/models/SphereModel.o: models/SphereModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/SphereModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/SphereModel.o @@ -1598,9 +1633,6 @@ $(OBJDIR_LINUX_RELEASE)/models/Shapes.o: models/Shapes.cpp $(OBJDIR_LINUX_RELEASE)/models/RulerObject.o: models/RulerObject.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/RulerObject.cpp -o $(OBJDIR_LINUX_RELEASE)/models/RulerObject.o -$(OBJDIR_LINUX_RELEASE)/models/ViewObjectManager.o: models/ViewObjectManager.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ViewObjectManager.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ViewObjectManager.o - $(OBJDIR_LINUX_RELEASE)/outputs/ArtNetOutput.o: outputs/ArtNetOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/ArtNetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/ArtNetOutput.o @@ -1613,6 +1645,9 @@ $(OBJDIR_LINUX_RELEASE)/models/WindowFrameModel.o: models/WindowFrameModel.cpp $(OBJDIR_LINUX_RELEASE)/models/WholeHouseModel.o: models/WholeHouseModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/WholeHouseModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/WholeHouseModel.o +$(OBJDIR_LINUX_RELEASE)/models/ViewObjectManager.o: models/ViewObjectManager.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ViewObjectManager.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ViewObjectManager.o + $(OBJDIR_LINUX_RELEASE)/models/ViewObject.o: models/ViewObject.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ViewObject.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ViewObject.o @@ -1622,9 +1657,6 @@ $(OBJDIR_LINUX_RELEASE)/models/TwoPointScreenLocation.o: models/TwoPointScreenLo $(OBJDIR_LINUX_RELEASE)/models/TreeModel.o: models/TreeModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/TreeModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/TreeModel.o -$(OBJDIR_LINUX_RELEASE)/models/ThreePointScreenLocation.o: models/ThreePointScreenLocation.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ThreePointScreenLocation.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ThreePointScreenLocation.o - $(OBJDIR_LINUX_RELEASE)/models/ImageModel.o: models/ImageModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ImageModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ImageModel.o @@ -1664,6 +1696,9 @@ $(OBJDIR_LINUX_RELEASE)/models/ObjectManager.o: models/ObjectManager.cpp $(OBJDIR_LINUX_RELEASE)/models/Node.o: models/Node.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/Node.cpp -o $(OBJDIR_LINUX_RELEASE)/models/Node.o +$(OBJDIR_LINUX_RELEASE)/outputs/Controller.o: outputs/Controller.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/Controller.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/Controller.o + $(OBJDIR_LINUX_RELEASE)/models/MultiPointModel.o: models/MultiPointModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/MultiPointModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/MultiPointModel.o @@ -1676,8 +1711,14 @@ $(OBJDIR_LINUX_RELEASE)/models/ModelManager.o: models/ModelManager.cpp $(OBJDIR_LINUX_RELEASE)/models/ModelGroup.o: models/ModelGroup.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ModelGroup.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ModelGroup.o -$(OBJDIR_LINUX_RELEASE)/outputs/RenardOutput.o: outputs/RenardOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/RenardOutput.o +$(OBJDIR_LINUX_RELEASE)/outputs/SerialOutput.o: outputs/SerialOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/SerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/SerialOutput.o + +$(OBJDIR_LINUX_RELEASE)/outputs/serial.o: outputs/serial.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/serial.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/serial.o + +$(OBJDIR_LINUX_RELEASE)/outputs/ZCPPOutput.o: outputs/ZCPPOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/ZCPPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/ZCPPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/TwinklyOutput.o: outputs/TwinklyOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/TwinklyOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/TwinklyOutput.o @@ -1685,11 +1726,8 @@ $(OBJDIR_LINUX_RELEASE)/outputs/TwinklyOutput.o: outputs/TwinklyOutput.cpp $(OBJDIR_LINUX_RELEASE)/outputs/TestPreset.o: outputs/TestPreset.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/TestPreset.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/TestPreset.o -$(OBJDIR_LINUX_RELEASE)/outputs/SerialOutput.o: outputs/SerialOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/SerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/SerialOutput.o - -$(OBJDIR_LINUX_RELEASE)/outputs/ZCPPOutput.o: outputs/ZCPPOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/ZCPPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/ZCPPOutput.o +$(OBJDIR_LINUX_RELEASE)/outputs/RenardOutput.o: outputs/RenardOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/PixelNetOutput.o: outputs/PixelNetOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/PixelNetOutput.o @@ -1700,8 +1738,14 @@ $(OBJDIR_LINUX_RELEASE)/outputs/OutputManager.o: outputs/OutputManager.cpp $(OBJDIR_LINUX_RELEASE)/outputs/Output.o: outputs/Output.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/Output.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/Output.o -$(OBJDIR_LINUX_RELEASE)/outputs/OpenPixelNetOutput.o: outputs/OpenPixelNetOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/OpenPixelNetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/OpenPixelNetOutput.o +$(OBJDIR_LINUX_RELEASE)/preferences/ColorManagerSettingsPanel.o: preferences/ColorManagerSettingsPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/ColorManagerSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/ColorManagerSettingsPanel.o + +$(OBJDIR_LINUX_RELEASE)/preferences/RandomEffectsSettingsPanel.o: preferences/RandomEffectsSettingsPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/RandomEffectsSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/RandomEffectsSettingsPanel.o + +$(OBJDIR_LINUX_RELEASE)/preferences/OutputSettingsPanel.o: preferences/OutputSettingsPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/OutputSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/OutputSettingsPanel.o $(OBJDIR_LINUX_RELEASE)/preferences/OtherSettingsPanel.o: preferences/OtherSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/OtherSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/OtherSettingsPanel.o @@ -1709,9 +1753,6 @@ $(OBJDIR_LINUX_RELEASE)/preferences/OtherSettingsPanel.o: preferences/OtherSetti $(OBJDIR_LINUX_RELEASE)/preferences/EffectsGridSettingsPanel.o: preferences/EffectsGridSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/EffectsGridSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/EffectsGridSettingsPanel.o -$(OBJDIR_LINUX_RELEASE)/preferences/ColorManagerSettingsPanel.o: preferences/ColorManagerSettingsPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/ColorManagerSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/ColorManagerSettingsPanel.o - $(OBJDIR_LINUX_RELEASE)/preferences/CheckSequenceSettingsPanel.o: preferences/CheckSequenceSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/CheckSequenceSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/CheckSequenceSettingsPanel.o @@ -1724,11 +1765,8 @@ $(OBJDIR_LINUX_RELEASE)/outputs/xxxSerialOutput.o: outputs/xxxSerialOutput.cpp $(OBJDIR_LINUX_RELEASE)/outputs/xxxEthernetOutput.o: outputs/xxxEthernetOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/xxxEthernetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/xxxEthernetOutput.o -$(OBJDIR_LINUX_RELEASE)/outputs/serial.o: outputs/serial.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/serial.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/serial.o - -$(OBJDIR_LINUX_RELEASE)/outputs/DDPOutput.o: outputs/DDPOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/DDPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/DDPOutput.o +$(OBJDIR_LINUX_RELEASE)/outputs/IPOutput.o: outputs/IPOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/IPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/GenericSerialOutput.o: outputs/GenericSerialOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/GenericSerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/GenericSerialOutput.o @@ -1739,8 +1777,8 @@ $(OBJDIR_LINUX_RELEASE)/outputs/E131Output.o: outputs/E131Output.cpp $(OBJDIR_LINUX_RELEASE)/outputs/DMXOutput.o: outputs/DMXOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/DMXOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/DMXOutput.o -$(OBJDIR_LINUX_RELEASE)/outputs/IPOutput.o: outputs/IPOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/IPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/IPOutput.o +$(OBJDIR_LINUX_RELEASE)/outputs/DDPOutput.o: outputs/DDPOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/DDPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/DDPOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerSerial.o: outputs/ControllerSerial.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/ControllerSerial.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerSerial.o @@ -1751,11 +1789,11 @@ $(OBJDIR_LINUX_RELEASE)/outputs/ControllerNull.o: outputs/ControllerNull.cpp $(OBJDIR_LINUX_RELEASE)/outputs/ControllerEthernet.o: outputs/ControllerEthernet.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/ControllerEthernet.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/ControllerEthernet.o -$(OBJDIR_LINUX_RELEASE)/outputs/Controller.o: outputs/Controller.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/Controller.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/Controller.o +$(OBJDIR_LINUX_RELEASE)/outputs/LorControllers.o: outputs/LorControllers.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/LorControllers.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/LorControllers.o -$(OBJDIR_LINUX_RELEASE)/outputs/LorController.o: outputs/LorController.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/LorController.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/LorController.o +$(OBJDIR_LINUX_RELEASE)/outputs/OpenPixelNetOutput.o: outputs/OpenPixelNetOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/OpenPixelNetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/outputs/OpenDMXOutput.o: outputs/OpenDMXOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/OpenDMXOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/OpenDMXOutput.o @@ -1766,12 +1804,12 @@ $(OBJDIR_LINUX_RELEASE)/outputs/OPCOutput.o: outputs/OPCOutput.cpp $(OBJDIR_LINUX_RELEASE)/outputs/NullOutput.o: outputs/NullOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/NullOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/NullOutput.o -$(OBJDIR_LINUX_RELEASE)/outputs/LorControllers.o: outputs/LorControllers.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/LorControllers.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/LorControllers.o - $(OBJDIR_LINUX_RELEASE)/models/DMX/ServoConfigDialog.o: models/DMX/ServoConfigDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/DMX/ServoConfigDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/models/DMX/ServoConfigDialog.o +$(OBJDIR_LINUX_RELEASE)/outputs/LorController.o: outputs/LorController.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/LorController.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/LorController.o + $(OBJDIR_LINUX_RELEASE)/outputs/LOROutput.o: outputs/LOROutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c outputs/LOROutput.cpp -o $(OBJDIR_LINUX_RELEASE)/outputs/LOROutput.o @@ -1793,9 +1831,6 @@ $(OBJDIR_LINUX_RELEASE)/effects/VideoPanel.o: effects/VideoPanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/VideoEffect.o: effects/VideoEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/VideoEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/VideoEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/WaveEffect.o: effects/WaveEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/WaveEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/WaveEffect.o - $(OBJDIR_LINUX_RELEASE)/effects/VUMeterPanel.o: effects/VUMeterPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/VUMeterPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/VUMeterPanel.o @@ -1808,6 +1843,12 @@ $(OBJDIR_LINUX_RELEASE)/effects/TwinklePanel.o: effects/TwinklePanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/TwinkleEffect.o: effects/TwinkleEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TwinkleEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TwinkleEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/TreePanel.o: effects/TreePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TreePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TreePanel.o + +$(OBJDIR_LINUX_RELEASE)/effects/assist/SketchAssistPanel.o: effects/assist/SketchAssistPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/assist/SketchAssistPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchAssistPanel.o + $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasPictures.o: effects/assist/xlGridCanvasPictures.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/assist/xlGridCanvasPictures.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasPictures.o @@ -1820,11 +1861,8 @@ $(OBJDIR_LINUX_RELEASE)/effects/assist/xlGridCanvasEmpty.o: effects/assist/xlGri $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchCanvasPanel.o: effects/assist/SketchCanvasPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/assist/SketchCanvasPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchCanvasPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/TreePanel.o: effects/TreePanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TreePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TreePanel.o - -$(OBJDIR_LINUX_RELEASE)/effects/assist/SketchAssistPanel.o: effects/assist/SketchAssistPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/assist/SketchAssistPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/assist/SketchAssistPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/TreeEffect.o: effects/TreeEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TreeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TreeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/assist/PicturesAssistPanel.o: effects/assist/PicturesAssistPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/assist/PicturesAssistPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/assist/PicturesAssistPanel.o @@ -1835,14 +1873,8 @@ $(OBJDIR_LINUX_RELEASE)/effects/assist/AssistPanel.o: effects/assist/AssistPanel $(OBJDIR_LINUX_RELEASE)/effects/WavePanel.o: effects/WavePanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/WavePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/WavePanel.o -$(OBJDIR_LINUX_RELEASE)/effects/SpiralsEffect.o: effects/SpiralsEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SpiralsEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SpiralsEffect.o - -$(OBJDIR_LINUX_RELEASE)/effects/StateEffect.o: effects/StateEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/StateEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/StateEffect.o - -$(OBJDIR_LINUX_RELEASE)/effects/SpirographPanel.o: effects/SpirographPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SpirographPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SpirographPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/WaveEffect.o: effects/WaveEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/WaveEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/WaveEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SpirographEffect.o: effects/SpirographEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SpirographEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SpirographEffect.o @@ -1850,9 +1882,15 @@ $(OBJDIR_LINUX_RELEASE)/effects/SpirographEffect.o: effects/SpirographEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/SpiralsPanel.o: effects/SpiralsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SpiralsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SpiralsPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/SpiralsEffect.o: effects/SpiralsEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SpiralsEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SpiralsEffect.o + $(OBJDIR_LINUX_RELEASE)/effects/SnowstormPanel.o: effects/SnowstormPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SnowstormPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SnowstormPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/SpirographPanel.o: effects/SpirographPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SpirographPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SpirographPanel.o + $(OBJDIR_LINUX_RELEASE)/effects/SnowstormEffect.o: effects/SnowstormEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SnowstormEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SnowstormEffect.o @@ -1862,8 +1900,8 @@ $(OBJDIR_LINUX_RELEASE)/effects/SnowflakesPanel.o: effects/SnowflakesPanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/SnowflakesEffect.o: effects/SnowflakesEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SnowflakesEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SnowflakesEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/TreeEffect.o: effects/TreeEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TreeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TreeEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/SketchPanel.o: effects/SketchPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SketchPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SketchPanel.o $(OBJDIR_LINUX_RELEASE)/effects/TextPanel.o: effects/TextPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TextPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TextPanel.o @@ -1874,9 +1912,6 @@ $(OBJDIR_LINUX_RELEASE)/effects/TextEffect.o: effects/TextEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/TendrilPanel.o: effects/TendrilPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TendrilPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TendrilPanel.o -$(OBJDIR_LINUX_RELEASE)/graphics/opengl/DrawGLUtils.o: graphics/opengl/DrawGLUtils.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c graphics/opengl/DrawGLUtils.cpp -o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/DrawGLUtils.o - $(OBJDIR_LINUX_RELEASE)/effects/TendrilEffect.o: effects/TendrilEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/TendrilEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/TendrilEffect.o @@ -1889,6 +1924,9 @@ $(OBJDIR_LINUX_RELEASE)/effects/StrobeEffect.o: effects/StrobeEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/StatePanel.o: effects/StatePanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/StatePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/StatePanel.o +$(OBJDIR_LINUX_RELEASE)/effects/StateEffect.o: effects/StateEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/StateEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/StateEffect.o + $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxMovingHead3D.o: models/DMX/DmxMovingHead3D.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/DMX/DmxMovingHead3D.cpp -o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxMovingHead3D.o @@ -1943,6 +1981,9 @@ $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxServo.o: models/DMX/DmxServo.cpp $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxPresetAbility.o: models/DMX/DmxPresetAbility.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/DMX/DmxPresetAbility.cpp -o $(OBJDIR_LINUX_RELEASE)/models/DMX/DmxPresetAbility.o +$(OBJDIR_LINUX_RELEASE)/graphics/xlGraphicsAccumulators.o: graphics/xlGraphicsAccumulators.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c graphics/xlGraphicsAccumulators.cpp -o $(OBJDIR_LINUX_RELEASE)/graphics/xlGraphicsAccumulators.o + $(OBJDIR_LINUX_RELEASE)/models/ArchesModel.o: models/ArchesModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ArchesModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ArchesModel.o @@ -1955,12 +1996,6 @@ $(OBJDIR_LINUX_RELEASE)/kiss_fft/kiss_fft.o: kiss_fft/kiss_fft.c $(OBJDIR_LINUX_RELEASE)/graphics/xlMesh.o: graphics/xlMesh.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c graphics/xlMesh.cpp -o $(OBJDIR_LINUX_RELEASE)/graphics/xlMesh.o -$(OBJDIR_LINUX_RELEASE)/models/BaseObject.o: models/BaseObject.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/BaseObject.cpp -o $(OBJDIR_LINUX_RELEASE)/models/BaseObject.o - -$(OBJDIR_LINUX_RELEASE)/graphics/xlGraphicsAccumulators.o: graphics/xlGraphicsAccumulators.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c graphics/xlGraphicsAccumulators.cpp -o $(OBJDIR_LINUX_RELEASE)/graphics/xlGraphicsAccumulators.o - $(OBJDIR_LINUX_RELEASE)/graphics/xlFontInfo.o: graphics/xlFontInfo.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c graphics/xlFontInfo.cpp -o $(OBJDIR_LINUX_RELEASE)/graphics/xlFontInfo.o @@ -1970,6 +2005,9 @@ $(OBJDIR_LINUX_RELEASE)/graphics/opengl/xlOGL3GraphicsContext.o: graphics/opengl $(OBJDIR_LINUX_RELEASE)/graphics/opengl/xlGLCanvas.o: graphics/opengl/xlGLCanvas.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c graphics/opengl/xlGLCanvas.cpp -o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/xlGLCanvas.o +$(OBJDIR_LINUX_RELEASE)/graphics/opengl/DrawGLUtils.o: graphics/opengl/DrawGLUtils.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c graphics/opengl/DrawGLUtils.cpp -o $(OBJDIR_LINUX_RELEASE)/graphics/opengl/DrawGLUtils.o + $(OBJDIR_LINUX_RELEASE)/models/CircleModel.o: models/CircleModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/CircleModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/CircleModel.o @@ -1985,9 +2023,6 @@ $(OBJDIR_LINUX_RELEASE)/models/CustomModel.o: models/CustomModel.cpp $(OBJDIR_LINUX_RELEASE)/models/CubeModel.o: models/CubeModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/CubeModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/CubeModel.o -$(OBJDIR_LINUX_RELEASE)/preferences/OutputSettingsPanel.o: preferences/OutputSettingsPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/OutputSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/OutputSettingsPanel.o - $(OBJDIR_LINUX_RELEASE)/models/ChannelBlockModel.o: models/ChannelBlockModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/ChannelBlockModel.cpp -o $(OBJDIR_LINUX_RELEASE)/models/ChannelBlockModel.o @@ -1997,6 +2032,9 @@ $(OBJDIR_LINUX_RELEASE)/models/CandyCaneModel.o: models/CandyCaneModel.cpp $(OBJDIR_LINUX_RELEASE)/models/BoxedScreenLocation.o: models/BoxedScreenLocation.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/BoxedScreenLocation.cpp -o $(OBJDIR_LINUX_RELEASE)/models/BoxedScreenLocation.o +$(OBJDIR_LINUX_RELEASE)/models/BaseObject.o: models/BaseObject.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c models/BaseObject.cpp -o $(OBJDIR_LINUX_RELEASE)/models/BaseObject.o + $(OBJDIR_LINUX_RELEASE)/xLightsMain.o: xLightsMain.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c xLightsMain.cpp -o $(OBJDIR_LINUX_RELEASE)/xLightsMain.o @@ -2033,8 +2071,8 @@ $(OBJDIR_LINUX_RELEASE)/xLightsXmlFile.o: xLightsXmlFile.cpp $(OBJDIR_LINUX_RELEASE)/xLightsVersion.o: xLightsVersion.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c xLightsVersion.cpp -o $(OBJDIR_LINUX_RELEASE)/xLightsVersion.o -$(OBJDIR_LINUX_RELEASE)/tmGridCell.o: tmGridCell.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c tmGridCell.cpp -o $(OBJDIR_LINUX_RELEASE)/tmGridCell.o +$(OBJDIR_LINUX_RELEASE)/utils/CurlManager.o: utils/CurlManager.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c utils/CurlManager.cpp -o $(OBJDIR_LINUX_RELEASE)/utils/CurlManager.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/Files.o: vamp-hostsdk/Files.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/Files.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/Files.o @@ -2048,20 +2086,17 @@ $(OBJDIR_LINUX_RELEASE)/utils/ip_utils.o: utils/ip_utils.cpp $(OBJDIR_LINUX_RELEASE)/utils/Curl.o: utils/Curl.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c utils/Curl.cpp -o $(OBJDIR_LINUX_RELEASE)/utils/Curl.o +$(OBJDIR_LINUX_RELEASE)/tmGridCell.o: tmGridCell.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c tmGridCell.cpp -o $(OBJDIR_LINUX_RELEASE)/tmGridCell.o + $(OBJDIR_LINUX_RELEASE)/support/VectorMath.o: support/VectorMath.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c support/VectorMath.cpp -o $(OBJDIR_LINUX_RELEASE)/support/VectorMath.o $(OBJDIR_LINUX_RELEASE)/support/GridCellChoiceRenderer.o: support/GridCellChoiceRenderer.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c support/GridCellChoiceRenderer.cpp -o $(OBJDIR_LINUX_RELEASE)/support/GridCellChoiceRenderer.o -$(OBJDIR_LINUX_RELEASE)/support/FastComboEditor.o: support/FastComboEditor.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c support/FastComboEditor.cpp -o $(OBJDIR_LINUX_RELEASE)/support/FastComboEditor.o - -$(OBJDIR_LINUX_RELEASE)/support/EzGrid.o: support/EzGrid.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c support/EzGrid.cpp -o $(OBJDIR_LINUX_RELEASE)/support/EzGrid.o - -$(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginHostAdapter.o: vamp-hostsdk/PluginHostAdapter.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/PluginHostAdapter.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginHostAdapter.o +$(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/RealTime.o: vamp-hostsdk/RealTime.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/RealTime.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginWrapper.o: vamp-hostsdk/PluginWrapper.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/PluginWrapper.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginWrapper.o @@ -2075,27 +2110,33 @@ $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginLoader.o: vamp-hostsdk/PluginLoader.c $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-hostsdk/PluginInputDomainAdapter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/PluginInputDomainAdapter.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginInputDomainAdapter.o +$(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginHostAdapter.o: vamp-hostsdk/PluginHostAdapter.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/PluginHostAdapter.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginHostAdapter.o + $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginChannelAdapter.o: vamp-hostsdk/PluginChannelAdapter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/PluginChannelAdapter.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginBufferingAdapter.o: vamp-hostsdk/PluginBufferingAdapter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/PluginBufferingAdapter.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/PluginBufferingAdapter.o +$(OBJDIR_LINUX_RELEASE)/sequencer/Effect.o: sequencer/Effect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/Effect.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/Effect.o + +$(OBJDIR_LINUX_RELEASE)/sequencer/Element.o: sequencer/Element.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/Element.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/Element.o + +$(OBJDIR_LINUX_RELEASE)/sequencer/EffectsGrid.o: sequencer/EffectsGrid.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/EffectsGrid.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectsGrid.o + $(OBJDIR_LINUX_RELEASE)/sequencer/EffectLayer.o: sequencer/EffectLayer.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/EffectLayer.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectLayer.o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectDropTarget.o: sequencer/EffectDropTarget.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/EffectDropTarget.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectDropTarget.o -$(OBJDIR_LINUX_RELEASE)/sequencer/Effect.o: sequencer/Effect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/Effect.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/Effect.o - $(OBJDIR_LINUX_RELEASE)/sequencer/DragEffectBitmapButton.o: sequencer/DragEffectBitmapButton.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/DragEffectBitmapButton.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/DragEffectBitmapButton.o -$(OBJDIR_LINUX_RELEASE)/sequencer/EffectsGrid.o: sequencer/EffectsGrid.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/EffectsGrid.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/EffectsGrid.o - $(OBJDIR_LINUX_RELEASE)/preferences/xLightsPreferences.o: preferences/xLightsPreferences.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/xLightsPreferences.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/xLightsPreferences.o @@ -2105,11 +2146,14 @@ $(OBJDIR_LINUX_RELEASE)/preferences/ViewSettingsPanel.o: preferences/ViewSetting $(OBJDIR_LINUX_RELEASE)/preferences/SequenceFileSettingsPanel.o: preferences/SequenceFileSettingsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/SequenceFileSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/SequenceFileSettingsPanel.o -$(OBJDIR_LINUX_RELEASE)/preferences/RandomEffectsSettingsPanel.o: preferences/RandomEffectsSettingsPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c preferences/RandomEffectsSettingsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/preferences/RandomEffectsSettingsPanel.o +$(OBJDIR_LINUX_RELEASE)/sequencer/UndoManager.o: sequencer/UndoManager.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/UndoManager.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/UndoManager.o -$(OBJDIR_LINUX_RELEASE)/sequencer/SequenceElements.o: sequencer/SequenceElements.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/SequenceElements.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/SequenceElements.o +$(OBJDIR_LINUX_RELEASE)/support/FastComboEditor.o: support/FastComboEditor.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c support/FastComboEditor.cpp -o $(OBJDIR_LINUX_RELEASE)/support/FastComboEditor.o + +$(OBJDIR_LINUX_RELEASE)/support/EzGrid.o: support/EzGrid.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c support/EzGrid.cpp -o $(OBJDIR_LINUX_RELEASE)/support/EzGrid.o $(OBJDIR_LINUX_RELEASE)/sequencer/tabSequencer.o: sequencer/tabSequencer.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/tabSequencer.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/tabSequencer.o @@ -2117,38 +2161,38 @@ $(OBJDIR_LINUX_RELEASE)/sequencer/tabSequencer.o: sequencer/tabSequencer.cpp $(OBJDIR_LINUX_RELEASE)/sequencer/Waveform.o: sequencer/Waveform.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/Waveform.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/Waveform.o -$(OBJDIR_LINUX_RELEASE)/sequencer/UndoManager.o: sequencer/UndoManager.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/UndoManager.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/UndoManager.o - $(OBJDIR_LINUX_RELEASE)/sequencer/TimeLine.o: sequencer/TimeLine.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/TimeLine.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/TimeLine.o +$(OBJDIR_LINUX_RELEASE)/sequencer/SequenceElements.o: sequencer/SequenceElements.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/SequenceElements.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/SequenceElements.o + $(OBJDIR_LINUX_RELEASE)/sequencer/RowHeading.o: sequencer/RowHeading.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/RowHeading.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/RowHeading.o $(OBJDIR_LINUX_RELEASE)/sequencer/MainSequencer.o: sequencer/MainSequencer.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/MainSequencer.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/MainSequencer.o -$(OBJDIR_LINUX_RELEASE)/sequencer/Element.o: sequencer/Element.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c sequencer/Element.cpp -o $(OBJDIR_LINUX_RELEASE)/sequencer/Element.o +$(OBJDIR_LINUX_RELEASE)/wxCheckedListCtrl.o: wxCheckedListCtrl.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c wxCheckedListCtrl.cpp -o $(OBJDIR_LINUX_RELEASE)/wxCheckedListCtrl.o + +$(OBJDIR_LINUX_RELEASE)/wxWEBPHandler/imagwebp.o: wxWEBPHandler/imagwebp.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c wxWEBPHandler/imagwebp.cpp -o $(OBJDIR_LINUX_RELEASE)/wxWEBPHandler/imagwebp.o $(OBJDIR_LINUX_RELEASE)/wxModelGridCellRenderer.o: wxModelGridCellRenderer.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c wxModelGridCellRenderer.cpp -o $(OBJDIR_LINUX_RELEASE)/wxModelGridCellRenderer.o -$(OBJDIR_LINUX_RELEASE)/wxCheckedListCtrl.o: wxCheckedListCtrl.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c wxCheckedListCtrl.cpp -o $(OBJDIR_LINUX_RELEASE)/wxCheckedListCtrl.o - $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/host-c.o: vamp-hostsdk/host-c.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/host-c.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/host-c.o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/acsymbols.o: vamp-hostsdk/acsymbols.c $(CC) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/acsymbols.c -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/acsymbols.o -$(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/RealTime.o: vamp-hostsdk/RealTime.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c vamp-hostsdk/RealTime.cpp -o $(OBJDIR_LINUX_RELEASE)/vamp-hostsdk/RealTime.o +$(OBJDIR_LINUX_RELEASE)/effects/SketchEffectDrawing.o: effects/SketchEffectDrawing.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SketchEffectDrawing.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffectDrawing.o -$(OBJDIR_LINUX_RELEASE)/MultiControllerUploadDialog.o: MultiControllerUploadDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MultiControllerUploadDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/MultiControllerUploadDialog.o +$(OBJDIR_LINUX_RELEASE)/ModelGroupPanel.o: ModelGroupPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelGroupPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelGroupPanel.o $(OBJDIR_LINUX_RELEASE)/Mouse3DManager.o: Mouse3DManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c Mouse3DManager.cpp -o $(OBJDIR_LINUX_RELEASE)/Mouse3DManager.o @@ -2159,14 +2203,11 @@ $(OBJDIR_LINUX_RELEASE)/ModelStateDialog.o: ModelStateDialog.cpp $(OBJDIR_LINUX_RELEASE)/ModelRemap.o: ModelRemap.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelRemap.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelRemap.o -$(OBJDIR_LINUX_RELEASE)/MusicXML.o: MusicXML.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MusicXML.cpp -o $(OBJDIR_LINUX_RELEASE)/MusicXML.o - $(OBJDIR_LINUX_RELEASE)/ModelPreview.o: ModelPreview.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelPreview.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelPreview.o -$(OBJDIR_LINUX_RELEASE)/ModelGroupPanel.o: ModelGroupPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelGroupPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelGroupPanel.o +$(OBJDIR_LINUX_RELEASE)/MultiControllerUploadDialog.o: MultiControllerUploadDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MultiControllerUploadDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/MultiControllerUploadDialog.o $(OBJDIR_LINUX_RELEASE)/ModelFaceDialog.o: ModelFaceDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelFaceDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelFaceDialog.o @@ -2174,8 +2215,11 @@ $(OBJDIR_LINUX_RELEASE)/ModelFaceDialog.o: ModelFaceDialog.cpp $(OBJDIR_LINUX_RELEASE)/ModelDimmingCurveDialog.o: ModelDimmingCurveDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelDimmingCurveDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelDimmingCurveDialog.o -$(OBJDIR_LINUX_RELEASE)/PaletteMgmtDialog.o: PaletteMgmtDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PaletteMgmtDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/PaletteMgmtDialog.o +$(OBJDIR_LINUX_RELEASE)/ModelChainDialog.o: ModelChainDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelChainDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelChainDialog.o + +$(OBJDIR_LINUX_RELEASE)/MetronomeLabelDialog.o: MetronomeLabelDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MetronomeLabelDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/MetronomeLabelDialog.o $(OBJDIR_LINUX_RELEASE)/OutputModelManager.o: OutputModelManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputModelManager.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputModelManager.o @@ -2189,9 +2233,6 @@ $(OBJDIR_LINUX_RELEASE)/OpenGLShaders.o: OpenGLShaders.cpp $(OBJDIR_LINUX_RELEASE)/NoteRangeDialog.o: NoteRangeDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c NoteRangeDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/NoteRangeDialog.o -$(OBJDIR_LINUX_RELEASE)/ModelChainDialog.o: ModelChainDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ModelChainDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ModelChainDialog.o - $(OBJDIR_LINUX_RELEASE)/NoteImportDialog.o: NoteImportDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c NoteImportDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/NoteImportDialog.o @@ -2204,11 +2245,8 @@ $(OBJDIR_LINUX_RELEASE)/NodeSelectGrid.o: NodeSelectGrid.cpp $(OBJDIR_LINUX_RELEASE)/NewTimingDialog.o: NewTimingDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c NewTimingDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/NewTimingDialog.o -$(OBJDIR_LINUX_RELEASE)/LORPreview.o: LORPreview.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LORPreview.cpp -o $(OBJDIR_LINUX_RELEASE)/LORPreview.o - -$(OBJDIR_LINUX_RELEASE)/LayoutUtils.o: LayoutUtils.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LayoutUtils.cpp -o $(OBJDIR_LINUX_RELEASE)/LayoutUtils.o +$(OBJDIR_LINUX_RELEASE)/MusicXML.o: MusicXML.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MusicXML.cpp -o $(OBJDIR_LINUX_RELEASE)/MusicXML.o $(OBJDIR_LINUX_RELEASE)/LayoutPanel.o: LayoutPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LayoutPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/LayoutPanel.o @@ -2219,6 +2257,12 @@ $(OBJDIR_LINUX_RELEASE)/LayoutGroup.o: LayoutGroup.cpp $(OBJDIR_LINUX_RELEASE)/LayerSelectDialog.o: LayerSelectDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LayerSelectDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/LayerSelectDialog.o +$(OBJDIR_LINUX_RELEASE)/LORPreview.o: LORPreview.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LORPreview.cpp -o $(OBJDIR_LINUX_RELEASE)/LORPreview.o + +$(OBJDIR_LINUX_RELEASE)/LayoutUtils.o: LayoutUtils.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LayoutUtils.cpp -o $(OBJDIR_LINUX_RELEASE)/LayoutUtils.o + $(OBJDIR_LINUX_RELEASE)/LOREdit.o: LOREdit.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LOREdit.cpp -o $(OBJDIR_LINUX_RELEASE)/LOREdit.o @@ -2231,9 +2275,6 @@ $(OBJDIR_LINUX_RELEASE)/KeyBindings.o: KeyBindings.cpp $(OBJDIR_LINUX_RELEASE)/KeyBindingEditDialog.o: KeyBindingEditDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c KeyBindingEditDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/KeyBindingEditDialog.o -$(OBJDIR_LINUX_RELEASE)/MIDI/Binasc.o: MIDI/Binasc.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MIDI/Binasc.cpp -o $(OBJDIR_LINUX_RELEASE)/MIDI/Binasc.o - $(OBJDIR_LINUX_RELEASE)/MediaImportOptionsDialog.o: MediaImportOptionsDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MediaImportOptionsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/MediaImportOptionsDialog.o @@ -2252,6 +2293,9 @@ $(OBJDIR_LINUX_RELEASE)/MIDI/MidiEventList.o: MIDI/MidiEventList.cpp $(OBJDIR_LINUX_RELEASE)/MIDI/MidiEvent.o: MIDI/MidiEvent.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MIDI/MidiEvent.cpp -o $(OBJDIR_LINUX_RELEASE)/MIDI/MidiEvent.o +$(OBJDIR_LINUX_RELEASE)/MIDI/Binasc.o: MIDI/Binasc.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MIDI/Binasc.cpp -o $(OBJDIR_LINUX_RELEASE)/MIDI/Binasc.o + $(OBJDIR_LINUX_RELEASE)/LyricsDialog.o: LyricsDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LyricsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/LyricsDialog.o @@ -2264,9 +2308,6 @@ $(OBJDIR_LINUX_RELEASE)/LorConvertDialog.o: LorConvertDialog.cpp $(OBJDIR_LINUX_RELEASE)/LinkJukeboxButtonDialog.o: LinkJukeboxButtonDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c LinkJukeboxButtonDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/LinkJukeboxButtonDialog.o -$(OBJDIR_LINUX_RELEASE)/SeqElementMismatchDialog.o: SeqElementMismatchDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SeqElementMismatchDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/SeqElementMismatchDialog.o - $(OBJDIR_LINUX_RELEASE)/SequenceData.o: SequenceData.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SequenceData.cpp -o $(OBJDIR_LINUX_RELEASE)/SequenceData.o @@ -2279,6 +2320,9 @@ $(OBJDIR_LINUX_RELEASE)/SeqFileUtilities.o: SeqFileUtilities.cpp $(OBJDIR_LINUX_RELEASE)/SeqExportDialog.o: SeqExportDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SeqExportDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/SeqExportDialog.o +$(OBJDIR_LINUX_RELEASE)/SeqElementMismatchDialog.o: SeqElementMismatchDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SeqElementMismatchDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/SeqElementMismatchDialog.o + $(OBJDIR_LINUX_RELEASE)/SelectTimingsDialog.o: SelectTimingsDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SelectTimingsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/SelectTimingsDialog.o @@ -2306,6 +2350,9 @@ $(OBJDIR_LINUX_RELEASE)/SplashDialog.o: SplashDialog.cpp $(OBJDIR_LINUX_RELEASE)/ShaderDownloadDialog.o: ShaderDownloadDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ShaderDownloadDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ShaderDownloadDialog.o +$(OBJDIR_LINUX_RELEASE)/SaveChangesDialog.o: SaveChangesDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SaveChangesDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/SaveChangesDialog.o + $(OBJDIR_LINUX_RELEASE)/SequenceViewManager.o: SequenceViewManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SequenceViewManager.cpp -o $(OBJDIR_LINUX_RELEASE)/SequenceViewManager.o @@ -2318,11 +2365,8 @@ $(OBJDIR_LINUX_RELEASE)/SequenceVideoPanel.o: SequenceVideoPanel.cpp $(OBJDIR_LINUX_RELEASE)/SequencePackage.o: SequencePackage.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SequencePackage.cpp -o $(OBJDIR_LINUX_RELEASE)/SequencePackage.o -$(OBJDIR_LINUX_RELEASE)/PixelBuffer.o: PixelBuffer.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PixelBuffer.cpp -o $(OBJDIR_LINUX_RELEASE)/PixelBuffer.o - -$(OBJDIR_LINUX_RELEASE)/RemapDMXChannelsDialog.o: RemapDMXChannelsDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c RemapDMXChannelsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/RemapDMXChannelsDialog.o +$(OBJDIR_LINUX_RELEASE)/PhonemeDictionary.o: PhonemeDictionary.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PhonemeDictionary.cpp -o $(OBJDIR_LINUX_RELEASE)/PhonemeDictionary.o $(OBJDIR_LINUX_RELEASE)/PreviewPane.o: PreviewPane.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PreviewPane.cpp -o $(OBJDIR_LINUX_RELEASE)/PreviewPane.o @@ -2333,8 +2377,8 @@ $(OBJDIR_LINUX_RELEASE)/Pixels.o: Pixels.cpp $(OBJDIR_LINUX_RELEASE)/PixelTestDialog.o: PixelTestDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PixelTestDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/PixelTestDialog.o -$(OBJDIR_LINUX_RELEASE)/PhonemeDictionary.o: PhonemeDictionary.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PhonemeDictionary.cpp -o $(OBJDIR_LINUX_RELEASE)/PhonemeDictionary.o +$(OBJDIR_LINUX_RELEASE)/PixelBuffer.o: PixelBuffer.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PixelBuffer.cpp -o $(OBJDIR_LINUX_RELEASE)/PixelBuffer.o $(OBJDIR_LINUX_RELEASE)/PerspectivesPanel.o: PerspectivesPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PerspectivesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PerspectivesPanel.o @@ -2345,8 +2389,8 @@ $(OBJDIR_LINUX_RELEASE)/PathGenerationDialog.o: PathGenerationDialog.cpp $(OBJDIR_LINUX_RELEASE)/Parallel.o: Parallel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c Parallel.cpp -o $(OBJDIR_LINUX_RELEASE)/Parallel.o -$(OBJDIR_LINUX_RELEASE)/SaveChangesDialog.o: SaveChangesDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SaveChangesDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/SaveChangesDialog.o +$(OBJDIR_LINUX_RELEASE)/PaletteMgmtDialog.o: PaletteMgmtDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PaletteMgmtDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/PaletteMgmtDialog.o $(OBJDIR_LINUX_RELEASE)/RestoreBackupDialog.o: RestoreBackupDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c RestoreBackupDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/RestoreBackupDialog.o @@ -2357,6 +2401,9 @@ $(OBJDIR_LINUX_RELEASE)/ResizeImageDialog.o: ResizeImageDialog.cpp $(OBJDIR_LINUX_RELEASE)/RenderProgressDialog.o: RenderProgressDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c RenderProgressDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/RenderProgressDialog.o +$(OBJDIR_LINUX_RELEASE)/JukeboxPanel.o: JukeboxPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c JukeboxPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/JukeboxPanel.o + $(OBJDIR_LINUX_RELEASE)/RenderCache.o: RenderCache.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c RenderCache.cpp -o $(OBJDIR_LINUX_RELEASE)/RenderCache.o @@ -2369,8 +2416,8 @@ $(OBJDIR_LINUX_RELEASE)/Render.o: Render.cpp $(OBJDIR_LINUX_RELEASE)/RenameTextDialog.o: RenameTextDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c RenameTextDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/RenameTextDialog.o -$(OBJDIR_LINUX_RELEASE)/BulkEditFontPickerDialog.o: BulkEditFontPickerDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BulkEditFontPickerDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/BulkEditFontPickerDialog.o +$(OBJDIR_LINUX_RELEASE)/RemapDMXChannelsDialog.o: RemapDMXChannelsDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c RemapDMXChannelsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/RemapDMXChannelsDialog.o $(OBJDIR_LINUX_RELEASE)/CharMapDialog.o: CharMapDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c CharMapDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/CharMapDialog.o @@ -2384,6 +2431,9 @@ $(OBJDIR_LINUX_RELEASE)/CachedFileDownloader.o: CachedFileDownloader.cpp $(OBJDIR_LINUX_RELEASE)/BulkEditSliderDialog.o: BulkEditSliderDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BulkEditSliderDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/BulkEditSliderDialog.o +$(OBJDIR_LINUX_RELEASE)/BulkEditFontPickerDialog.o: BulkEditFontPickerDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BulkEditFontPickerDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/BulkEditFontPickerDialog.o + $(OBJDIR_LINUX_RELEASE)/BulkEditControls.o: BulkEditControls.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BulkEditControls.cpp -o $(OBJDIR_LINUX_RELEASE)/BulkEditControls.o @@ -2408,6 +2458,9 @@ $(OBJDIR_LINUX_RELEASE)/ColourReplaceDialog.o: ColourReplaceDialog.cpp $(OBJDIR_LINUX_RELEASE)/ColorPanel.o: ColorPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ColorPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/ColorPanel.o +$(OBJDIR_LINUX_RELEASE)/BufferPanel.o: BufferPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BufferPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/BufferPanel.o + $(OBJDIR_LINUX_RELEASE)/ColorManager.o: ColorManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ColorManager.cpp -o $(OBJDIR_LINUX_RELEASE)/ColorManager.o @@ -2456,8 +2509,8 @@ $(OBJDIR_LINUX_RELEASE)/__/xSchedule/md5.o: ../xSchedule/md5.cpp $(OBJDIR_LINUX_RELEASE)/__/xFade/wxLED.o: ../xFade/wxLED.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xFade/wxLED.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xFade/wxLED.o -$(OBJDIR_LINUX_RELEASE)/BufferPanel.o: BufferPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BufferPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/BufferPanel.o +$(OBJDIR_LINUX_RELEASE)/AlignmentDialog.o: AlignmentDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c AlignmentDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/AlignmentDialog.o $(OBJDIR_LINUX_RELEASE)/BitmapCache.o: BitmapCache.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BitmapCache.cpp -o $(OBJDIR_LINUX_RELEASE)/BitmapCache.o @@ -2465,12 +2518,12 @@ $(OBJDIR_LINUX_RELEASE)/BitmapCache.o: BitmapCache.cpp $(OBJDIR_LINUX_RELEASE)/BatchRenderDialog.o: BatchRenderDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c BatchRenderDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/BatchRenderDialog.o +$(OBJDIR_LINUX_RELEASE)/AutoLabelDialog.o: AutoLabelDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c AutoLabelDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/AutoLabelDialog.o + $(OBJDIR_LINUX_RELEASE)/AudioManager.o: AudioManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c AudioManager.cpp -o $(OBJDIR_LINUX_RELEASE)/AudioManager.o -$(OBJDIR_LINUX_RELEASE)/AlignmentDialog.o: AlignmentDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c AlignmentDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/AlignmentDialog.o - $(OBJDIR_LINUX_RELEASE)/ControllerModelDialog.o: ControllerModelDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ControllerModelDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ControllerModelDialog.o @@ -2486,6 +2539,9 @@ $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonval.o: ../xSchedule/wxJSON/jsonv $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonreader.o: ../xSchedule/wxJSON/jsonreader.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xSchedule/wxJSON/jsonreader.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonreader.o +$(OBJDIR_LINUX_RELEASE)/ExportSettings.o: ExportSettings.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ExportSettings.cpp -o $(OBJDIR_LINUX_RELEASE)/ExportSettings.o + $(OBJDIR_LINUX_RELEASE)/FlickerFreeBitmapButton.o: FlickerFreeBitmapButton.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c FlickerFreeBitmapButton.cpp -o $(OBJDIR_LINUX_RELEASE)/FlickerFreeBitmapButton.o @@ -2498,12 +2554,6 @@ $(OBJDIR_LINUX_RELEASE)/FileConverter.o: FileConverter.cpp $(OBJDIR_LINUX_RELEASE)/FSEQFile.o: FSEQFile.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c FSEQFile.cpp -o $(OBJDIR_LINUX_RELEASE)/FSEQFile.o -$(OBJDIR_LINUX_RELEASE)/FontManager.o: FontManager.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c FontManager.cpp -o $(OBJDIR_LINUX_RELEASE)/FontManager.o - -$(OBJDIR_LINUX_RELEASE)/ExportSettings.o: ExportSettings.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ExportSettings.cpp -o $(OBJDIR_LINUX_RELEASE)/ExportSettings.o - $(OBJDIR_LINUX_RELEASE)/ExportModelSelect.o: ExportModelSelect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ExportModelSelect.cpp -o $(OBJDIR_LINUX_RELEASE)/ExportModelSelect.o @@ -2513,8 +2563,11 @@ $(OBJDIR_LINUX_RELEASE)/EmailDialog.o: EmailDialog.cpp $(OBJDIR_LINUX_RELEASE)/EffectsPanel.o: EffectsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EffectsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EffectsPanel.o -$(OBJDIR_LINUX_RELEASE)/JukeboxPanel.o: JukeboxPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c JukeboxPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/JukeboxPanel.o +$(OBJDIR_LINUX_RELEASE)/EffectTreeDialog.o: EffectTreeDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EffectTreeDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/EffectTreeDialog.o + +$(OBJDIR_LINUX_RELEASE)/HousePreviewPanel.o: HousePreviewPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c HousePreviewPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/HousePreviewPanel.o $(OBJDIR_LINUX_RELEASE)/JobPool.o: JobPool.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c JobPool.cpp -o $(OBJDIR_LINUX_RELEASE)/JobPool.o @@ -2525,12 +2578,6 @@ $(OBJDIR_LINUX_RELEASE)/ImportPreviewsModelsDialog.o: ImportPreviewsModelsDialog $(OBJDIR_LINUX_RELEASE)/IPEntryDialog.o: IPEntryDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c IPEntryDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/IPEntryDialog.o -$(OBJDIR_LINUX_RELEASE)/EffectTreeDialog.o: EffectTreeDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EffectTreeDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/EffectTreeDialog.o - -$(OBJDIR_LINUX_RELEASE)/HousePreviewPanel.o: HousePreviewPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c HousePreviewPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/HousePreviewPanel.o - $(OBJDIR_LINUX_RELEASE)/GenerateLyricsDialog.o: GenerateLyricsDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c GenerateLyricsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/GenerateLyricsDialog.o @@ -2540,6 +2587,9 @@ $(OBJDIR_LINUX_RELEASE)/GenerateCustomModelDialog.o: GenerateCustomModelDialog.c $(OBJDIR_LINUX_RELEASE)/GPURenderUtils.o: GPURenderUtils.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c GPURenderUtils.cpp -o $(OBJDIR_LINUX_RELEASE)/GPURenderUtils.o +$(OBJDIR_LINUX_RELEASE)/FontManager.o: FontManager.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c FontManager.cpp -o $(OBJDIR_LINUX_RELEASE)/FontManager.o + $(OBJDIR_LINUX_RELEASE)/DimmingCurvePanel.o: DimmingCurvePanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c DimmingCurvePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/DimmingCurvePanel.o @@ -2567,6 +2617,9 @@ $(OBJDIR_LINUX_RELEASE)/ConvertLogDialog.o: ConvertLogDialog.cpp $(OBJDIR_LINUX_RELEASE)/ConvertDialog.o: ConvertDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ConvertDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ConvertDialog.o +$(OBJDIR_LINUX_RELEASE)/EditAliasesDialog.o: EditAliasesDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EditAliasesDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/EditAliasesDialog.o + $(OBJDIR_LINUX_RELEASE)/EffectTimingDialog.o: EffectTimingDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EffectTimingDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/EffectTimingDialog.o @@ -2591,21 +2644,12 @@ $(OBJDIR_LINUX_RELEASE)/DragColoursBitmapButton.o: DragColoursBitmapButton.cpp $(OBJDIR_LINUX_RELEASE)/DissolveTransitionPattern.o: DissolveTransitionPattern.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c DissolveTransitionPattern.cpp -o $(OBJDIR_LINUX_RELEASE)/DissolveTransitionPattern.o -$(OBJDIR_LINUX_RELEASE)/effects/LifeEffect.o: effects/LifeEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LifeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LifeEffect.o - -$(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopePanel.o: effects/KaleidoscopePanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/KaleidoscopePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopePanel.o - $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopeEffect.o: effects/KaleidoscopeEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/KaleidoscopeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/GuitarPanel.o: effects/GuitarPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GuitarPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GuitarPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/LifePanel.o: effects/LifePanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LifePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LifePanel.o - $(OBJDIR_LINUX_RELEASE)/effects/GuitarEffect.o: effects/GuitarEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GuitarEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GuitarEffect.o @@ -2618,11 +2662,17 @@ $(OBJDIR_LINUX_RELEASE)/effects/GlediatorEffect.o: effects/GlediatorEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/GarlandsPanel.o: effects/GarlandsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GarlandsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GarlandsPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/MarqueePanel.o: effects/MarqueePanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MarqueePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MarqueePanel.o +$(OBJDIR_LINUX_RELEASE)/effects/GarlandsEffect.o: effects/GarlandsEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GarlandsEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GarlandsEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/MarqueeEffect.o: effects/MarqueeEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MarqueeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MarqueeEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/GalaxyPanel.o: effects/GalaxyPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GalaxyPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyPanel.o + +$(OBJDIR_LINUX_RELEASE)/effects/GalaxyEffect.o: effects/GalaxyEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GalaxyEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyEffect.o + +$(OBJDIR_LINUX_RELEASE)/effects/LightningPanel.o: effects/LightningPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LightningPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LightningPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LiquidPanel.o: effects/LiquidPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LiquidPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LiquidPanel.o @@ -2630,35 +2680,29 @@ $(OBJDIR_LINUX_RELEASE)/effects/LiquidPanel.o: effects/LiquidPanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/LiquidEffect.o: effects/LiquidEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LiquidEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LiquidEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/GarlandsEffect.o: effects/GarlandsEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GarlandsEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GarlandsEffect.o - $(OBJDIR_LINUX_RELEASE)/effects/LinesPanel.o: effects/LinesPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LinesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LinesPanel.o $(OBJDIR_LINUX_RELEASE)/effects/LinesEffect.o: effects/LinesEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LinesEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LinesEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/LightningPanel.o: effects/LightningPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LightningPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LightningPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/GIFImage.o: effects/GIFImage.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GIFImage.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GIFImage.o $(OBJDIR_LINUX_RELEASE)/effects/LightningEffect.o: effects/LightningEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LightningEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LightningEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/FacesEffect.o: effects/FacesEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FacesEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FacesEffect.o - -$(OBJDIR_LINUX_RELEASE)/effects/FillEffect.o: effects/FillEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FillEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FillEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/LifePanel.o: effects/LifePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LifePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LifePanel.o -$(OBJDIR_LINUX_RELEASE)/effects/FanPanel.o: effects/FanPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FanPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FanPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/LifeEffect.o: effects/LifeEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/LifeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/LifeEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/FanEffect.o: effects/FanEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FanEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FanEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopePanel.o: effects/KaleidoscopePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/KaleidoscopePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/KaleidoscopePanel.o -$(OBJDIR_LINUX_RELEASE)/effects/FacesPanel.o: effects/FacesPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FacesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FacesPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/FacesEffect.o: effects/FacesEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FacesEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FacesEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FX.o: effects/FX.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FX.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FX.o @@ -2669,24 +2713,24 @@ $(OBJDIR_LINUX_RELEASE)/effects/EffectPanelUtils.o: effects/EffectPanelUtils.cpp $(OBJDIR_LINUX_RELEASE)/effects/EffectManager.o: effects/EffectManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/EffectManager.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/EffectManager.o -$(OBJDIR_LINUX_RELEASE)/effects/DMXPanel.o: effects/DMXPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/DMXPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/DMXPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/FacesPanel.o: effects/FacesPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FacesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FacesPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/GalaxyPanel.o: effects/GalaxyPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GalaxyPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/DuplicatePanel.o: effects/DuplicatePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/DuplicatePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/DuplicatePanel.o -$(OBJDIR_LINUX_RELEASE)/effects/GalaxyEffect.o: effects/GalaxyEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GalaxyEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GalaxyEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/DuplicateEffect.o: effects/DuplicateEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/DuplicateEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/DuplicateEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/GIFImage.o: effects/GIFImage.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/GIFImage.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/GIFImage.o +$(OBJDIR_LINUX_RELEASE)/effects/DMXPanel.o: effects/DMXPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/DMXPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/DMXPanel.o + +$(OBJDIR_LINUX_RELEASE)/effects/DMXEffect.o: effects/DMXEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/DMXEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/DMXEffect.o $(OBJDIR_LINUX_RELEASE)/effects/FireworksPanel.o: effects/FireworksPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FireworksPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FireworksPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/MeteorsEffect.o: effects/MeteorsEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MeteorsEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MeteorsEffect.o - $(OBJDIR_LINUX_RELEASE)/effects/FireworksEffect.o: effects/FireworksEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FireworksEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FireworksEffect.o @@ -2699,14 +2743,17 @@ $(OBJDIR_LINUX_RELEASE)/effects/FireEffect.o: effects/FireEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/FillPanel.o: effects/FillPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FillPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FillPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/ServoPanel.o: effects/ServoPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ServoPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ServoPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/FillEffect.o: effects/FillEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FillEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FillEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/ShapePanel.o: effects/ShapePanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShapePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShapePanel.o +$(OBJDIR_LINUX_RELEASE)/effects/FanPanel.o: effects/FanPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FanPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FanPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/ShapeEffect.o: effects/ShapeEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShapeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShapeEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/FanEffect.o: effects/FanEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/FanEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/FanEffect.o + +$(OBJDIR_LINUX_RELEASE)/effects/RipplePanel.o: effects/RipplePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/RipplePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/RipplePanel.o $(OBJDIR_LINUX_RELEASE)/effects/ShaderPanel.o: effects/ShaderPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShaderPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShaderPanel.o @@ -2714,11 +2761,14 @@ $(OBJDIR_LINUX_RELEASE)/effects/ShaderPanel.o: effects/ShaderPanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/ShaderEffect.o: effects/ShaderEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShaderEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShaderEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/ServoPanel.o: effects/ServoPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ServoPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ServoPanel.o + $(OBJDIR_LINUX_RELEASE)/effects/ServoEffect.o: effects/ServoEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ServoEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ServoEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/RipplePanel.o: effects/RipplePanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/RipplePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/RipplePanel.o +$(OBJDIR_LINUX_RELEASE)/effects/ShapeEffect.o: effects/ShapeEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShapeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShapeEffect.o $(OBJDIR_LINUX_RELEASE)/effects/RippleEffect.o: effects/RippleEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/RippleEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/RippleEffect.o @@ -2726,14 +2776,11 @@ $(OBJDIR_LINUX_RELEASE)/effects/RippleEffect.o: effects/RippleEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/RenderableEffect.o: effects/RenderableEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/RenderableEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/RenderableEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/SingleStrandEffect.o: effects/SingleStrandEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SingleStrandEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandEffect.o - -$(OBJDIR_LINUX_RELEASE)/effects/SketchPanel.o: effects/SketchPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SketchPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SketchPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/PlasmaPanel.o: effects/PlasmaPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PlasmaPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/SketchEffectDrawing.o: effects/SketchEffectDrawing.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SketchEffectDrawing.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffectDrawing.o +$(OBJDIR_LINUX_RELEASE)/effects/PlasmaEffect.o: effects/PlasmaEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PlasmaEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaEffect.o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffect.o: effects/SketchEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SketchEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SketchEffect.o @@ -2741,6 +2788,9 @@ $(OBJDIR_LINUX_RELEASE)/effects/SketchEffect.o: effects/SketchEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandPanel.o: effects/SingleStrandPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SingleStrandPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/SingleStrandEffect.o: effects/SingleStrandEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/SingleStrandEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/SingleStrandEffect.o + $(OBJDIR_LINUX_RELEASE)/effects/ShockwavePanel.o: effects/ShockwavePanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShockwavePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShockwavePanel.o @@ -2753,11 +2803,11 @@ $(OBJDIR_LINUX_RELEASE)/effects/ShimmerPanel.o: effects/ShimmerPanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/ShimmerEffect.o: effects/ShimmerEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShimmerEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShimmerEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/OnEffect.o: effects/OnEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/OnEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/OnEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/ShapePanel.o: effects/ShapePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ShapePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ShapePanel.o -$(OBJDIR_LINUX_RELEASE)/effects/OffPanel.o: effects/OffPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/OffPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/OffPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/MorphEffect.o: effects/MorphEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MorphEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MorphEffect.o $(OBJDIR_LINUX_RELEASE)/effects/OffEffect.o: effects/OffEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/OffEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/OffEffect.o @@ -2765,29 +2815,26 @@ $(OBJDIR_LINUX_RELEASE)/effects/OffEffect.o: effects/OffEffect.cpp $(OBJDIR_LINUX_RELEASE)/effects/MusicPanel.o: effects/MusicPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MusicPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MusicPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/OnPanel.o: effects/OnPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/OnPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/OnPanel.o - $(OBJDIR_LINUX_RELEASE)/effects/MusicEffect.o: effects/MusicEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MusicEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MusicEffect.o $(OBJDIR_LINUX_RELEASE)/effects/MorphPanel.o: effects/MorphPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MorphPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MorphPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/MorphEffect.o: effects/MorphEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MorphEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MorphEffect.o - $(OBJDIR_LINUX_RELEASE)/effects/MeteorsPanel.o: effects/MeteorsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MeteorsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MeteorsPanel.o -$(OBJDIR_LINUX_RELEASE)/effects/PicturesPanel.o: effects/PicturesPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PicturesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PicturesPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/MeteorsEffect.o: effects/MeteorsEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MeteorsEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MeteorsEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/PlasmaPanel.o: effects/PlasmaPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PlasmaPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/MarqueePanel.o: effects/MarqueePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MarqueePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MarqueePanel.o -$(OBJDIR_LINUX_RELEASE)/effects/PlasmaEffect.o: effects/PlasmaEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PlasmaEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PlasmaEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/MarqueeEffect.o: effects/MarqueeEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/MarqueeEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/MarqueeEffect.o + +$(OBJDIR_LINUX_RELEASE)/effects/PianoPanel.o: effects/PianoPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PianoPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PianoPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PinwheelPanel.o: effects/PinwheelPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PinwheelPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PinwheelPanel.o @@ -2795,15 +2842,33 @@ $(OBJDIR_LINUX_RELEASE)/effects/PinwheelPanel.o: effects/PinwheelPanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/PinwheelEffect.o: effects/PinwheelEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PinwheelEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PinwheelEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/PicturesPanel.o: effects/PicturesPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PicturesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PicturesPanel.o + $(OBJDIR_LINUX_RELEASE)/effects/PicturesEffect.o: effects/PicturesEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PicturesEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PicturesEffect.o -$(OBJDIR_LINUX_RELEASE)/effects/PianoPanel.o: effects/PianoPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PianoPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PianoPanel.o +$(OBJDIR_LINUX_RELEASE)/effects/CurtainPanel.o: effects/CurtainPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/CurtainPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/CurtainPanel.o $(OBJDIR_LINUX_RELEASE)/effects/PianoEffect.o: effects/PianoEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/PianoEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/PianoEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/OnPanel.o: effects/OnPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/OnPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/OnPanel.o + +$(OBJDIR_LINUX_RELEASE)/effects/OnEffect.o: effects/OnEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/OnEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/OnEffect.o + +$(OBJDIR_LINUX_RELEASE)/effects/OffPanel.o: effects/OffPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/OffPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/OffPanel.o + +$(OBJDIR_LINUX_RELEASE)/VideoExporter.o: VideoExporter.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VideoExporter.cpp -o $(OBJDIR_LINUX_RELEASE)/VideoExporter.o + +$(OBJDIR_LINUX_RELEASE)/ViewpointMgr.o: ViewpointMgr.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ViewpointMgr.cpp -o $(OBJDIR_LINUX_RELEASE)/ViewpointMgr.o + $(OBJDIR_LINUX_RELEASE)/ViewpointDialog.o: ViewpointDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ViewpointDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ViewpointDialog.o @@ -2813,11 +2878,8 @@ $(OBJDIR_LINUX_RELEASE)/ViewObjectPanel.o: ViewObjectPanel.cpp $(OBJDIR_LINUX_RELEASE)/VideoReader.o: VideoReader.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VideoReader.cpp -o $(OBJDIR_LINUX_RELEASE)/VideoReader.o -$(OBJDIR_LINUX_RELEASE)/VideoExporter.o: VideoExporter.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VideoExporter.cpp -o $(OBJDIR_LINUX_RELEASE)/VideoExporter.o - -$(OBJDIR_LINUX_RELEASE)/ViewpointMgr.o: ViewpointMgr.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ViewpointMgr.cpp -o $(OBJDIR_LINUX_RELEASE)/ViewpointMgr.o +$(OBJDIR_LINUX_RELEASE)/ViewsModelsPanel.o: ViewsModelsPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ViewsModelsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/ViewsModelsPanel.o $(OBJDIR_LINUX_RELEASE)/VendorMusicHelpers.o: VendorMusicHelpers.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VendorMusicHelpers.cpp -o $(OBJDIR_LINUX_RELEASE)/VendorMusicHelpers.o @@ -2831,6 +2893,12 @@ $(OBJDIR_LINUX_RELEASE)/VendorModelDialog.o: VendorModelDialog.cpp $(OBJDIR_LINUX_RELEASE)/ValueCurvesPanel.o: ValueCurvesPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ValueCurvesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/ValueCurvesPanel.o +$(OBJDIR_LINUX_RELEASE)/automation/LuaRunner.o: automation/LuaRunner.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c automation/LuaRunner.cpp -o $(OBJDIR_LINUX_RELEASE)/automation/LuaRunner.o + +$(OBJDIR_LINUX_RELEASE)/cad/CADWriter.o: cad/CADWriter.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c cad/CADWriter.cpp -o $(OBJDIR_LINUX_RELEASE)/cad/CADWriter.o + $(OBJDIR_LINUX_RELEASE)/cad/CADModel.o: cad/CADModel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c cad/CADModel.cpp -o $(OBJDIR_LINUX_RELEASE)/cad/CADModel.o @@ -2840,14 +2908,8 @@ $(OBJDIR_LINUX_RELEASE)/automation/xLightsAutomations.o: automation/xLightsAutom $(OBJDIR_LINUX_RELEASE)/automation/automation.o: automation/automation.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c automation/automation.cpp -o $(OBJDIR_LINUX_RELEASE)/automation/automation.o -$(OBJDIR_LINUX_RELEASE)/automation/LuaRunner.o: automation/LuaRunner.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c automation/LuaRunner.cpp -o $(OBJDIR_LINUX_RELEASE)/automation/LuaRunner.o - -$(OBJDIR_LINUX_RELEASE)/ValueCurveDialog.o: ValueCurveDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ValueCurveDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ValueCurveDialog.o - -$(OBJDIR_LINUX_RELEASE)/WiringDialog.o: WiringDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c WiringDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/WiringDialog.o +$(OBJDIR_LINUX_RELEASE)/WiringDialog.o: WiringDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c WiringDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/WiringDialog.o $(OBJDIR_LINUX_RELEASE)/VsaImportDialog.o: VsaImportDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VsaImportDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/VsaImportDialog.o @@ -2855,9 +2917,6 @@ $(OBJDIR_LINUX_RELEASE)/VsaImportDialog.o: VsaImportDialog.cpp $(OBJDIR_LINUX_RELEASE)/Vixen3.o: Vixen3.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c Vixen3.cpp -o $(OBJDIR_LINUX_RELEASE)/Vixen3.o -$(OBJDIR_LINUX_RELEASE)/ViewsModelsPanel.o: ViewsModelsPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ViewsModelsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/ViewsModelsPanel.o - $(OBJDIR_LINUX_RELEASE)/TabConvert.o: TabConvert.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c TabConvert.cpp -o $(OBJDIR_LINUX_RELEASE)/TabConvert.o @@ -2891,6 +2950,12 @@ $(OBJDIR_LINUX_RELEASE)/SubModelGenerateDialog.o: SubModelGenerateDialog.cpp $(OBJDIR_LINUX_RELEASE)/SubBufferPanel.o: SubBufferPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c SubBufferPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/SubBufferPanel.o +$(OBJDIR_LINUX_RELEASE)/VAMPPluginDialog.o: VAMPPluginDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VAMPPluginDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/VAMPPluginDialog.o + +$(OBJDIR_LINUX_RELEASE)/ValueCurveDialog.o: ValueCurveDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ValueCurveDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ValueCurveDialog.o + $(OBJDIR_LINUX_RELEASE)/ValueCurveButton.o: ValueCurveButton.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ValueCurveButton.cpp -o $(OBJDIR_LINUX_RELEASE)/ValueCurveButton.o @@ -2900,9 +2965,6 @@ $(OBJDIR_LINUX_RELEASE)/ValueCurve.o: ValueCurve.cpp $(OBJDIR_LINUX_RELEASE)/VSAFile.o: VSAFile.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VSAFile.cpp -o $(OBJDIR_LINUX_RELEASE)/VSAFile.o -$(OBJDIR_LINUX_RELEASE)/VAMPPluginDialog.o: VAMPPluginDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c VAMPPluginDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/VAMPPluginDialog.o - $(OBJDIR_LINUX_RELEASE)/UtilFunctions.o: UtilFunctions.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c UtilFunctions.cpp -o $(OBJDIR_LINUX_RELEASE)/UtilFunctions.o @@ -2915,11 +2977,8 @@ $(OBJDIR_LINUX_RELEASE)/UpdaterDialog.o: UpdaterDialog.cpp $(OBJDIR_LINUX_RELEASE)/TraceLog.o: TraceLog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c TraceLog.cpp -o $(OBJDIR_LINUX_RELEASE)/TraceLog.o -$(OBJDIR_LINUX_RELEASE)/effects/ButterflyPanel.o: effects/ButterflyPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ButterflyPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyPanel.o - -$(OBJDIR_LINUX_RELEASE)/effects/ButterflyEffect.o: effects/ButterflyEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ButterflyEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/AdjustEffect.o: effects/AdjustEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/AdjustEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/AdjustEffect.o $(OBJDIR_LINUX_RELEASE)/effects/BarsPanel.o: effects/BarsPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/BarsPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/BarsPanel.o @@ -2927,6 +2986,12 @@ $(OBJDIR_LINUX_RELEASE)/effects/BarsPanel.o: effects/BarsPanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/BarsEffect.o: effects/BarsEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/BarsEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/BarsEffect.o +$(OBJDIR_LINUX_RELEASE)/effects/AdjustPanel.o: effects/AdjustPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/AdjustPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/AdjustPanel.o + +$(OBJDIR_LINUX_RELEASE)/effects/ButterflyEffect.o: effects/ButterflyEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ButterflyEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyEffect.o + $(OBJDIR_LINUX_RELEASE)/controllers/WebSocketClient.o: controllers/WebSocketClient.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/WebSocketClient.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/WebSocketClient.o @@ -2939,23 +3004,14 @@ $(OBJDIR_LINUX_RELEASE)/controllers/SanDevices.o: controllers/SanDevices.cpp $(OBJDIR_LINUX_RELEASE)/controllers/Pixlite16.o: controllers/Pixlite16.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/Pixlite16.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/Pixlite16.o -$(OBJDIR_LINUX_RELEASE)/effects/ColorWashEffect.o: effects/ColorWashEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ColorWashEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashEffect.o - -$(OBJDIR_LINUX_RELEASE)/effects/DMXEffect.o: effects/DMXEffect.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/DMXEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/DMXEffect.o - -$(OBJDIR_LINUX_RELEASE)/effects/CurtainPanel.o: effects/CurtainPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/CurtainPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/CurtainPanel.o - $(OBJDIR_LINUX_RELEASE)/effects/CurtainEffect.o: effects/CurtainEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/CurtainEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/CurtainEffect.o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashPanel.o: effects/ColorWashPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ColorWashPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashPanel.o -$(OBJDIR_LINUX_RELEASE)/controllers/Minleon.o: controllers/Minleon.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/Minleon.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/Minleon.o +$(OBJDIR_LINUX_RELEASE)/effects/ColorWashEffect.o: effects/ColorWashEffect.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ColorWashEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ColorWashEffect.o $(OBJDIR_LINUX_RELEASE)/effects/CirclesPanel.o: effects/CirclesPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/CirclesPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/CirclesPanel.o @@ -2969,8 +3025,14 @@ $(OBJDIR_LINUX_RELEASE)/effects/CandlePanel.o: effects/CandlePanel.cpp $(OBJDIR_LINUX_RELEASE)/effects/CandleEffect.o: effects/CandleEffect.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/CandleEffect.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/CandleEffect.o -$(OBJDIR_LINUX_RELEASE)/cad/VRMLWriter.o: cad/VRMLWriter.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c cad/VRMLWriter.cpp -o $(OBJDIR_LINUX_RELEASE)/cad/VRMLWriter.o +$(OBJDIR_LINUX_RELEASE)/effects/ButterflyPanel.o: effects/ButterflyPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c effects/ButterflyPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/effects/ButterflyPanel.o + +$(OBJDIR_LINUX_RELEASE)/controllers/AlphaPix.o: controllers/AlphaPix.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/AlphaPix.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/AlphaPix.o + +$(OBJDIR_LINUX_RELEASE)/controllers/ESPixelStick.o: controllers/ESPixelStick.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/ESPixelStick.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/ESPixelStick.o $(OBJDIR_LINUX_RELEASE)/controllers/ControllerUploadData.o: controllers/ControllerUploadData.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/ControllerUploadData.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/ControllerUploadData.o @@ -2981,8 +3043,8 @@ $(OBJDIR_LINUX_RELEASE)/controllers/ControllerCaps.o: controllers/ControllerCaps $(OBJDIR_LINUX_RELEASE)/controllers/BaseController.o: controllers/BaseController.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/BaseController.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/BaseController.o -$(OBJDIR_LINUX_RELEASE)/controllers/AlphaPix.o: controllers/AlphaPix.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/AlphaPix.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/AlphaPix.o +$(OBJDIR_LINUX_RELEASE)/cad/VRMLWriter.o: cad/VRMLWriter.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c cad/VRMLWriter.cpp -o $(OBJDIR_LINUX_RELEASE)/cad/VRMLWriter.o $(OBJDIR_LINUX_RELEASE)/cad/STLWriter.o: cad/STLWriter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c cad/STLWriter.cpp -o $(OBJDIR_LINUX_RELEASE)/cad/STLWriter.o @@ -2993,8 +3055,11 @@ $(OBJDIR_LINUX_RELEASE)/cad/ModelToCAD.o: cad/ModelToCAD.cpp $(OBJDIR_LINUX_RELEASE)/cad/DXFWriter.o: cad/DXFWriter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c cad/DXFWriter.cpp -o $(OBJDIR_LINUX_RELEASE)/cad/DXFWriter.o -$(OBJDIR_LINUX_RELEASE)/cad/CADWriter.o: cad/CADWriter.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c cad/CADWriter.cpp -o $(OBJDIR_LINUX_RELEASE)/cad/CADWriter.o +$(OBJDIR_LINUX_RELEASE)/controllers/Falcon.o: controllers/Falcon.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/Falcon.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/Falcon.o + +$(OBJDIR_LINUX_RELEASE)/controllers/Minleon.o: controllers/Minleon.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/Minleon.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/Minleon.o $(OBJDIR_LINUX_RELEASE)/controllers/J1Sys.o: controllers/J1Sys.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/J1Sys.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/J1Sys.o @@ -3005,12 +3070,12 @@ $(OBJDIR_LINUX_RELEASE)/controllers/HinksPixExportDialog.o: controllers/HinksPix $(OBJDIR_LINUX_RELEASE)/controllers/HinksPix.o: controllers/HinksPix.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/HinksPix.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/HinksPix.o -$(OBJDIR_LINUX_RELEASE)/controllers/Falcon.o: controllers/Falcon.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/Falcon.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/Falcon.o - $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o: ../common/xlBaseApp.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../common/xlBaseApp.cpp -o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o +$(OBJDIR_LINUX_RELEASE)/controllers/FPPUploadProgressDialog.o: controllers/FPPUploadProgressDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/FPPUploadProgressDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/FPPUploadProgressDialog.o + $(OBJDIR_LINUX_RELEASE)/controllers/FPPConnectDialog.o: controllers/FPPConnectDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/FPPConnectDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/FPPConnectDialog.o @@ -3020,9 +3085,6 @@ $(OBJDIR_LINUX_RELEASE)/controllers/FPP.o: controllers/FPP.cpp $(OBJDIR_LINUX_RELEASE)/controllers/Experience.o: controllers/Experience.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/Experience.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/Experience.o -$(OBJDIR_LINUX_RELEASE)/controllers/ESPixelStick.o: controllers/ESPixelStick.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c controllers/ESPixelStick.cpp -o $(OBJDIR_LINUX_RELEASE)/controllers/ESPixelStick.o - clean_linux_release: rm -f $(OBJ_LINUX_RELEASE) $(OUT_LINUX_RELEASE) @@ -3110,6 +3172,8 @@ sequencer/RowHeading.h: sequencer/SequenceElements.h Color.h SequencePackage.h: sequencer/Element.h sequencer/Effect.h +models/ThreePointScreenLocation.cpp: models/ThreePointScreenLocation.h ModelPreview.h support/VectorMath.h UtilFunctions.h models/RulerObject.h + models/SphereModel.cpp: models/SphereModel.h models/ModelScreenLocation.h xLightsVersion.h xLightsMain.h UtilFunctions.h ModelPreview.h models/SphereModel.h: models/MatrixModel.h @@ -3124,15 +3188,7 @@ models/Shapes.h: Color.h models/RulerObject.cpp: models/RulerObject.h ModelPreview.h models/Model.h -models/ViewObjectManager.cpp: models/ViewObjectManager.h models/GridlinesObject.h models/RulerObject.h models/ImageObject.h models/MeshObject.h models/TerrianObject.h xLightsMain.h - -models/GridlinesObject.h: models/ViewObject.h models/BoxedScreenLocation.h - -models/ImageObject.h: models/ViewObject.h models/BoxedScreenLocation.h - -models/MeshObject.h: models/ViewObject.h models/BoxedScreenLocation.h - -outputs/ArtNetOutput.cpp: outputs/ArtNetOutput.h outputs/OutputManager.h UtilFunctions.h outputs/ControllerEthernet.h OutputModelManager.h SpecialOptions.h Discovery.h +outputs/ArtNetOutput.cpp: outputs/ArtNetOutput.h outputs/OutputManager.h UtilFunctions.h outputs/ControllerEthernet.h OutputModelManager.h SpecialOptions.h models/ModelManager.h Discovery.h outputs/ArtNetOutput.h: outputs/IPOutput.h @@ -3158,6 +3214,14 @@ models/WholeHouseModel.cpp: models/WholeHouseModel.h models/ModelScreenLocation. models/WholeHouseModel.h: models/Model.h +models/ViewObjectManager.cpp: models/ViewObjectManager.h models/GridlinesObject.h models/RulerObject.h models/ImageObject.h models/MeshObject.h models/TerrianObject.h xLightsMain.h + +models/GridlinesObject.h: models/ViewObject.h models/BoxedScreenLocation.h + +models/ImageObject.h: models/ViewObject.h models/BoxedScreenLocation.h + +models/MeshObject.h: models/ViewObject.h models/BoxedScreenLocation.h + models/ViewObject.cpp: models/ViewObject.h models/Model.h models/TwoPointScreenLocation.cpp: models/TwoPointScreenLocation.h models/Model.h ModelPreview.h support/VectorMath.h UtilFunctions.h models/RulerObject.h @@ -3166,13 +3230,13 @@ models/TreeModel.cpp: models/TreeModel.h models/ModelScreenLocation.h xLightsVer models/TreeModel.h: models/MatrixModel.h -models/ThreePointScreenLocation.cpp: models/ThreePointScreenLocation.h ModelPreview.h support/VectorMath.h UtilFunctions.h models/RulerObject.h - models/ImageModel.cpp: models/ImageModel.h models/ModelScreenLocation.h ModelPreview.h RenderBuffer.h xLightsMain.h UtilFunctions.h ExternalHooks.h models/ImageModel.h: models/Model.h -models/Model.cpp: models/Model.h models/ModelManager.h models/ModelGroup.h xLightsApp.h xLightsMain.h xLightsXmlFile.h Color.h DimmingCurve.h StrandNodeNamesDialog.h ModelFaceDialog.h ModelStateDialog.h ModelChainDialog.h ModelDimmingCurveDialog.h StartChannelDialog.h SubModelsDialog.h outputs/Output.h outputs/OutputManager.h outputs/IPOutput.h outputs/Controller.h outputs/ControllerSerial.h VendorModelDialog.h ModelPreview.h models/ModelScreenLocation.h models/SubModel.h UtilFunctions.h xLightsVersion.h Pixels.h ExternalHooks.h models/CustomModel.h models/RulerObject.h CachedFileDownloader.h +models/Model.cpp: CachedFileDownloader.h models/CustomModel.h models/Model.h models/ModelGroup.h models/ModelManager.h models/ModelScreenLocation.h models/RulerObject.h models/SubModel.h Color.h DimmingCurve.h EditAliasesDialog.h ExternalHooks.h ModelChainDialog.h ModelDimmingCurveDialog.h ModelFaceDialog.h ModelPreview.h ModelStateDialog.h Pixels.h StartChannelDialog.h StrandNodeNamesDialog.h SubModelsDialog.h UtilFunctions.h VendorModelDialog.h outputs/Controller.h outputs/ControllerSerial.h outputs/IPOutput.h outputs/Output.h outputs/OutputManager.h xLightsApp.h xLightsMain.h xLightsVersion.h xLightsXmlFile.h + +models/CustomModel.h: models/Model.h DimmingCurve.h: Color.h @@ -3180,11 +3244,9 @@ ModelDimmingCurveDialog.h: DimmingCurvePanel.h DimmingCurvePanel.h: DimmingCurve.h -outputs/ControllerSerial.h: outputs/Controller.h - VendorModelDialog.h: CachedFileDownloader.h -models/CustomModel.h: models/Model.h +outputs/ControllerSerial.h: outputs/Controller.h models/MeshObject.cpp: models/MeshObject.h UtilFunctions.h ModelPreview.h ExternalHooks.h xLightsMain.h @@ -3212,13 +3274,17 @@ models/ObjectManager.cpp: models/ObjectManager.h models/Node.cpp: models/Node.h +outputs/Controller.cpp: outputs/Controller.h UtilFunctions.h outputs/Output.h outputs/OutputManager.h OutputModelManager.h outputs/ControllerEthernet.h outputs/ControllerNull.h outputs/ControllerSerial.h models/Model.h + +outputs/ControllerNull.h: outputs/Controller.h + models/MultiPointModel.cpp: models/MultiPointModel.h xLightsMain.h xLightsVersion.h models/MultiPointModel.h: models/Model.h models/MultiPointScreenLocation.h models/ModelScreenLocation.cpp: models/ModelScreenLocation.h models/Model.h ModelPreview.h models/Shapes.h ViewpointMgr.h support/VectorMath.h UtilFunctions.h xLightsApp.h xLightsMain.h models/RulerObject.h -models/ModelManager.cpp: models/ModelManager.h models/Model.h models/SubModel.h models/StarModel.h models/ArchesModel.h models/CandyCaneModel.h models/ChannelBlockModel.h models/CircleModel.h models/TreeModel.h models/CubeModel.h models/CustomModel.h models/ImageModel.h models/WholeHouseModel.h models/SingleLineModel.h models/PolyLineModel.h models/MultiPointModel.h models/ModelGroup.h models/WindowFrameModel.h models/WreathModel.h models/SphereModel.h models/SpinnerModel.h models/IciclesModel.h sequencer/Element.h xLightsMain.h UtilFunctions.h outputs/Output.h outputs/Controller.h outputs/ControllerEthernet.h CheckboxSelectDialog.h Parallel.h Pixels.h +models/ModelManager.cpp: models/ArchesModel.h models/CandyCaneModel.h models/ChannelBlockModel.h CheckboxSelectDialog.h models/CircleModel.h models/CubeModel.h models/CustomModel.h models/IciclesModel.h models/ImageModel.h models/Model.h models/ModelGroup.h models/ModelManager.h models/MultiPointModel.h Parallel.h models/PolyLineModel.h models/SingleLineModel.h models/SphereModel.h models/SpinnerModel.h models/StarModel.h models/SubModel.h models/TreeModel.h UtilFunctions.h models/WholeHouseModel.h models/WindowFrameModel.h models/WreathModel.h ModelPreview.h Pixels.h sequencer/Element.h xLightsMain.h outputs/Controller.h outputs/ControllerEthernet.h outputs/Output.h models/ArchesModel.h: models/Model.h @@ -3234,20 +3300,10 @@ Parallel.h: JobPool.h models/ModelGroup.cpp: models/ModelGroup.h models/ModelManager.h models/SingleLineModel.h models/ModelScreenLocation.h UtilFunctions.h -outputs/RenardOutput.cpp: outputs/RenardOutput.h - -outputs/RenardOutput.h: outputs/SerialOutput.h +outputs/SerialOutput.cpp: outputs/SerialOutput.h outputs/LOROutput.h outputs/LOROptimisedOutput.h outputs/DLightOutput.h outputs/RenardOutput.h outputs/DMXOutput.h outputs/xxxSerialOutput.h outputs/PixelNetOutput.h outputs/OpenDMXOutput.h outputs/OpenPixelNetOutput.h outputs/GenericSerialOutput.h outputs/OutputManager.h UtilFunctions.h outputs/SerialOutput.h: outputs/Output.h outputs/serial.h -outputs/TwinklyOutput.cpp: outputs/TwinklyOutput.h outputs/OutputManager.h UtilFunctions.h Discovery.h - -outputs/TwinklyOutput.h: outputs/IPOutput.h - -outputs/TestPreset.cpp: outputs/TestPreset.h outputs/Output.h UtilFunctions.h - -outputs/SerialOutput.cpp: outputs/SerialOutput.h outputs/LOROutput.h outputs/LOROptimisedOutput.h outputs/DLightOutput.h outputs/RenardOutput.h outputs/DMXOutput.h outputs/xxxSerialOutput.h outputs/PixelNetOutput.h outputs/OpenDMXOutput.h outputs/OpenPixelNetOutput.h outputs/GenericSerialOutput.h outputs/OutputManager.h UtilFunctions.h - outputs/LOROutput.h: outputs/SerialOutput.h outputs/LOROptimisedOutput.h: outputs/LOROutput.h outputs/LorControllers.h @@ -3256,6 +3312,8 @@ outputs/LorControllers.h: outputs/LorController.h outputs/DLightOutput.h: outputs/LOROutput.h +outputs/RenardOutput.h: outputs/SerialOutput.h + outputs/DMXOutput.h: outputs/SerialOutput.h outputs/xxxSerialOutput.h: outputs/SerialOutput.h @@ -3268,16 +3326,26 @@ outputs/OpenPixelNetOutput.h: outputs/SerialOutput.h outputs/GenericSerialOutput.h: outputs/SerialOutput.h +outputs/serial.cpp: outputs/serial.h outputs/serial_win32.cpp outputs/serial_posix.cpp + +outputs/serial_posix.cpp: outputs/serial.h + outputs/ZCPPOutput.cpp: outputs/ZCPPOutput.h outputs/OutputManager.h UtilFunctions.h outputs/ControllerEthernet.h OutputModelManager.h ExternalHooks.h Discovery.h outputs/ZCPPOutput.h: outputs/IPOutput.h outputs/ZCPP.h +outputs/TwinklyOutput.cpp: outputs/TwinklyOutput.h outputs/OutputManager.h UtilFunctions.h Discovery.h OutputModelManager.h + +outputs/TwinklyOutput.h: outputs/IPOutput.h + +outputs/TestPreset.cpp: outputs/TestPreset.h outputs/Output.h UtilFunctions.h + +outputs/RenardOutput.cpp: outputs/RenardOutput.h + outputs/PixelNetOutput.cpp: outputs/PixelNetOutput.h outputs/OutputManager.cpp: outputs/OutputManager.h outputs/ControllerEthernet.h outputs/ControllerNull.h outputs/ControllerSerial.h outputs/SerialOutput.h outputs/E131Output.h outputs/ZCPPOutput.h outputs/ArtNetOutput.h outputs/DDPOutput.h outputs/xxxEthernetOutput.h outputs/OPCOutput.h outputs/TestPreset.h Parallel.h UtilFunctions.h -outputs/ControllerNull.h: outputs/Controller.h - outputs/E131Output.h: outputs/IPOutput.h outputs/DDPOutput.h: outputs/IPOutput.h @@ -3292,39 +3360,43 @@ outputs/KinetOutput.h: outputs/IPOutput.h outputs/NullOutput.h: outputs/Output.h -outputs/OpenPixelNetOutput.cpp: outputs/OpenPixelNetOutput.h - -preferences/OtherSettingsPanel.cpp: xLightsMain.h - -preferences/EffectsGridSettingsPanel.cpp: xLightsMain.h - preferences/ColorManagerSettingsPanel.cpp: xLightsMain.h sequencer/MainSequencer.h UtilFunctions.h sequencer/MainSequencer.h: sequencer/RowHeading.h sequencer/EffectsGrid.h sequencer/Waveform.h KeyBindings.h sequencer/Waveform.h: AudioManager.h +preferences/RandomEffectsSettingsPanel.cpp: effects/RenderableEffect.h xLightsMain.h + +effects/RenderableEffect.h: Color.h effects/assist/AssistPanel.h + +effects/assist/AssistPanel.h: xlGridCanvas.h + +xlGridCanvas.h: sequencer/Effect.h + +preferences/OutputSettingsPanel.cpp: xLightsMain.h UtilFunctions.h + +preferences/OtherSettingsPanel.cpp: xLightsMain.h + +preferences/EffectsGridSettingsPanel.cpp: xLightsMain.h + preferences/CheckSequenceSettingsPanel.cpp: xLightsMain.h preferences/BackupSettingsPanel.cpp: xLightsMain.h outputs/xxxSerialOutput.cpp: outputs/xxxSerialOutput.h -outputs/xxxEthernetOutput.cpp: outputs/xxxEthernetOutput.h outputs/OutputManager.h UtilFunctions.h +outputs/xxxEthernetOutput.cpp: outputs/xxxEthernetOutput.h outputs/OutputManager.h UtilFunctions.h models/ModelManager.h outputs/ControllerEthernet.h -outputs/serial.cpp: outputs/serial.h outputs/serial_win32.cpp outputs/serial_posix.cpp - -outputs/serial_posix.cpp: outputs/serial.h - -outputs/DDPOutput.cpp: outputs/DDPOutput.h outputs/OutputManager.h UtilFunctions.h OutputModelManager.h outputs/ControllerEthernet.h Discovery.h +outputs/IPOutput.cpp: outputs/IPOutput.h outputs/GenericSerialOutput.cpp: outputs/GenericSerialOutput.h -outputs/E131Output.cpp: outputs/E131Output.h outputs/OutputManager.h UtilFunctions.h +outputs/E131Output.cpp: outputs/E131Output.h outputs/OutputManager.h UtilFunctions.h outputs/ControllerEthernet.h models/ModelManager.h outputs/DMXOutput.cpp: outputs/DMXOutput.h -outputs/IPOutput.cpp: outputs/IPOutput.h +outputs/DDPOutput.cpp: outputs/DDPOutput.h outputs/OutputManager.h UtilFunctions.h OutputModelManager.h outputs/ControllerEthernet.h Discovery.h outputs/ControllerSerial.cpp: outputs/ControllerSerial.h OutputModelManager.h UtilFunctions.h SpecialOptions.h outputs/OutputManager.h outputs/Output.h outputs/SerialOutput.h outputs/DDPOutput.h outputs/DLightOutput.h outputs/DMXOutput.h outputs/OpenDMXOutput.h outputs/OpenPixelNetOutput.h outputs/RenardOutput.h outputs/LOROutput.h outputs/LOROptimisedOutput.h outputs/PixelNetOutput.h outputs/xxxSerialOutput.h outputs/GenericSerialOutput.h models/ModelManager.h @@ -3332,23 +3404,23 @@ outputs/ControllerNull.cpp: outputs/ControllerNull.h outputs/OutputManager.h out outputs/ControllerEthernet.cpp: outputs/ControllerEthernet.h outputs/OutputManager.h outputs/Output.h UtilFunctions.h SpecialOptions.h OutputModelManager.h outputs/IPOutput.h outputs/E131Output.h outputs/ArtNetOutput.h outputs/ZCPPOutput.h outputs/DDPOutput.h outputs/KinetOutput.h outputs/xxxEthernetOutput.h outputs/TwinklyOutput.h outputs/OPCOutput.h models/ModelManager.h xLightsMain.h -outputs/Controller.cpp: outputs/Controller.h UtilFunctions.h outputs/Output.h outputs/OutputManager.h OutputModelManager.h outputs/ControllerEthernet.h outputs/ControllerNull.h outputs/ControllerSerial.h models/Model.h +outputs/LorControllers.cpp: outputs/LorControllers.h -outputs/LorController.cpp: outputs/LorController.h UtilFunctions.h +outputs/OpenPixelNetOutput.cpp: outputs/OpenPixelNetOutput.h outputs/OpenDMXOutput.cpp: outputs/OpenDMXOutput.h -outputs/OPCOutput.cpp: outputs/OPCOutput.h outputs/OutputManager.h UtilFunctions.h +outputs/OPCOutput.cpp: outputs/OPCOutput.h outputs/OutputManager.h UtilFunctions.h outputs/ControllerEthernet.h outputs/NullOutput.cpp: outputs/NullOutput.h OutputModelManager.h -outputs/LorControllers.cpp: outputs/LorControllers.h +outputs/LorController.cpp: outputs/LorController.h UtilFunctions.h outputs/LOROutput.cpp: outputs/LOROutput.h outputs/LOROptimisedOutput.cpp: outputs/LOROptimisedOutput.h outputs/Controller.h OutputModelManager.h UtilFunctions.h -outputs/KinetOutput.cpp: outputs/KinetOutput.h outputs/OutputManager.h UtilFunctions.h outputs/ControllerEthernet.h +outputs/KinetOutput.cpp: outputs/KinetOutput.h outputs/OutputManager.h UtilFunctions.h outputs/ControllerEthernet.h models/ModelManager.h effects/WarpPanel.cpp: effects/WarpPanel.h effects/WarpEffect.h effects/EffectPanelUtils.h @@ -3362,12 +3434,6 @@ effects/EffectPanelUtils.h: xlLockButton.h effects/WarpEffect.h: effects/RenderableEffect.h -effects/RenderableEffect.h: Color.h effects/assist/AssistPanel.h - -effects/assist/AssistPanel.h: xlGridCanvas.h - -xlGridCanvas.h: sequencer/Effect.h - effects/WarpEffect.cpp: ../include/warp-64.xpm ../include/warp-48.xpm ../include/warp-32.xpm ../include/warp-24.xpm ../include/warp-16.xpm effects/WarpEffect.h effects/WarpPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h xLightsMain.h DissolveTransitionPattern.h xLightsApp.h TimingPanel.h UtilFunctions.h Parallel.h TimingPanel.h: BulkEditControls.h effects/EffectPanelUtils.h @@ -3380,12 +3446,6 @@ effects/VideoEffect.h: effects/RenderableEffect.h RenderBuffer.h effects/VideoEffect.cpp: ../include/video-16.xpm ../include/video-24.xpm ../include/video-32.xpm ../include/video-48.xpm ../include/video-64.xpm effects/VideoEffect.h effects/VideoPanel.h VideoReader.h sequencer/Effect.h RenderBuffer.h UtilClasses.h xLightsXmlFile.h xLightsMain.h models/Model.h UtilFunctions.h ExternalHooks.h -effects/WaveEffect.cpp: effects/WaveEffect.h effects/WavePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h ../include/wave-16.xpm ../include/wave-24.xpm ../include/wave-32.xpm ../include/wave-48.xpm ../include/wave-64.xpm - -effects/WaveEffect.h: effects/RenderableEffect.h - -effects/WavePanel.h: BulkEditControls.h effects/EffectPanelUtils.h - effects/VUMeterPanel.cpp: effects/VUMeterPanel.h effects/EffectPanelUtils.h effects/VUMeterEffect.h UtilFunctions.h effects/VUMeterPanel.h: BulkEditControls.h effects/EffectPanelUtils.h @@ -3402,6 +3462,16 @@ effects/TwinkleEffect.h: effects/RenderableEffect.h effects/TwinkleEffect.cpp: effects/TwinkleEffect.h effects/TwinklePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/twinkle-16.xpm ../include/twinkle-24.xpm ../include/twinkle-32.xpm ../include/twinkle-48.xpm ../include/twinkle-64.xpm ValueCurve.h Parallel.h +effects/TreePanel.cpp: effects/TreePanel.h effects/EffectPanelUtils.h + +effects/TreePanel.h: BulkEditControls.h effects/EffectPanelUtils.h + +effects/assist/SketchAssistPanel.cpp: effects/assist/SketchAssistPanel.h effects/assist/SketchCanvasPanel.h UtilFunctions.h xLightsMain.h ExternalHooks.h + +effects/assist/SketchAssistPanel.h: effects/SketchEffectDrawing.h effects/assist/SketchCanvasPanel.h + +effects/SketchEffectDrawing.h: effects/assist/SketchCanvasPanel.h + effects/assist/xlGridCanvasPictures.cpp: effects/assist/xlGridCanvasPictures.h ResizeImageDialog.h ExternalHooks.h UtilFunctions.h effects/assist/xlGridCanvasPictures.h: xlGridCanvas.h sequencer/Effect.h @@ -3416,13 +3486,9 @@ effects/assist/xlGridCanvasEmpty.h: xlGridCanvas.h sequencer/Effect.h effects/assist/SketchCanvasPanel.cpp: effects/assist/SketchCanvasPanel.h effects/SketchEffectDrawing.h -effects/TreePanel.cpp: effects/TreePanel.h effects/EffectPanelUtils.h - -effects/TreePanel.h: BulkEditControls.h effects/EffectPanelUtils.h - -effects/assist/SketchAssistPanel.cpp: effects/assist/SketchAssistPanel.h effects/assist/SketchCanvasPanel.h UtilFunctions.h xLightsMain.h ExternalHooks.h +effects/TreeEffect.cpp: effects/TreeEffect.h effects/TreePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/tree-16.xpm ../include/tree-24.xpm ../include/tree-32.xpm ../include/tree-48.xpm ../include/tree-64.xpm -effects/assist/SketchAssistPanel.h: effects/SketchEffectDrawing.h effects/assist/SketchCanvasPanel.h +effects/TreeEffect.h: effects/RenderableEffect.h effects/assist/PicturesAssistPanel.cpp: effects/assist/PicturesAssistPanel.h xlColorPicker.h xlColorPickerFields.h ../include/PaintToolIcons.h models/Model.h xLightsMain.h xLightsXmlFile.h @@ -3438,32 +3504,32 @@ effects/assist/AssistPanel.cpp: effects/assist/AssistPanel.h effects/assist/Sket effects/WavePanel.cpp: effects/WavePanel.h effects/EffectPanelUtils.h effects/WaveEffect.h -effects/SpiralsEffect.cpp: effects/SpiralsEffect.h effects/SpiralsPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/spirals-16.xpm ../include/spirals-24.xpm ../include/spirals-32.xpm ../include/spirals-48.xpm ../include/spirals-64.xpm Parallel.h - -effects/SpiralsEffect.h: effects/RenderableEffect.h - -effects/SpiralsPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/WavePanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/StateEffect.cpp: effects/StateEffect.h effects/StatePanel.h models/Model.h sequencer/SequenceElements.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h models/ModelGroup.h ../include/state-16.xpm ../include/state-64.xpm +effects/WaveEffect.h: effects/RenderableEffect.h -effects/StateEffect.h: effects/RenderableEffect.h +effects/WaveEffect.cpp: effects/WaveEffect.h effects/WavePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h ../include/wave-16.xpm ../include/wave-24.xpm ../include/wave-32.xpm ../include/wave-48.xpm ../include/wave-64.xpm -effects/StatePanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/SpirographEffect.cpp: effects/SpirographEffect.h effects/SpirographPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/spirograph-16.xpm ../include/spirograph-24.xpm ../include/spirograph-32.xpm ../include/spirograph-48.xpm ../include/spirograph-64.xpm -effects/SpirographPanel.cpp: effects/SpirographPanel.h effects/EffectPanelUtils.h effects/SpirographEffect.h +effects/SpirographEffect.h: effects/RenderableEffect.h effects/SpirographPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/SpirographEffect.h: effects/RenderableEffect.h +effects/SpiralsPanel.cpp: effects/SpiralsPanel.h effects/EffectPanelUtils.h effects/SpiralsEffect.h -effects/SpirographEffect.cpp: effects/SpirographEffect.h effects/SpirographPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/spirograph-16.xpm ../include/spirograph-24.xpm ../include/spirograph-32.xpm ../include/spirograph-48.xpm ../include/spirograph-64.xpm +effects/SpiralsPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/SpiralsPanel.cpp: effects/SpiralsPanel.h effects/EffectPanelUtils.h effects/SpiralsEffect.h +effects/SpiralsEffect.h: effects/RenderableEffect.h + +effects/SpiralsEffect.cpp: effects/SpiralsEffect.h effects/SpiralsPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/spirals-16.xpm ../include/spirals-24.xpm ../include/spirals-32.xpm ../include/spirals-48.xpm ../include/spirals-64.xpm Parallel.h effects/SnowstormPanel.cpp: effects/SnowstormPanel.h effects/EffectPanelUtils.h effects/SnowstormPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/SpirographPanel.cpp: effects/SpirographPanel.h effects/EffectPanelUtils.h effects/SpirographEffect.h + effects/SnowstormEffect.cpp: effects/SnowstormEffect.h effects/SnowstormPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/snowstorm-16.xpm ../include/snowstorm-24.xpm ../include/snowstorm-32.xpm ../include/snowstorm-48.xpm ../include/snowstorm-64.xpm effects/SnowstormEffect.h: effects/RenderableEffect.h @@ -3476,9 +3542,9 @@ effects/SnowflakesEffect.h: effects/RenderableEffect.h effects/SnowflakesEffect.cpp: effects/SnowflakesEffect.h effects/SnowflakesPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/snowflakes-16.xpm ../include/snowflakes-24.xpm ../include/snowflakes-32.xpm ../include/snowflakes-48.xpm ../include/snowflakes-64.xpm -effects/TreeEffect.cpp: effects/TreeEffect.h effects/TreePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/tree-16.xpm ../include/tree-24.xpm ../include/tree-32.xpm ../include/tree-48.xpm ../include/tree-64.xpm +effects/SketchPanel.cpp: effects/SketchPanel.h BulkEditControls.h effects/assist/SketchAssistPanel.h xLightsMain.h -effects/TreeEffect.h: effects/RenderableEffect.h +effects/SketchPanel.h: effects/EffectPanelUtils.h effects/TextPanel.cpp: effects/TextPanel.h effects/EffectPanelUtils.h ExternalHooks.h FontManager.h @@ -3494,8 +3560,6 @@ effects/TendrilPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/TendrilEffect.h: effects/RenderableEffect.h RenderBuffer.h -graphics/opengl/DrawGLUtils.cpp: ExternalHooks.h UtilFunctions.h - effects/TendrilEffect.cpp: effects/TendrilEffect.h effects/TendrilPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h AudioManager.h ../include/tendril-16.xpm ../include/tendril-24.xpm ../include/tendril-32.xpm ../include/tendril-48.xpm ../include/tendril-64.xpm effects/StrobePanel.cpp: effects/StrobePanel.h effects/EffectPanelUtils.h @@ -3508,6 +3572,12 @@ effects/StrobeEffect.h: effects/RenderableEffect.h effects/StatePanel.cpp: effects/StatePanel.h effects/EffectPanelUtils.h effects/StateEffect.h +effects/StatePanel.h: BulkEditControls.h effects/EffectPanelUtils.h + +effects/StateEffect.h: effects/RenderableEffect.h + +effects/StateEffect.cpp: effects/StateEffect.h effects/StatePanel.h models/Model.h sequencer/SequenceElements.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h models/ModelGroup.h ../include/state-16.xpm ../include/state-64.xpm + models/DMX/DmxMovingHead3D.cpp: models/ModelScreenLocation.h ModelPreview.h RenderBuffer.h xLightsVersion.h xLightsMain.h UtilFunctions.h models/DMX/DmxMovingHead.cpp: models/ModelScreenLocation.h ModelPreview.h RenderBuffer.h xLightsVersion.h xLightsMain.h UtilFunctions.h @@ -3548,10 +3618,10 @@ models/ArchesModel.cpp: models/ArchesModel.h models/ModelScreenLocation.h xLight graphics/xlMesh.cpp: ExternalHooks.h UtilFunctions.h -models/BaseObject.cpp: models/BaseObject.h models/ModelScreenLocation.h xLightsMain.h xLightsApp.h - graphics/opengl/xlGLCanvas.cpp: UtilFunctions.h ExternalHooks.h +graphics/opengl/DrawGLUtils.cpp: ExternalHooks.h UtilFunctions.h + models/CircleModel.cpp: models/CircleModel.h models/ModelScreenLocation.h OutputModelManager.h xLightsVersion.h xLightsMain.h UtilFunctions.h ModelPreview.h models/DMX/DmxColorAbilityCMY.cpp: models/BaseObject.h models/Model.h Color.h models/Node.h @@ -3562,48 +3632,48 @@ models/CustomModel.cpp: models/CustomModel.h CustomModelDialog.h xLightsMain.h x models/CubeModel.cpp: models/CubeModel.h models/ModelScreenLocation.h xLightsVersion.h xLightsMain.h UtilFunctions.h outputs/OutputManager.h outputs/Controller.h ModelPreview.h -preferences/OutputSettingsPanel.cpp: xLightsMain.h UtilFunctions.h - models/ChannelBlockModel.cpp: models/ChannelBlockModel.h models/ModelScreenLocation.h OutputModelManager.h models/CandyCaneModel.cpp: OutputModelManager.h models/CandyCaneModel.h models/ModelScreenLocation.h models/BoxedScreenLocation.cpp: models/BoxedScreenLocation.h models/Model.h ModelPreview.h support/VectorMath.h models/RulerObject.h -xLightsMain.cpp: xLightsMain.h SplashDialog.h UpdaterDialog.h xLightsApp.h SeqSettingsDialog.h xLightsVersion.h RenderCommandEvent.h effects/RenderableEffect.h LayoutPanel.h models/ModelGroup.h PixelTestDialog.h ConvertDialog.h GenerateCustomModelDialog.h PathGenerationDialog.h UtilFunctions.h IPEntryDialog.h HousePreviewPanel.h BatchRenderDialog.h VideoExporter.h JukeboxPanel.h FindDataPanel.h EffectAssist.h EffectsPanel.h MultiControllerUploadDialog.h Parallel.h outputs/IPOutput.h outputs/E131Output.h GenerateLyricsDialog.h VendorModelDialog.h VendorMusicDialog.h sequencer/MainSequencer.h LayoutGroup.h ModelPreview.h TopEffectsPanel.h LyricUserDictDialog.h outputs/ZCPPOutput.h EffectIconPanel.h models/ViewObject.h models/SubModel.h effects/FacesEffect.h effects/StateEffect.h effects/ShaderEffect.h ShaderDownloadDialog.h CheckboxSelectDialog.h EmailDialog.h ValueCurveButton.h ValueCurvesPanel.h ColoursPanel.h SpecialOptions.h outputs/ControllerEthernet.h outputs/ControllerSerial.h KeyBindingEditDialog.h TraceLog.h AboutDialog.h ExternalHooks.h ExportSettings.h GPURenderUtils.h ViewsModelsPanel.h ColourReplaceDialog.h ModelRemap.h RestoreBackupDialog.h ../include/control-pause-blue-icon.xpm ../include/control-play-blue-icon.xpm ../dependencies/libxlsxwriter/include/xlsxwriter.h +models/BaseObject.cpp: models/BaseObject.h models/ModelScreenLocation.h xLightsMain.h xLightsApp.h -SeqSettingsDialog.h: xLightsXmlFile.h tmGridCell.h FlickerFreeBitmapButton.h +xLightsMain.cpp: AboutDialog.h BatchRenderDialog.h CachedFileDownloader.h CheckboxSelectDialog.h ColourReplaceDialog.h ColoursPanel.h ConvertDialog.h EffectAssist.h EffectIconPanel.h EffectsPanel.h EmailDialog.h ExportSettings.h ExternalHooks.h FindDataPanel.h GPURenderUtils.h GenerateCustomModelDialog.h GenerateLyricsDialog.h HousePreviewPanel.h IPEntryDialog.h JukeboxPanel.h KeyBindingEditDialog.h LayoutGroup.h LayoutPanel.h LyricUserDictDialog.h ModelPreview.h ModelRemap.h MultiControllerUploadDialog.h Parallel.h PathGenerationDialog.h PixelTestDialog.h RenderCommandEvent.h RestoreBackupDialog.h SeqSettingsDialog.h ShaderDownloadDialog.h SpecialOptions.h SplashDialog.h TopEffectsPanel.h TraceLog.h UpdaterDialog.h UtilFunctions.h ValueCurveButton.h ValueCurvesPanel.h VendorModelDialog.h VendorMusicDialog.h VideoExporter.h ViewsModelsPanel.h xLightsApp.h xLightsMain.h xLightsVersion.h effects/FacesEffect.h effects/RenderableEffect.h effects/ShaderEffect.h effects/StateEffect.h models/ModelGroup.h models/SubModel.h models/ViewObject.h outputs/ControllerEthernet.h outputs/ControllerSerial.h outputs/E131Output.h outputs/IPOutput.h outputs/ZCPPOutput.h sequencer/MainSequencer.h ../include/control-pause-blue-icon.xpm ../include/control-play-blue-icon.xpm ../dependencies/libxlsxwriter/include/xlsxwriter.h -RenderCommandEvent.h: sequencer/Element.h sequencer/Effect.h sequencer/EffectLayer.h +ConvertDialog.h: SequenceData.h -LayoutPanel.h: wxCheckedListCtrl.h ControllerConnectionDialog.h +EffectAssist.h: xlGridCanvas.h effects/assist/AssistPanel.h -PixelTestDialog.h: xLightsTimer.h models/ModelManager.h outputs/OutputManager.h SequenceData.h +EffectIconPanel.h: sequencer/DragEffectBitmapButton.h -ConvertDialog.h: SequenceData.h +FindDataPanel.h: sequencer/EffectsGrid.h GenerateCustomModelDialog.h: VideoReader.h -FindDataPanel.h: sequencer/EffectsGrid.h +LayoutPanel.h: wxCheckedListCtrl.h ControllerConnectionDialog.h -EffectAssist.h: xlGridCanvas.h effects/assist/AssistPanel.h +PixelTestDialog.h: xLightsTimer.h models/ModelManager.h outputs/OutputManager.h SequenceData.h -VendorMusicDialog.h: CachedFileDownloader.h VendorMusicHelpers.h +RenderCommandEvent.h: sequencer/Element.h sequencer/Effect.h sequencer/EffectLayer.h + +SeqSettingsDialog.h: xLightsXmlFile.h tmGridCell.h FlickerFreeBitmapButton.h + +ShaderDownloadDialog.h: CachedFileDownloader.h TopEffectsPanel.h: sequencer/DragEffectBitmapButton.h -EffectIconPanel.h: sequencer/DragEffectBitmapButton.h +ValueCurvesPanel.h: DragValueCurveBitmapButton.h + +VendorMusicDialog.h: CachedFileDownloader.h VendorMusicHelpers.h + +ViewsModelsPanel.h: wxCheckedListCtrl.h SequenceData.h effects/FacesEffect.h: effects/RenderableEffect.h effects/ShaderEffect.h: effects/RenderableEffect.h UtilFunctions.h -ShaderDownloadDialog.h: CachedFileDownloader.h - -ValueCurvesPanel.h: DragValueCurveBitmapButton.h - -ViewsModelsPanel.h: wxCheckedListCtrl.h SequenceData.h - xLightsImportChannelMapDialog.cpp: xLightsImportChannelMapDialog.h sequencer/SequenceElements.h xLightsMain.h models/Model.h models/ModelGroup.h UtilFunctions.h ExternalHooks.h MediaImportOptionsDialog.h LayoutUtils.h xLightsImportChannelMapDialog.h: Color.h SequencePackage.h @@ -3630,31 +3700,31 @@ xLightsXmlFile.cpp: ../include/zstd.h xLightsXmlFile.h xLightsMain.h OptionChoos xLightsVersion.cpp: xLightsVersion.h +utils/CurlManager.cpp: xLightsVersion.h + tmGridCell.cpp: tmGridCell.h support/VectorMath.cpp: support/VectorMath.h support/GridCellChoiceRenderer.cpp: support/GridCellChoiceRenderer.h -support/FastComboEditor.cpp: support/FastComboEditor.h support/EzGrid.h - -support/EzGrid.cpp: support/EzGrid.h +sequencer/Effect.cpp: sequencer/Effect.h sequencer/EffectLayer.h sequencer/Element.h sequencer/SequenceElements.h effects/EffectManager.h ColorCurve.h UtilFunctions.h ValueCurve.h UtilClasses.h RenderCache.h models/Model.h xLightsMain.h xLightsApp.h effects/RenderableEffect.h ExternalHooks.h -sequencer/EffectLayer.cpp: sequencer/EffectLayer.h sequencer/EffectsGrid.h sequencer/Effect.h sequencer/RowHeading.h models/Model.h effects/EffectManager.h effects/RenderableEffect.h sequencer/Element.h xLightsMain.h xLightsApp.h effects/DMXEffect.h +sequencer/Element.cpp: sequencer/Element.h models/Model.h UtilFunctions.h sequencer/SequenceElements.h xLightsMain.h -effects/DMXEffect.h: effects/RenderableEffect.h UtilFunctions.h +sequencer/EffectsGrid.cpp: sequencer/EffectsGrid.h sequencer/MainSequencer.h sequencer/TimeLine.h sequencer/RowHeading.h xLightsMain.h sequencer/SequenceElements.h sequencer/Effect.h sequencer/EffectLayer.h sequencer/EffectDropTarget.h RenderCommandEvent.h BitmapCache.h effects/RenderableEffect.h UtilFunctions.h xLightsXmlFile.h EffectTimingDialog.h effects/GlediatorEffect.h effects/VideoEffect.h effects/PicturesEffect.h effects/ShaderEffect.h ColorManager.h models/Model.h PixelBuffer.h VideoReader.h FindDataPanel.h DuplicateDialog.h AutoLabelDialog.h -sequencer/EffectDropTarget.cpp: sequencer/EffectDropTarget.h sequencer/EffectsGrid.h effects/PicturesEffect.h effects/VideoEffect.h effects/GlediatorEffect.h effects/ShaderEffect.h +effects/GlediatorEffect.h: effects/RenderableEffect.h effects/PicturesEffect.h: effects/RenderableEffect.h -effects/GlediatorEffect.h: effects/RenderableEffect.h +sequencer/EffectLayer.cpp: sequencer/EffectLayer.h sequencer/EffectsGrid.h sequencer/Effect.h sequencer/RowHeading.h models/Model.h effects/EffectManager.h effects/RenderableEffect.h sequencer/Element.h xLightsMain.h xLightsApp.h effects/DMXEffect.h -sequencer/Effect.cpp: sequencer/Effect.h sequencer/EffectLayer.h sequencer/Element.h sequencer/SequenceElements.h effects/EffectManager.h ColorCurve.h UtilFunctions.h ValueCurve.h UtilClasses.h RenderCache.h models/Model.h xLightsMain.h xLightsApp.h effects/RenderableEffect.h ExternalHooks.h +effects/DMXEffect.h: effects/RenderableEffect.h UtilFunctions.h -sequencer/DragEffectBitmapButton.cpp: sequencer/DragEffectBitmapButton.h BitmapCache.h xLightsMain.h effects/RenderableEffect.h RenderCommandEvent.h UtilFunctions.h sequencer/MainSequencer.h +sequencer/EffectDropTarget.cpp: sequencer/EffectDropTarget.h sequencer/EffectsGrid.h effects/PicturesEffect.h effects/VideoEffect.h effects/GlediatorEffect.h effects/ShaderEffect.h -sequencer/EffectsGrid.cpp: sequencer/EffectsGrid.h sequencer/MainSequencer.h sequencer/TimeLine.h sequencer/RowHeading.h xLightsMain.h sequencer/SequenceElements.h sequencer/Effect.h sequencer/EffectLayer.h sequencer/EffectDropTarget.h RenderCommandEvent.h BitmapCache.h effects/RenderableEffect.h UtilFunctions.h xLightsXmlFile.h EffectTimingDialog.h effects/GlediatorEffect.h effects/VideoEffect.h effects/PicturesEffect.h effects/ShaderEffect.h ColorManager.h models/Model.h PixelBuffer.h VideoReader.h FindDataPanel.h DuplicateDialog.h +sequencer/DragEffectBitmapButton.cpp: sequencer/DragEffectBitmapButton.h BitmapCache.h xLightsMain.h effects/RenderableEffect.h RenderCommandEvent.h UtilFunctions.h sequencer/MainSequencer.h preferences/xLightsPreferences.cpp: xLightsMain.h ../include/grid_icon.xpm ../include/settings_panel_icon.xpm @@ -3662,9 +3732,11 @@ preferences/ViewSettingsPanel.cpp: xLightsMain.h preferences/SequenceFileSettingsPanel.cpp: xLightsMain.h -preferences/RandomEffectsSettingsPanel.cpp: effects/RenderableEffect.h xLightsMain.h +sequencer/UndoManager.cpp: sequencer/UndoManager.h sequencer/Element.h sequencer/SequenceElements.h -sequencer/SequenceElements.cpp: sequencer/SequenceElements.h sequencer/TimeLine.h xLightsMain.h LyricsDialog.h xLightsXmlFile.h effects/RenderableEffect.h models/SubModel.h models/ModelGroup.h UtilFunctions.h SequenceViewManager.h JukeboxPanel.h TraceLog.h +support/FastComboEditor.cpp: support/FastComboEditor.h support/EzGrid.h + +support/EzGrid.cpp: support/EzGrid.h sequencer/tabSequencer.cpp: xLightsMain.h sequencer/SequenceElements.h TopEffectsPanel.h EffectIconPanel.h ValueCurvesPanel.h ColoursPanel.h sequencer/Element.h sequencer/Effect.h BufferPanel.h SeqSettingsDialog.h ViewsModelsPanel.h effects/RenderableEffect.h xlCustomControl.h NoteImportDialog.h MusicXML.h SeqElementMismatchDialog.h SequenceVideoPanel.h RenderCommandEvent.h xLightsVersion.h HousePreviewPanel.h UtilFunctions.h JukeboxPanel.h FindDataPanel.h EffectsPanel.h EffectAssist.h ColorPanel.h TimingPanel.h ModelPreview.h sequencer/MainSequencer.h PerspectivesPanel.h SelectPanel.h SearchPanel.h LayoutGroup.h ViewpointMgr.h LayoutPanel.h TraceLog.h effects/EffectPanelUtils.h ExternalHooks.h models/ModelGroup.h @@ -3674,23 +3746,23 @@ ColorPanel.h: xlLockButton.h ColorCurve.h BulkEditControls.h effects/EffectPanel sequencer/Waveform.cpp: xLightsTimer.h sequencer/Waveform.h sequencer/TimeLine.h RenderCommandEvent.h ColorManager.h xLightsApp.h xLightsMain.h sequencer/MainSequencer.h NoteRangeDialog.h -sequencer/UndoManager.cpp: sequencer/UndoManager.h sequencer/Element.h sequencer/SequenceElements.h - sequencer/TimeLine.cpp: sequencer/TimeLine.h sequencer/Waveform.h xLightsMain.h -sequencer/RowHeading.cpp: sequencer/RowHeading.h xLightsVersion.h BitmapCache.h models/ModelGroup.h SelectTimingsDialog.h models/SubModel.h sequencer/MainSequencer.h sequencer/EffectsGrid.h ColorManager.h sequencer/SequenceElements.h xLightsMain.h NewTimingDialog.h VAMPPluginDialog.h UtilFunctions.h +sequencer/SequenceElements.cpp: sequencer/SequenceElements.h sequencer/TimeLine.h xLightsMain.h LyricsDialog.h xLightsXmlFile.h effects/RenderableEffect.h models/SubModel.h models/ModelGroup.h UtilFunctions.h SequenceViewManager.h JukeboxPanel.h TraceLog.h + +sequencer/RowHeading.cpp: sequencer/RowHeading.h xLightsVersion.h BitmapCache.h models/ModelGroup.h SelectTimingsDialog.h models/SubModel.h sequencer/MainSequencer.h sequencer/EffectsGrid.h ColorManager.h sequencer/SequenceElements.h xLightsMain.h NewTimingDialog.h VAMPPluginDialog.h UtilFunctions.h MetronomeLabelDialog.h VAMPPluginDialog.h: xLightsXmlFile.h AudioManager.h sequencer/MainSequencer.cpp: sequencer/MainSequencer.h sequencer/SequenceElements.h xLightsMain.h sequencer/TimeLine.h UtilFunctions.h xLightsVersion.h EffectsPanel.h ExternalHooks.h effects/RenderableEffect.h -sequencer/Element.cpp: sequencer/Element.h models/Model.h UtilFunctions.h sequencer/SequenceElements.h xLightsMain.h +wxCheckedListCtrl.cpp: wxCheckedListCtrl.h wxModelGridCellRenderer.cpp: wxModelGridCellRenderer.h -wxCheckedListCtrl.cpp: wxCheckedListCtrl.h +effects/SketchEffectDrawing.cpp: effects/SketchEffectDrawing.h -MultiControllerUploadDialog.cpp: MultiControllerUploadDialog.h xLightsMain.h outputs/ControllerEthernet.h +ModelGroupPanel.cpp: ModelGroupPanel.h models/ModelManager.h models/ModelGroup.h LayoutPanel.h OutputModelManager.h xLightsMain.h UtilFunctions.h EditAliasesDialog.h Mouse3DManager.cpp: Mouse3DManager.h @@ -3700,11 +3772,9 @@ NodeSelectGrid.h: wxModelGridCellRenderer.h UtilClasses.h ModelRemap.cpp: ModelRemap.h -MusicXML.cpp: MusicXML.h ExternalHooks.h - ModelPreview.cpp: ModelPreview.h models/Model.h models/ViewObject.h PreviewPane.h ColorManager.h LayoutGroup.h xLightsMain.h models/ModelGroup.h ExternalHooks.h -ModelGroupPanel.cpp: ModelGroupPanel.h models/ModelManager.h models/ModelGroup.h LayoutPanel.h OutputModelManager.h xLightsMain.h UtilFunctions.h +MultiControllerUploadDialog.cpp: MultiControllerUploadDialog.h xLightsMain.h outputs/ControllerEthernet.h ModelFaceDialog.cpp: ../include/AI.xpm ../include/E.xpm ../include/ETC.xpm ../include/FV.xpm ../include/L.xpm ../include/MBP.xpm ../include/O.xpm ../include/REST.xpm ../include/U.xpm ../include/WQ.xpm ModelFaceDialog.h xLightsXmlFile.h NodesGridCellEditor.h ModelPreview.h DimmingCurve.h UtilFunctions.h ExternalHooks.h MatrixFaceDownloadDialog.h xLightsMain.h NodeSelectGrid.h models/Model.h xLightsApp.h support/VectorMath.h models/CustomModel.h outputs/OutputManager.h @@ -3712,9 +3782,9 @@ MatrixFaceDownloadDialog.h: CachedFileDownloader.h ModelDimmingCurveDialog.cpp: ModelDimmingCurveDialog.h xLightsXmlFile.h UtilFunctions.h ExternalHooks.h -PaletteMgmtDialog.cpp: PaletteMgmtDialog.h UtilFunctions.h +ModelChainDialog.cpp: ModelChainDialog.h UtilFunctions.h models/ModelManager.h models/Model.h -PaletteMgmtDialog.h: EffectsPanel.h +MetronomeLabelDialog.cpp: MetronomeLabelDialog.h OutputModelManager.cpp: models/BaseObject.h outputs/Controller.h xLightsMain.h OutputModelManager.h @@ -3724,8 +3794,6 @@ OpenGLShaders.cpp: UtilFunctions.h OpenGLShaders.h TraceLog.h NoteRangeDialog.cpp: NoteRangeDialog.h AudioManager.h -ModelChainDialog.cpp: ModelChainDialog.h UtilFunctions.h models/ModelManager.h models/Model.h - NoteImportDialog.cpp: NoteImportDialog.h sequencer/SequenceElements.h MusicXML.h UtilFunctions.h ExternalHooks.h NodesGridCellEditor.cpp: NodesGridCellEditor.h @@ -3734,20 +3802,22 @@ NodeSelectGrid.cpp: NodeSelectGrid.h models/Model.h models/CustomModel.h UtilFun NewTimingDialog.cpp: NewTimingDialog.h -LORPreview.cpp: LORPreview.h ModelPreview.h UtilFunctions.h xLightsMain.h models/Model.h models/ModelManager.h ExternalHooks.h - -LORPreview.h: Color.h - -LayoutUtils.cpp: LayoutUtils.h UtilFunctions.h BitmapCache.h +MusicXML.cpp: MusicXML.h ExternalHooks.h LayoutPanel.cpp: LayoutPanel.h ModelPreview.h xLightsMain.h ChannelLayoutDialog.h ControllerConnectionDialog.h ModelGroupPanel.h ViewObjectPanel.h LayoutGroup.h models/SubModel.h models/PolyLineModel.h models/ModelGroup.h models/ViewObject.h models/RulerObject.h models/CustomModel.h WiringDialog.h ModelDimmingCurveDialog.h UtilFunctions.h ExternalHooks.h ColorManager.h support/VectorMath.h KeyBindings.h sequencer/MainSequencer.h ImportPreviewsModelsDialog.h ViewsModelsPanel.h outputs/OutputManager.h outputs/Output.h LORPreview.h ModelFaceDialog.h ModelStateDialog.h CustomModelDialog.h SubModelsDialog.h LayoutUtils.h ImportPreviewsModelsDialog.h: models/ModelManager.h +LORPreview.h: Color.h + LayoutGroup.cpp: LayoutGroup.h xLightsMain.h models/Model.h PreviewPane.h ModelPreview.h LayerSelectDialog.cpp: LayerSelectDialog.h +LORPreview.cpp: LORPreview.h ModelPreview.h UtilFunctions.h xLightsMain.h models/Model.h models/ModelManager.h ExternalHooks.h + +LayoutUtils.cpp: LayoutUtils.h UtilFunctions.h BitmapCache.h + LOREdit.cpp: LOREdit.h sequencer/TimeLine.h UtilFunctions.h models/Model.h effects/SpiralsEffect.h effects/ButterflyEffect.h effects/BarsEffect.h effects/CurtainEffect.h effects/FireEffect.h effects/GarlandsEffect.h effects/MarqueeEffect.h effects/MeteorsEffect.h effects/PinwheelEffect.h effects/SnowflakesEffect.h effects/RippleEffect.h LOREdit.h: Color.h @@ -3790,18 +3860,18 @@ LorConvertDialog.cpp: LorConvertDialog.h LinkJukeboxButtonDialog.cpp: LinkJukeboxButtonDialog.h sequencer/MainSequencer.h JukeboxPanel.h -SeqElementMismatchDialog.cpp: SeqElementMismatchDialog.h - SequenceData.cpp: SequenceData.h UtilFunctions.h -SeqSettingsDialog.cpp: SeqSettingsDialog.h NewTimingDialog.h xLightsXmlFile.h DataLayer.h FileConverter.h LorConvertDialog.h ConvertLogDialog.h VAMPPluginDialog.h CustomTimingDialog.h VendorMusicDialog.h xLightsMain.h UtilFunctions.h ExternalHooks.h +SeqSettingsDialog.cpp: SeqSettingsDialog.h NewTimingDialog.h xLightsXmlFile.h DataLayer.h FileConverter.h LorConvertDialog.h ConvertLogDialog.h VAMPPluginDialog.h CustomTimingDialog.h VendorMusicDialog.h xLightsMain.h MetronomeLabelDialog.h UtilFunctions.h ExternalHooks.h FileConverter.h: DataLayer.h SequenceData.h Color.h -SeqFileUtilities.cpp: LOREdit.h xLightsMain.h SeqSettingsDialog.h FileConverter.h DataLayer.h VSAFile.h LMSImportChannelMapDialog.h xLightsImportChannelMapDialog.h SuperStarImportDialog.h VsaImportDialog.h SaveChangesDialog.h ConvertLogDialog.h xLightsVersion.h UtilFunctions.h ExternalHooks.h models/ModelGroup.h HousePreviewPanel.h FontManager.h SequenceVideoPanel.h EffectAssist.h ViewsModelsPanel.h ModelPreview.h sequencer/MainSequencer.h SelectPanel.h SearchPanel.h BufferPanel.h effects/SpiralsEffect.h effects/ButterflyEffect.h effects/BarsEffect.h effects/CurtainEffect.h effects/FireEffect.h effects/GarlandsEffect.h effects/MeteorsEffect.h effects/PinwheelEffect.h effects/SnowflakesEffect.h Vixen3.h SequencePackage.h +SeqFileUtilities.cpp: BufferPanel.h ConvertLogDialog.h DataLayer.h EffectAssist.h ExternalHooks.h FileConverter.h FontManager.h HousePreviewPanel.h LMSImportChannelMapDialog.h LOREdit.h ModelPreview.h SaveChangesDialog.h SearchPanel.h SelectPanel.h SeqSettingsDialog.h SequenceVideoPanel.h SuperStarImportDialog.h UtilFunctions.h VSAFile.h ViewsModelsPanel.h VsaImportDialog.h xLightsImportChannelMapDialog.h xLightsMain.h xLightsVersion.h models/ModelGroup.h sequencer/MainSequencer.h SequencePackage.h Vixen3.h effects/BarsEffect.h effects/ButterflyEffect.h effects/CurtainEffect.h effects/FireEffect.h effects/GarlandsEffect.h effects/MeteorsEffect.h effects/PinwheelEffect.h effects/SnowflakesEffect.h effects/SpiralsEffect.h xLightsApp.h SeqExportDialog.cpp: SeqExportDialog.h xLightsMain.h +SeqElementMismatchDialog.cpp: SeqElementMismatchDialog.h + SelectTimingsDialog.cpp: SelectTimingsDialog.h SelectPanel.cpp: SelectPanel.h sequencer/SequenceElements.h sequencer/EffectsGrid.h sequencer/MainSequencer.h sequencer/Effect.h sequencer/Element.h UtilFunctions.h Color.h @@ -3820,6 +3890,8 @@ SplashDialog.cpp: SplashDialog.h xLightsVersion.h UtilFunctions.h ShaderDownloadDialog.cpp: xLightsMain.h ShaderDownloadDialog.h CachedFileDownloader.h UtilFunctions.h ExternalHooks.h +SaveChangesDialog.cpp: SaveChangesDialog.h + SequenceViewManager.cpp: SequenceViewManager.h models/ModelManager.h models/Model.h UtilFunctions.h SequenceVideoPreview.cpp: SequenceVideoPreview.h @@ -3828,9 +3900,7 @@ SequenceVideoPanel.cpp: SequenceVideoPanel.h VideoReader.h SequenceVideoPreview. SequencePackage.cpp: SequencePackage.h xLightsMain.h ExternalHooks.h -PixelBuffer.cpp: PixelBuffer.h DimmingCurve.h models/ModelManager.h models/SingleLineModel.h models/ModelGroup.h UtilClasses.h AudioManager.h BufferPanel.h xLightsMain.h Parallel.h UtilFunctions.h DissolveTransitionPattern.h GPURenderUtils.h - -RemapDMXChannelsDialog.cpp: RemapDMXChannelsDialog.h +PhonemeDictionary.cpp: PhonemeDictionary.h UtilFunctions.h ExternalHooks.h PreviewPane.cpp: PreviewPane.h LayoutGroup.h @@ -3838,7 +3908,7 @@ Pixels.cpp: Pixels.h PixelTestDialog.cpp: PixelTestDialog.h models/Model.h models/ModelGroup.h models/SubModel.h xLightsXmlFile.h outputs/TestPreset.h outputs/Output.h UtilFunctions.h outputs/ControllerSerial.h xLightsMain.h ModelPreview.h support/VectorMath.h -PhonemeDictionary.cpp: PhonemeDictionary.h UtilFunctions.h ExternalHooks.h +PixelBuffer.cpp: PixelBuffer.h DimmingCurve.h models/ModelManager.h models/SingleLineModel.h models/ModelGroup.h UtilClasses.h AudioManager.h BufferPanel.h xLightsMain.h Parallel.h UtilFunctions.h DissolveTransitionPattern.h GPURenderUtils.h PerspectivesPanel.cpp: PerspectivesPanel.h @@ -3846,7 +3916,9 @@ PathGenerationDialog.cpp: PathGenerationDialog.h ValueCurve.h ExternalHooks.h Parallel.cpp: Parallel.h JobPool.h -SaveChangesDialog.cpp: SaveChangesDialog.h +PaletteMgmtDialog.cpp: PaletteMgmtDialog.h UtilFunctions.h + +PaletteMgmtDialog.h: EffectsPanel.h RestoreBackupDialog.cpp: RestoreBackupDialog.h UtilFunctions.h ../include/globals.h ExternalHooks.h @@ -3854,6 +3926,8 @@ ResizeImageDialog.cpp: ResizeImageDialog.h RenderProgressDialog.cpp: RenderProgressDialog.h +JukeboxPanel.cpp: JukeboxPanel.h sequencer/MainSequencer.h xLightsApp.h xLightsMain.h LinkJukeboxButtonDialog.h UtilFunctions.h + RenderCache.cpp: RenderCache.h sequencer/SequenceElements.h RenderBuffer.h models/Model.h xLightsVersion.h UtilFunctions.h TraceLog.h ExternalHooks.h RenderBuffer.cpp: RenderBuffer.h sequencer/Effect.h xLightsMain.h xLightsXmlFile.h UtilFunctions.h GPURenderUtils.h BufferPanel.h Parallel.h @@ -3862,7 +3936,7 @@ Render.cpp: xLightsMain.h xLightsXmlFile.h RenderCommandEvent.h effects/Renderab RenameTextDialog.cpp: RenameTextDialog.h -BulkEditFontPickerDialog.cpp: BulkEditFontPickerDialog.h +RemapDMXChannelsDialog.cpp: RemapDMXChannelsDialog.h CharMapDialog.cpp: CharMapDialog.h @@ -3876,6 +3950,8 @@ BulkEditSliderDialog.h: BulkEditControls.h ValueCurveButton.h ValueCurveDialog.h: xlCustomControl.h ValueCurve.h +BulkEditFontPickerDialog.cpp: BulkEditFontPickerDialog.h + BulkEditControls.cpp: BulkEditControls.h xLightsMain.h xLightsApp.h EffectsPanel.h sequencer/MainSequencer.h BulkEditSliderDialog.h BulkEditFontPickerDialog.h BulkEditColourPickerDialog.h BulkEditComboDialog.h UtilFunctions.h ExternalHooks.h BulkEditComboDialog.cpp: BulkEditComboDialog.h UtilFunctions.h @@ -3894,6 +3970,10 @@ ColourReplaceDialog.cpp: ColourReplaceDialog.h Color.h xLightsMain.h ColorPanel.cpp: xLightsMain.h ColorPanel.h ColorCurve.h effects/EffectPanelUtils.h UtilFunctions.h xLightsApp.h ExternalHooks.h sequencer/MainSequencer.h +BufferPanel.cpp: BufferPanel.h PixelBuffer.h models/Model.h models/ModelGroup.h effects/EffectPanelUtils.h ValueCurveDialog.h SubBufferPanel.h xLightsMain.h xLightsApp.h + +SubBufferPanel.h: xlCustomControl.h + ColorManager.cpp: ColorManager.h xLightsMain.h ColorCurveDialog.cpp: ColorCurveDialog.h xLightsMain.h xLightsVersion.h UtilFunctions.h xLightsApp.h ExternalHooks.h sequencer/MainSequencer.h @@ -3906,22 +3986,22 @@ Color.cpp: Color.h CheckboxSelectDialog.cpp: CheckboxSelectDialog.h -BufferPanel.cpp: BufferPanel.h PixelBuffer.h models/Model.h models/ModelGroup.h effects/EffectPanelUtils.h ValueCurveDialog.h SubBufferPanel.h xLightsMain.h xLightsApp.h - -SubBufferPanel.h: xlCustomControl.h +AlignmentDialog.cpp: AlignmentDialog.h -BitmapCache.cpp: BitmapCache.h UtilFunctions.h ../include/padlock_open_14.xpm ../include/padlock_open_28.xpm ../include/padlock_close_14.xpm ../include/padlock_close_28.xpm ../include/fforward10-24.xpm ../include/rewind10-24.xpm ../include/Dice-24.xpm ../include/Dice-32.xpm ../include/Dice-48.xpm ../include/Dice-64.xpm ../include/group-open-24.xpm ../include/group-open-64.xpm ../include/group-closed-24.xpm ../include/group-closed-64.xpm ../include/arch-icon-16.xpm ../include/arch-icon-64.xpm ../include/cane-icon-16.xpm ../include/cane-icon-64.xpm ../include/channelblock-icon-16.xpm ../include/channelblock-icon-64.xpm ../include/circle-icon-16.xpm ../include/circle-icon-64.xpm ../include/cube-icon-16.xpm ../include/cube-icon-64.xpm ../include/custom-icon-16.xpm ../include/custom-icon-64.xpm ../include/dmx-icon-16.xpm ../include/dmx-icon-64.xpm ../include/icicle-icon-16.xpm ../include/icicle-icon-64.xpm ../include/line-icon-16.xpm ../include/line-icon-64.xpm ../include/matrix-icon-16.xpm ../include/matrix-icon-64.xpm ../include/poly-icon-16.xpm ../include/poly-icon-64.xpm ../include/sphere-icon-16.xpm ../include/sphere-icon-64.xpm ../include/spinner-icon-16.xpm ../include/spinner-icon-64.xpm ../include/star-icon-16.xpm ../include/star-icon-64.xpm ../include/submarine-16.xpm ../include/submarine-32.xpm ../include/tree-icon-16.xpm ../include/tree-icon-64.xpm ../include/window-icon-16.xpm ../include/window-icon-64.xpm ../include/wreath-icon-16.xpm ../include/wreath-icon-64.xpm ../include/link-48.xpm ../include/unlink-48.xpm ../include/point_1a-64.xpm ../include/point_1b-64.xpm ../include/point_2a-64.xpm ../include/point_2b-64.xpm ../include/point_1ab-64.xpm ../include/point_2ab-64.xpm ../include/papagayo-16.xpm ../include/papagayo-64.xpm ../include/papagayo_x-16.xpm ../include/papagayo_x-64.xpm ../include/model-16.xpm ../include/model-64.xpm ../include/cc_time.xpm ../include/cc_timelocked.xpm ../include/cc_left.xpm ../include/cc_right.xpm ../include/cc_up.xpm ../include/cc_down.xpm ../include/cc_na.xpm ../include/cc_ccw.xpm ../include/cc_cw.xpm ../include/cc_radialin.xpm ../include/cc_radialout.xpm ../include/save.xpm ../include/delete.xpm ../include/switch.xpm ../include/valuecurvenotselected.xpm ../include/valuecurveselected.xpm Images_png.h ../include/xLights.xpm ../include/xLights-16.xpm ../include/xLights-32.xpm ../include/xLights-64.xpm ../include/xLights-128.xpm ../include/splashimage.h ../include/fpp_icon.h +BitmapCache.cpp: BitmapCache.h UtilFunctions.h ../include/padlock_open_14.xpm ../include/padlock_open_28.xpm ../include/padlock_close_14.xpm ../include/padlock_close_28.xpm ../include/fforward10-24.xpm ../include/rewind10-24.xpm ../include/Dice-24.xpm ../include/Dice-32.xpm ../include/Dice-48.xpm ../include/Dice-64.xpm ../include/group-open-24.xpm ../include/group-open-64.xpm ../include/group-closed-24.xpm ../include/group-closed-64.xpm ../include/arch-icon-16.xpm ../include/arch-icon-64.xpm ../include/cane-icon-16.xpm ../include/cane-icon-64.xpm ../include/channelblock-icon-16.xpm ../include/channelblock-icon-64.xpm ../include/circle-icon-16.xpm ../include/circle-icon-64.xpm ../include/cube-icon-16.xpm ../include/cube-icon-64.xpm ../include/custom-icon-16.xpm ../include/custom-icon-64.xpm ../include/dmx-icon-16.xpm ../include/dmx-icon-64.xpm ../include/icicle-icon-16.xpm ../include/icicle-icon-64.xpm ../include/line-icon-16.xpm ../include/line-icon-64.xpm ../include/matrix-icon-16.xpm ../include/matrix-icon-64.xpm ../include/poly-icon-16.xpm ../include/poly-icon-64.xpm ../include/sphere-icon-16.xpm ../include/sphere-icon-64.xpm ../include/spinner-icon-16.xpm ../include/spinner-icon-64.xpm ../include/star-icon-16.xpm ../include/star-icon-64.xpm ../include/submarine-16.xpm ../include/submarine-32.xpm ../include/tree-icon-16.xpm ../include/tree-icon-64.xpm ../include/window-icon-16.xpm ../include/window-icon-64.xpm ../include/wreath-icon-16.xpm ../include/wreath-icon-64.xpm ../include/link-48.xpm ../include/unlink-48.xpm ../include/point_1a-64.xpm ../include/point_1b-64.xpm ../include/point_2a-64.xpm ../include/point_2b-64.xpm ../include/point_1ab-64.xpm ../include/point_2ab-64.xpm ../include/papagayo-16.xpm ../include/papagayo-64.xpm ../include/papagayo_x-16.xpm ../include/papagayo_x-64.xpm ../include/model-16.xpm ../include/model-64.xpm ../include/cc_time.xpm ../include/cc_timelocked.xpm ../include/cc_left.xpm ../include/cc_right.xpm ../include/cc_up.xpm ../include/cc_down.xpm ../include/cc_na.xpm ../include/cc_ccw.xpm ../include/cc_cw.xpm ../include/cc_radialin.xpm ../include/cc_radialout.xpm ../include/save.xpm ../include/delete.xpm ../include/reverse.xpm ../include/left_shift.xpm ../include/right_shift.xpm ../include/valuecurvenotselected.xpm ../include/valuecurveselected.xpm Images_png.h ../include/xLights.xpm ../include/xLights-16.xpm ../include/xLights-32.xpm ../include/xLights-64.xpm ../include/xLights-128.xpm ../include/splashimage.h ../include/fpp_icon.h BatchRenderDialog.cpp: BatchRenderDialog.h ExternalHooks.h UtilFunctions.h ../include/globals.h -AudioManager.cpp: AudioManager.h ExternalHooks.h Parallel.h +AutoLabelDialog.cpp: AutoLabelDialog.h -AlignmentDialog.cpp: AlignmentDialog.h +AudioManager.cpp: AudioManager.h ExternalHooks.h Parallel.h -ControllerModelDialog.cpp: ControllerModelDialog.h xLightsMain.h UtilFunctions.h outputs/Output.h outputs/ControllerEthernet.h models/ModelManager.h models/Model.h outputs/Controller.h Pixels.h +ControllerModelDialog.cpp: ControllerModelDialog.h Pixels.h UtilFunctions.h xLightsMain.h models/Model.h models/ModelManager.h outputs/Controller.h outputs/ControllerEthernet.h outputs/Output.h AboutDialog.cpp: AboutDialog.h +ExportSettings.cpp: ExportSettings.h UtilFunctions.h + FlickerFreeBitmapButton.cpp: FlickerFreeBitmapButton.h FindDataPanel.cpp: FindDataPanel.h sequencer/DragEffectBitmapButton.h BitmapCache.h UtilFunctions.h sequencer/SequenceElements.h xLightsMain.h sequencer/MainSequencer.h effects/EffectManager.h @@ -3930,17 +4010,15 @@ FileConverter.cpp: FSEQFile.h FileConverter.h UtilFunctions.h outputs/OutputMana FSEQFile.cpp: FSEQFile.h ../include/zstd.h -FontManager.cpp: FontManager.h ../include/xLightsFontImages.h - -ExportSettings.cpp: ExportSettings.h UtilFunctions.h - ExportModelSelect.cpp: ExportModelSelect.h EmailDialog.cpp: EmailDialog.h UtilFunctions.h EffectsPanel.cpp: effects/EffectManager.h effects/RenderableEffect.h EffectsPanel.h RenderCommandEvent.h UtilFunctions.h effects/EffectPanelUtils.h xLightsApp.h xLightsMain.h sequencer/MainSequencer.h -JukeboxPanel.cpp: JukeboxPanel.h sequencer/MainSequencer.h xLightsApp.h xLightsMain.h LinkJukeboxButtonDialog.h UtilFunctions.h +EffectTreeDialog.cpp: EffectTreeDialog.h xLightsMain.h xLightsVersion.h UtilFunctions.h ExternalHooks.h + +HousePreviewPanel.cpp: HousePreviewPanel.h xLightsMain.h ModelPreview.h xLightsXmlFile.h UtilFunctions.h sequencer/MainSequencer.h JobPool.cpp: JobPool.h ExternalHooks.h TraceLog.h @@ -3948,16 +4026,14 @@ ImportPreviewsModelsDialog.cpp: ImportPreviewsModelsDialog.h LayoutGroup.h UtilF IPEntryDialog.cpp: IPEntryDialog.h -EffectTreeDialog.cpp: EffectTreeDialog.h xLightsMain.h xLightsVersion.h UtilFunctions.h ExternalHooks.h - -HousePreviewPanel.cpp: HousePreviewPanel.h xLightsMain.h ModelPreview.h xLightsXmlFile.h UtilFunctions.h sequencer/MainSequencer.h - GenerateLyricsDialog.cpp: GenerateLyricsDialog.h ../include/AI.xpm ../include/E.xpm ../include/ETC.xpm ../include/FV.xpm ../include/L.xpm ../include/MBP.xpm ../include/O.xpm ../include/REST.xpm ../include/U.xpm ../include/WQ.xpm NodesGridCellEditor.h GenerateCustomModelDialog.cpp: GenerateCustomModelDialog.h effects/VideoPanel.h xLightsVersion.h xLightsXmlFile.h outputs/OutputManager.h UtilFunctions.h xLightsMain.h ExternalHooks.h Parallel.h GPURenderUtils.cpp: GPURenderUtils.h +FontManager.cpp: FontManager.h ../include/xLightsFontImages.h + DimmingCurvePanel.cpp: DimmingCurvePanel.h DimmingCurve.cpp: DimmingCurve.h ExternalHooks.h @@ -3976,6 +4052,8 @@ ConvertLogDialog.cpp: ConvertLogDialog.h ConvertDialog.cpp: ConvertDialog.h FileConverter.h xLightsMain.h outputs/Output.h UtilFunctions.h outputs/OutputManager.h outputs/Controller.h ExternalHooks.h +EditAliasesDialog.cpp: EditAliasesDialog.h models/Model.h + EffectTimingDialog.cpp: EffectTimingDialog.h sequencer/Effect.h sequencer/EffectLayer.h EffectListDialog.cpp: EffectListDialog.h UtilFunctions.h @@ -3992,19 +4070,11 @@ DragColoursBitmapButton.cpp: DragColoursBitmapButton.h xLightsMain.h UtilFunctio DissolveTransitionPattern.cpp: DissolveTransitionPattern.h -effects/LifeEffect.cpp: effects/LifeEffect.h effects/LifePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/life-16.xpm ../include/life-24.xpm ../include/life-32.xpm ../include/life-48.xpm ../include/life-64.xpm UtilFunctions.h - -effects/LifeEffect.h: effects/RenderableEffect.h - -effects/LifePanel.h: BulkEditControls.h effects/EffectPanelUtils.h - -effects/KaleidoscopePanel.cpp: effects/KaleidoscopePanel.h effects/EffectPanelUtils.h effects/KaleidoscopeEffect.h - -effects/KaleidoscopePanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/KaleidoscopeEffect.cpp: ../include/kaleidoscope-64.xpm ../include/kaleidoscope-48.xpm ../include/kaleidoscope-32.xpm ../include/kaleidoscope-24.xpm ../include/kaleidoscope-16.xpm effects/KaleidoscopeEffect.h effects/KaleidoscopePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h xLightsMain.h xLightsApp.h TimingPanel.h UtilFunctions.h Parallel.h effects/KaleidoscopeEffect.h: effects/RenderableEffect.h -effects/KaleidoscopeEffect.cpp: ../include/kaleidoscope-64.xpm ../include/kaleidoscope-48.xpm ../include/kaleidoscope-32.xpm ../include/kaleidoscope-24.xpm ../include/kaleidoscope-16.xpm effects/KaleidoscopeEffect.h effects/KaleidoscopePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h xLightsMain.h xLightsApp.h TimingPanel.h UtilFunctions.h Parallel.h +effects/KaleidoscopePanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/GuitarPanel.cpp: effects/GuitarPanel.h effects/EffectPanelUtils.h sequencer/Effect.h effects/GuitarEffect.h UtilFunctions.h @@ -4012,8 +4082,6 @@ effects/GuitarPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/GuitarEffect.h: effects/RenderableEffect.h -effects/LifePanel.cpp: effects/LifePanel.h effects/EffectPanelUtils.h - effects/GuitarEffect.cpp: ../include/guitar-16.xpm ../include/guitar-64.xpm effects/GuitarEffect.h effects/GuitarPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h xLightsXmlFile.h UtilFunctions.h models/Model.h effects/GlediatorPanel.cpp: effects/GlediatorPanel.h effects/EffectPanelUtils.h @@ -4026,11 +4094,21 @@ effects/GarlandsPanel.cpp: effects/GarlandsPanel.h effects/EffectPanelUtils.h ef effects/GarlandsPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/MarqueePanel.cpp: effects/MarqueePanel.h effects/EffectPanelUtils.h effects/MarqueeEffect.h +effects/GarlandsEffect.cpp: effects/GarlandsEffect.h effects/GarlandsPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/garlands-16.xpm ../include/garlands-24.xpm ../include/garlands-32.xpm ../include/garlands-48.xpm ../include/garlands-64.xpm -effects/MarqueePanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/GalaxyPanel.cpp: effects/GalaxyPanel.h effects/EffectPanelUtils.h effects/GalaxyEffect.h -effects/MarqueeEffect.cpp: effects/MarqueeEffect.h effects/MarqueePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/marquee-16.xpm ../include/marquee-24.xpm ../include/marquee-32.xpm ../include/marquee-48.xpm ../include/marquee-64.xpm +effects/GalaxyPanel.h: BulkEditControls.h effects/EffectPanelUtils.h + +effects/GalaxyEffect.h: effects/RenderableEffect.h + +effects/GalaxyEffect.cpp: effects/GalaxyEffect.h effects/GalaxyPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h Parallel.h ../include/galaxy-16.xpm ../include/galaxy-24.xpm ../include/galaxy-32.xpm ../include/galaxy-48.xpm ../include/galaxy-64.xpm + +effects/LightningPanel.cpp: effects/LightningPanel.h effects/EffectPanelUtils.h effects/LightningEffect.h + +effects/LightningPanel.h: BulkEditControls.h effects/EffectPanelUtils.h + +effects/LightningEffect.h: effects/RenderableEffect.h effects/LiquidPanel.cpp: effects/LiquidPanel.h effects/EffectPanelUtils.h effects/LiquidEffect.h @@ -4040,8 +4118,6 @@ effects/LiquidEffect.h: effects/RenderableEffect.h RenderBuffer.h UtilFunctions. effects/LiquidEffect.cpp: effects/LiquidEffect.h effects/LiquidPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h AudioManager.h UtilFunctions.h models/Model.h Parallel.h ../include/liquid-16.xpm ../include/liquid-24.xpm ../include/liquid-32.xpm ../include/liquid-48.xpm ../include/liquid-64.xpm -effects/GarlandsEffect.cpp: effects/GarlandsEffect.h effects/GarlandsPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/garlands-16.xpm ../include/garlands-24.xpm ../include/garlands-32.xpm ../include/garlands-48.xpm ../include/garlands-64.xpm - effects/LinesPanel.cpp: effects/LinesPanel.h effects/EffectPanelUtils.h effects/LinesEffect.h UtilFunctions.h effects/LinesPanel.h: BulkEditControls.h effects/EffectPanelUtils.h @@ -4050,33 +4126,23 @@ effects/LinesEffect.h: effects/RenderableEffect.h RenderBuffer.h effects/LinesEffect.cpp: effects/LinesEffect.h effects/LinesPanel.h AudioManager.h sequencer/SequenceElements.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h UtilFunctions.h ../include/lines-16.xpm ../include/lines-24.xpm ../include/lines-32.xpm ../include/lines-48.xpm ../include/lines-64.xpm -effects/LightningPanel.cpp: effects/LightningPanel.h effects/EffectPanelUtils.h effects/LightningEffect.h - -effects/LightningPanel.h: BulkEditControls.h effects/EffectPanelUtils.h - -effects/LightningEffect.h: effects/RenderableEffect.h +effects/GIFImage.cpp: effects/GIFImage.h effects/LightningEffect.cpp: effects/LightningEffect.h effects/LightningPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/lightning-16.xpm ../include/lightning-24.xpm ../include/lightning-32.xpm ../include/lightning-48.xpm ../include/lightning-64.xpm -effects/FacesEffect.cpp: effects/FacesEffect.h effects/FacesPanel.h models/Model.h models/SubModel.h models/ModelGroup.h sequencer/SequenceElements.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h xLightsMain.h effects/PicturesEffect.h ExternalHooks.h ../include/corofaces.xpm - -effects/FacesPanel.h: BulkEditControls.h effects/EffectPanelUtils.h - -effects/FillEffect.cpp: effects/FillEffect.h effects/FillPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h UtilFunctions.h ../include/fill-16.xpm ../include/fill-64.xpm - -effects/FillEffect.h: effects/RenderableEffect.h +effects/LifePanel.cpp: effects/LifePanel.h effects/EffectPanelUtils.h -effects/FillPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/LifePanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/FanPanel.cpp: effects/FanPanel.h effects/EffectPanelUtils.h effects/FanEffect.h +effects/LifeEffect.cpp: effects/LifeEffect.h effects/LifePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/life-16.xpm ../include/life-24.xpm ../include/life-32.xpm ../include/life-48.xpm ../include/life-64.xpm UtilFunctions.h -effects/FanPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/LifeEffect.h: effects/RenderableEffect.h -effects/FanEffect.h: effects/RenderableEffect.h +effects/KaleidoscopePanel.cpp: effects/KaleidoscopePanel.h effects/EffectPanelUtils.h effects/KaleidoscopeEffect.h -effects/FanEffect.cpp: effects/FanEffect.h effects/FanPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h ../include/fan-16.xpm ../include/fan-24.xpm ../include/fan-32.xpm ../include/fan-48.xpm ../include/fan-64.xpm +effects/FacesEffect.cpp: effects/FacesEffect.h effects/FacesPanel.h models/Model.h models/SubModel.h models/ModelGroup.h sequencer/SequenceElements.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h xLightsMain.h effects/PicturesEffect.h ExternalHooks.h ../include/corofaces.xpm -effects/FacesPanel.cpp: effects/FacesPanel.h effects/EffectPanelUtils.h +effects/FacesPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/FX.cpp: UtilFunctions.h RenderBuffer.h effects/FX.h @@ -4084,21 +4150,27 @@ effects/FX.h: Color.h effects/EffectPanelUtils.cpp: effects/EffectPanelUtils.h BitmapCache.h ValueCurveButton.h ValueCurveDialog.h xLightsApp.h xLightsMain.h UtilFunctions.h -effects/EffectManager.cpp: effects/EffectManager.h effects/OffEffect.h effects/OnEffect.h effects/BarsEffect.h effects/ButterflyEffect.h effects/CandleEffect.h effects/CirclesEffect.h effects/ColorWashEffect.h effects/CurtainEffect.h effects/DMXEffect.h effects/FacesEffect.h effects/FanEffect.h effects/FillEffect.h effects/FireEffect.h effects/FireworksEffect.h effects/GalaxyEffect.h effects/GarlandsEffect.h effects/GlediatorEffect.h effects/GuitarEffect.h effects/KaleidoscopeEffect.h effects/LifeEffect.h effects/LightningEffect.h effects/LinesEffect.h effects/LiquidEffect.h effects/MarqueeEffect.h effects/MeteorsEffect.h effects/MorphEffect.h effects/MusicEffect.h effects/PianoEffect.h effects/PicturesEffect.h effects/PinwheelEffect.h effects/PlasmaEffect.h effects/RenderableEffect.h effects/RippleEffect.h effects/ServoEffect.h effects/ShaderEffect.h effects/ShapeEffect.h effects/ShimmerEffect.h effects/ShockwaveEffect.h effects/SingleStrandEffect.h effects/SketchEffect.h effects/SnowflakesEffect.h effects/SnowstormEffect.h effects/SpiralsEffect.h effects/SpirographEffect.h effects/StateEffect.h effects/StrobeEffect.h effects/TendrilEffect.h effects/TextEffect.h effects/TreeEffect.h effects/TwinkleEffect.h effects/VideoEffect.h effects/VUMeterEffect.h effects/WarpEffect.h effects/WaveEffect.h +effects/EffectManager.cpp: effects/EffectManager.h effects/OffEffect.h effects/OnEffect.h effects/AdjustEffect.h effects/BarsEffect.h effects/ButterflyEffect.h effects/CandleEffect.h effects/CirclesEffect.h effects/ColorWashEffect.h effects/CurtainEffect.h effects/DMXEffect.h effects/DuplicateEffect.h effects/FacesEffect.h effects/FanEffect.h effects/FillEffect.h effects/FireEffect.h effects/FireworksEffect.h effects/GalaxyEffect.h effects/GarlandsEffect.h effects/GlediatorEffect.h effects/GuitarEffect.h effects/KaleidoscopeEffect.h effects/LifeEffect.h effects/LightningEffect.h effects/LinesEffect.h effects/LiquidEffect.h effects/MarqueeEffect.h effects/MeteorsEffect.h effects/MorphEffect.h effects/MusicEffect.h effects/PianoEffect.h effects/PicturesEffect.h effects/PinwheelEffect.h effects/PlasmaEffect.h effects/RenderableEffect.h effects/RippleEffect.h effects/ServoEffect.h effects/ShaderEffect.h effects/ShapeEffect.h effects/ShimmerEffect.h effects/ShockwaveEffect.h effects/SingleStrandEffect.h effects/SketchEffect.h effects/SnowflakesEffect.h effects/SnowstormEffect.h effects/SpiralsEffect.h effects/SpirographEffect.h effects/StateEffect.h effects/StrobeEffect.h effects/TendrilEffect.h effects/TextEffect.h effects/TreeEffect.h effects/TwinkleEffect.h effects/VideoEffect.h effects/VUMeterEffect.h effects/WarpEffect.h effects/WaveEffect.h effects/OffEffect.h: effects/RenderableEffect.h effects/OnEffect.h: effects/RenderableEffect.h +effects/AdjustEffect.h: effects/RenderableEffect.h UtilFunctions.h + effects/CandleEffect.h: effects/RenderableEffect.h effects/CirclesEffect.h: effects/RenderableEffect.h effects/ColorWashEffect.h: effects/RenderableEffect.h -effects/FireworksEffect.h: effects/RenderableEffect.h +effects/DuplicateEffect.h: effects/RenderableEffect.h -effects/GalaxyEffect.h: effects/RenderableEffect.h +effects/FanEffect.h: effects/RenderableEffect.h + +effects/FillEffect.h: effects/RenderableEffect.h + +effects/FireworksEffect.h: effects/RenderableEffect.h effects/MorphEffect.h: effects/RenderableEffect.h UtilFunctions.h @@ -4120,26 +4192,24 @@ effects/SingleStrandEffect.h: effects/RenderableEffect.h effects/SketchEffect.h: effects/RenderableEffect.h -effects/DMXPanel.cpp: effects/DMXPanel.h effects/DMXEffect.h xLightsMain.h sequencer/MainSequencer.h sequencer/Effect.h sequencer/Element.h models/ModelGroup.h RemapDMXChannelsDialog.h xLightsApp.h effects/EffectPanelUtils.h UtilFunctions.h +effects/FacesPanel.cpp: effects/FacesPanel.h effects/EffectPanelUtils.h -effects/DMXPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/DuplicatePanel.cpp: effects/DuplicatePanel.h effects/DuplicateEffect.h -effects/GalaxyPanel.cpp: effects/GalaxyPanel.h effects/EffectPanelUtils.h effects/GalaxyEffect.h +effects/DuplicatePanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/GalaxyPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/DuplicateEffect.cpp: effects/DuplicateEffect.h effects/DuplicatePanel.h RenderBuffer.h UtilFunctions.h models/Model.h models/ModelManager.h xLightsMain.h sequencer/SequenceElements.h xLightsApp.h ../include/Duplicate_64.xpm ../include/Duplicate_48.xpm ../include/Duplicate_32.xpm ../include/Duplicate_24.xpm ../include/Duplicate_16.xpm -effects/GalaxyEffect.cpp: effects/GalaxyEffect.h effects/GalaxyPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h Parallel.h ../include/galaxy-16.xpm ../include/galaxy-24.xpm ../include/galaxy-32.xpm ../include/galaxy-48.xpm ../include/galaxy-64.xpm +effects/DMXPanel.cpp: effects/DMXPanel.h effects/DMXEffect.h xLightsMain.h sequencer/MainSequencer.h sequencer/Effect.h sequencer/Element.h models/ModelGroup.h RemapDMXChannelsDialog.h xLightsApp.h effects/EffectPanelUtils.h UtilFunctions.h -effects/GIFImage.cpp: effects/GIFImage.h +effects/DMXPanel.h: BulkEditControls.h effects/EffectPanelUtils.h + +effects/DMXEffect.cpp: effects/DMXEffect.h effects/DMXPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h models/ModelGroup.h ../include/dmx-16.xpm ../include/dmx-24.xpm ../include/dmx-32.xpm ../include/dmx-48.xpm ../include/dmx-64.xpm UtilFunctions.h effects/FireworksPanel.cpp: effects/FireworksPanel.h effects/EffectPanelUtils.h sequencer/Effect.h effects/FireworksEffect.h ValueCurveButton.h effects/FireworksPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/MeteorsEffect.cpp: effects/MeteorsEffect.h effects/MeteorsPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h AudioManager.h models/Model.h UtilFunctions.h ../include/meteors-16.xpm ../include/meteors-24.xpm ../include/meteors-32.xpm ../include/meteors-48.xpm ../include/meteors-64.xpm Parallel.h - -effects/MeteorsPanel.h: BulkEditControls.h effects/EffectPanelUtils.h - effects/FireworksEffect.cpp: effects/FireworksEffect.h effects/FireworksPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h AudioManager.h models/Model.h UtilFunctions.h sequencer/SequenceElements.h ../include/fireworks-16.xpm ../include/fireworks-24.xpm ../include/fireworks-32.xpm ../include/fireworks-48.xpm ../include/fireworks-64.xpm effects/FirePanel.cpp: effects/FirePanel.h effects/EffectPanelUtils.h effects/FireEffect.h @@ -4150,15 +4220,19 @@ effects/FireEffect.cpp: effects/FireEffect.h effects/FirePanel.h sequencer/Effec effects/FillPanel.cpp: effects/FillPanel.h effects/FillEffect.h effects/EffectPanelUtils.h -effects/ServoPanel.cpp: effects/ServoPanel.h effects/ServoEffect.h effects/EffectPanelUtils.h +effects/FillPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/ServoPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/FillEffect.cpp: effects/FillEffect.h effects/FillPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h UtilFunctions.h ../include/fill-16.xpm ../include/fill-64.xpm -effects/ShapePanel.cpp: effects/ShapePanel.h effects/EffectPanelUtils.h effects/ShapeEffect.h RenderBuffer.h CharMapDialog.h +effects/FanPanel.cpp: effects/FanPanel.h effects/EffectPanelUtils.h effects/FanEffect.h -effects/ShapePanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/FanPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/ShapeEffect.cpp: effects/ShapeEffect.h effects/ShapePanel.h effects/TextEffect.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h sequencer/SequenceElements.h UtilFunctions.h AudioManager.h ExternalHooks.h xLightsMain.h ../include/shape-16.xpm ../include/shape-24.xpm ../include/shape-32.xpm ../include/shape-48.xpm ../include/shape-64.xpm +effects/FanEffect.cpp: effects/FanEffect.h effects/FanPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h ../include/fan-16.xpm ../include/fan-24.xpm ../include/fan-32.xpm ../include/fan-48.xpm ../include/fan-64.xpm + +effects/RipplePanel.cpp: effects/RipplePanel.h effects/EffectPanelUtils.h effects/RippleEffect.h + +effects/RipplePanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/ShaderPanel.cpp: effects/ShaderPanel.h effects/ShaderEffect.h BulkEditControls.h effects/EffectPanelUtils.h ShaderDownloadDialog.h ExternalHooks.h xLightsMain.h xLightsApp.h TimingPanel.h @@ -4166,29 +4240,33 @@ effects/ShaderPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/ShaderEffect.cpp: ../include/shader_64.xpm ../include/shader_48.xpm ../include/shader_32.xpm ../include/shader_24.xpm ../include/shader_16.xpm effects/ShaderEffect.h effects/ShaderPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h xLightsMain.h xLightsApp.h TimingPanel.h OpenGLShaders.h UtilFunctions.h ExternalHooks.h +effects/ServoPanel.cpp: effects/ServoPanel.h effects/ServoEffect.h effects/EffectPanelUtils.h + +effects/ServoPanel.h: BulkEditControls.h effects/EffectPanelUtils.h + effects/ServoEffect.cpp: ../include/servo-16.xpm ../include/servo-24.xpm ../include/servo-32.xpm ../include/servo-48.xpm ../include/servo-64.xpm effects/ServoEffect.h effects/ServoPanel.h sequencer/Effect.h sequencer/Element.h sequencer/SequenceElements.h RenderBuffer.h UtilClasses.h UtilFunctions.h models/ModelGroup.h -effects/RipplePanel.cpp: effects/RipplePanel.h effects/EffectPanelUtils.h effects/RippleEffect.h +effects/ShapeEffect.cpp: effects/ShapeEffect.h effects/ShapePanel.h effects/TextEffect.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h sequencer/SequenceElements.h UtilFunctions.h AudioManager.h ExternalHooks.h xLightsMain.h ../include/shape-16.xpm ../include/shape-24.xpm ../include/shape-32.xpm ../include/shape-48.xpm ../include/shape-64.xpm -effects/RipplePanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/ShapePanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/RippleEffect.cpp: effects/RippleEffect.h effects/RipplePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ExternalHooks.h models/Model.h xLightsMain.h ../include/ripple-16.xpm ../include/ripple-24.xpm ../include/ripple-32.xpm ../include/ripple-48.xpm ../include/ripple-64.xpm effects/RenderableEffect.cpp: effects/RenderableEffect.h sequencer/Effect.h effects/EffectManager.h effects/assist/xlGridCanvasEmpty.h UtilFunctions.h ExternalHooks.h sequencer/SequenceElements.h ValueCurveButton.h PixelBuffer.h effects/FanEffect.h effects/SpiralsEffect.h effects/PinwheelEffect.h effects/EffectPanelUtils.h ColorPanel.h BufferPanel.h TimingPanel.h BitmapCache.h xLightsApp.h xLightsMain.h -effects/SingleStrandEffect.cpp: effects/SingleStrandEffect.h effects/SingleStrandPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h effects/FX.h ../include/singleStrand-16.xpm ../include/singleStrand-64.xpm +effects/PlasmaPanel.cpp: effects/PlasmaPanel.h effects/EffectPanelUtils.h effects/PlasmaEffect.h -effects/SingleStrandPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/PlasmaPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/SketchPanel.cpp: effects/SketchPanel.h BulkEditControls.h effects/assist/SketchAssistPanel.h xLightsMain.h +effects/PlasmaEffect.cpp: effects/PlasmaEffect.h effects/PlasmaPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/plasma-16.xpm ../include/plasma-24.xpm ../include/plasma-32.xpm ../include/plasma-48.xpm ../include/plasma-64.xpm Parallel.h -effects/SketchPanel.h: effects/EffectPanelUtils.h +effects/SketchEffect.cpp: effects/SketchEffect.h BulkEditControls.h RenderBuffer.h effects/SketchEffectDrawing.h effects/SketchPanel.h UtilFunctions.h xLightsMain.h effects/assist/AssistPanel.h effects/assist/SketchAssistPanel.h ExternalHooks.h ../include/sketch-16.xpm ../include/sketch-24.xpm ../include/sketch-32.xpm ../include/sketch-48.xpm ../include/sketch-64.xpm -effects/SketchEffectDrawing.cpp: effects/SketchEffectDrawing.h +effects/SingleStrandPanel.cpp: effects/SingleStrandPanel.h effects/EffectPanelUtils.h effects/SingleStrandEffect.h effects/FX.h -effects/SketchEffect.cpp: effects/SketchEffect.h BulkEditControls.h RenderBuffer.h effects/SketchEffectDrawing.h effects/SketchPanel.h effects/assist/AssistPanel.h effects/assist/SketchAssistPanel.h ../include/sketch-64.xpm ../include/sketch-48.xpm ../include/sketch-32.xpm ../include/sketch-24.xpm ../include/sketch-16.xpm +effects/SingleStrandPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/SingleStrandPanel.cpp: effects/SingleStrandPanel.h effects/EffectPanelUtils.h effects/SingleStrandEffect.h effects/FX.h +effects/SingleStrandEffect.cpp: effects/SingleStrandEffect.h effects/SingleStrandPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h effects/FX.h ../include/singleStrand-16.xpm ../include/singleStrand-64.xpm effects/ShockwavePanel.cpp: effects/ShockwavePanel.h effects/EffectPanelUtils.h effects/ShockwaveEffect.h @@ -4202,41 +4280,39 @@ effects/ShimmerPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/ShimmerEffect.cpp: effects/ShimmerEffect.h effects/ShimmerPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/shimmer.xpm -effects/OnEffect.cpp: ../include/On.xpm effects/OnEffect.h effects/OnPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h Parallel.h - -effects/OnPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/ShapePanel.cpp: effects/ShapePanel.h effects/EffectPanelUtils.h effects/ShapeEffect.h RenderBuffer.h CharMapDialog.h -effects/OffPanel.cpp: effects/OffPanel.h +effects/MorphEffect.cpp: effects/MorphEffect.h effects/MorphPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h effects/assist/AssistPanel.h effects/assist/xlGridCanvasMorph.h models/Model.h ../include/morph-16.xpm ../include/morph-64.xpm UtilFunctions.h -effects/OffPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/MorphPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/OffEffect.cpp: effects/OffEffect.h effects/OffPanel.h RenderBuffer.h UtilFunctions.h models/Model.h ../include/Off.xpm +effects/OffPanel.h: BulkEditControls.h effects/EffectPanelUtils.h + effects/MusicPanel.cpp: effects/MusicPanel.h effects/EffectPanelUtils.h effects/MusicEffect.h UtilFunctions.h effects/MusicPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/OnPanel.cpp: effects/OnPanel.h effects/OnEffect.h effects/EffectPanelUtils.h - effects/MusicEffect.cpp: effects/MusicPanel.h effects/MusicEffect.h AudioManager.h sequencer/SequenceElements.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h UtilFunctions.h ../include/music-16.xpm ../include/music-24.xpm ../include/music-32.xpm ../include/music-48.xpm ../include/music-64.xpm effects/MorphPanel.cpp: effects/MorphPanel.h effects/EffectPanelUtils.h effects/MorphEffect.h xLightsApp.h UtilFunctions.h xLightsMain.h sequencer/MainSequencer.h -effects/MorphPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/MeteorsPanel.cpp: effects/MeteorsPanel.h effects/EffectPanelUtils.h effects/MeteorsEffect.h -effects/MorphEffect.cpp: effects/MorphEffect.h effects/MorphPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h effects/assist/AssistPanel.h effects/assist/xlGridCanvasMorph.h models/Model.h ../include/morph-16.xpm ../include/morph-64.xpm UtilFunctions.h +effects/MeteorsPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/MeteorsPanel.cpp: effects/MeteorsPanel.h effects/EffectPanelUtils.h effects/MeteorsEffect.h +effects/MeteorsEffect.cpp: effects/MeteorsEffect.h effects/MeteorsPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h AudioManager.h models/Model.h UtilFunctions.h ../include/meteors-16.xpm ../include/meteors-24.xpm ../include/meteors-32.xpm ../include/meteors-48.xpm ../include/meteors-64.xpm Parallel.h -effects/PicturesPanel.cpp: effects/PicturesPanel.h effects/PicturesEffect.h effects/EffectPanelUtils.h effects/GIFImage.h ExternalHooks.h +effects/MarqueePanel.cpp: effects/MarqueePanel.h effects/EffectPanelUtils.h effects/MarqueeEffect.h -effects/PicturesPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/MarqueePanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/PlasmaPanel.cpp: effects/PlasmaPanel.h effects/EffectPanelUtils.h effects/PlasmaEffect.h +effects/MarqueeEffect.cpp: effects/MarqueeEffect.h effects/MarqueePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/marquee-16.xpm ../include/marquee-24.xpm ../include/marquee-32.xpm ../include/marquee-48.xpm ../include/marquee-64.xpm -effects/PlasmaPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/PianoPanel.cpp: effects/PianoPanel.h effects/EffectPanelUtils.h sequencer/Effect.h effects/PianoEffect.h UtilFunctions.h -effects/PlasmaEffect.cpp: effects/PlasmaEffect.h effects/PlasmaPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/plasma-16.xpm ../include/plasma-24.xpm ../include/plasma-32.xpm ../include/plasma-48.xpm ../include/plasma-64.xpm Parallel.h +effects/PianoPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/PinwheelPanel.cpp: effects/PinwheelPanel.h effects/EffectPanelUtils.h effects/PinwheelEffect.h @@ -4244,24 +4320,38 @@ effects/PinwheelPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/PinwheelEffect.cpp: effects/PinwheelEffect.h effects/PinwheelPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/pinwheel-16.xpm ../include/pinwheel-24.xpm ../include/pinwheel-32.xpm ../include/pinwheel-48.xpm ../include/pinwheel-64.xpm Parallel.h +effects/PicturesPanel.cpp: effects/PicturesPanel.h effects/PicturesEffect.h effects/EffectPanelUtils.h effects/GIFImage.h ExternalHooks.h + +effects/PicturesPanel.h: BulkEditControls.h effects/EffectPanelUtils.h + effects/PicturesEffect.cpp: ../include/pictures-16.xpm ../include/pictures-24.xpm ../include/pictures-32.xpm ../include/pictures-48.xpm ../include/pictures-64.xpm effects/PicturesEffect.h effects/PicturesPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h effects/assist/xlGridCanvasPictures.h effects/assist/PicturesAssistPanel.h xLightsXmlFile.h models/Model.h UtilFunctions.h ExternalHooks.h effects/GIFImage.h xLightsMain.h -effects/PianoPanel.cpp: effects/PianoPanel.h effects/EffectPanelUtils.h sequencer/Effect.h effects/PianoEffect.h UtilFunctions.h +effects/CurtainPanel.cpp: effects/CurtainPanel.h effects/EffectPanelUtils.h effects/CurtainEffect.h -effects/PianoPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/CurtainPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/PianoEffect.cpp: ../include/piano-16.xpm ../include/piano-64.xpm effects/PianoEffect.h effects/PianoPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h xLightsXmlFile.h UtilFunctions.h models/Model.h +effects/PianoEffect.cpp: ../include/piano-16.xpm ../include/piano-64.xpm effects/PianoEffect.h effects/PianoPanel.h RenderBuffer.h UtilClasses.h UtilFunctions.h sequencer/Effect.h xLightsXmlFile.h models/Model.h -ViewpointDialog.cpp: ViewpointDialog.h +effects/OnPanel.cpp: effects/OnPanel.h effects/OnEffect.h effects/EffectPanelUtils.h -ViewObjectPanel.cpp: LayoutPanel.h ViewObjectPanel.h UtilFunctions.h models/ViewObject.h xLightsMain.h +effects/OnPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -VideoReader.cpp: VideoReader.h SpecialOptions.h WindowsHardwareVideoReader.h +effects/OnEffect.cpp: ../include/On.xpm effects/OnEffect.h effects/OnPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h UtilFunctions.h Parallel.h + +effects/OffPanel.cpp: effects/OffPanel.h VideoExporter.cpp: VideoExporter.h ViewpointMgr.cpp: ViewpointMgr.h UtilFunctions.h +ViewpointDialog.cpp: ViewpointDialog.h + +ViewObjectPanel.cpp: LayoutPanel.h ViewObjectPanel.h UtilFunctions.h models/ViewObject.h xLightsMain.h + +VideoReader.cpp: VideoReader.h SpecialOptions.h WindowsHardwareVideoReader.h + +ViewsModelsPanel.cpp: ../include/model-16.xpm ../include/timing-16.xpm ../include/eye-16.xpm ../include/eye-16_gray.xpm ViewsModelsPanel.h sequencer/SequenceElements.h xLightsMain.h SequenceViewManager.h UtilFunctions.h + VendorMusicHelpers.cpp: VendorMusicHelpers.h CachedFileDownloader.h UtilFunctions.h VendorMusicDialog.cpp: VendorMusicDialog.h CachedFileDownloader.h UtilFunctions.h xLightsMain.h @@ -4270,24 +4360,22 @@ VendorModelDialog.cpp: VendorModelDialog.h CachedFileDownloader.h UtilFunctions. ValueCurvesPanel.cpp: ValueCurvesPanel.h UtilFunctions.h ValueCurve.h ValueCurveButton.h xLightsApp.h xLightsMain.h ExternalHooks.h +automation/LuaRunner.cpp: xLightsMain.h BatchRenderDialog.h UtilFunctions.h ExternalHooks.h + +cad/CADWriter.cpp: UtilFunctions.h + cad/CADModel.cpp: models/Model.h Pixels.h Color.h automation/xLightsAutomations.cpp: xLightsMain.h xLightsVersion.h FSEQFile.h outputs/Controller.h outputs/ControllerEthernet.h LayoutPanel.h ViewsModelsPanel.h UtilFunctions.h ExternalHooks.h xLightsApp.h JukeboxPanel.h outputs/E131Output.h sequencer/MainSequencer.h automation/automation.cpp: UtilFunctions.h -automation/LuaRunner.cpp: xLightsMain.h BatchRenderDialog.h UtilFunctions.h ExternalHooks.h - -ValueCurveDialog.cpp: ValueCurveDialog.h xLightsMain.h ValueCurve.h xLightsVersion.h UtilFunctions.h xLightsApp.h ExternalHooks.h sequencer/MainSequencer.h sequencer/SequenceElements.h - WiringDialog.cpp: WiringDialog.h models/Model.h UtilFunctions.h VsaImportDialog.cpp: VsaImportDialog.h sequencer/SequenceElements.h xLightsMain.h models/Model.h VSAFile.h support/FastComboEditor.h support/GridCellChoiceRenderer.h support/EzGrid.h UtilFunctions.h Vixen3.cpp: Vixen3.h ExternalHooks.h -ViewsModelsPanel.cpp: ../include/model-16.xpm ../include/timing-16.xpm ../include/eye-16.xpm ../include/eye-16_gray.xpm ViewsModelsPanel.h sequencer/SequenceElements.h xLightsMain.h SequenceViewManager.h UtilFunctions.h - TabConvert.cpp: models/ModelManager.h ConvertDialog.h FileConverter.h UtilFunctions.h ExternalHooks.h models/ModelGroup.h models/MatrixModel.h sequencer/SequenceElements.h outputs/OutputManager.h sequencer/EffectLayer.h xLightsMain.h FSEQFile.h CopyFormat1.h VideoExporter.h TopEffectsPanel.cpp: TopEffectsPanel.h sequencer/EffectDropTarget.h ../include/Off.xpm xLightsMain.h xLightsApp.h sequencer/MainSequencer.h @@ -4298,7 +4386,7 @@ TimingPanel.cpp: TimingPanel.h models/Model.h effects/EffectPanelUtils.h LayerSe TabSetup.cpp: xLightsMain.h LayoutPanel.h xLightsXmlFile.h sequencer/MainSequencer.h ViewsModelsPanel.h UtilFunctions.h models/Model.h SpecialOptions.h LayoutGroup.h ControllerModelDialog.h ExternalHooks.h outputs/ControllerEthernet.h outputs/ControllerSerial.h outputs/ControllerNull.h outputs/Output.h outputs/NullOutput.h outputs/E131Output.h outputs/ZCPPOutput.h outputs/ArtNetOutput.h outputs/DDPOutput.h outputs/DMXOutput.h outputs/LOROptimisedOutput.h outputs/TwinklyOutput.h Discovery.h -TabSequence.cpp: xLightsMain.h SeqSettingsDialog.h xLightsXmlFile.h effects/RenderableEffect.h models/ModelGroup.h models/SubModel.h SequenceViewManager.h LayoutPanel.h UtilFunctions.h ExternalHooks.h BufferPanel.h EffectIconPanel.h JukeboxPanel.h FindDataPanel.h EffectsPanel.h TimingPanel.h ColorPanel.h LayoutGroup.h ModelPreview.h ViewsModelsPanel.h PerspectivesPanel.h ValueCurvesPanel.h ColoursPanel.h sequencer/MainSequencer.h HousePreviewPanel.h xLightsVersion.h +TabSequence.cpp: xLightsMain.h SeqSettingsDialog.h xLightsXmlFile.h effects/RenderableEffect.h models/ModelGroup.h models/SubModel.h SequenceViewManager.h LayoutPanel.h UtilFunctions.h ExternalHooks.h BufferPanel.h EffectIconPanel.h JukeboxPanel.h FindDataPanel.h EffectsPanel.h TimingPanel.h ColorPanel.h LayoutGroup.h ModelPreview.h ViewsModelsPanel.h PerspectivesPanel.h ValueCurvesPanel.h ColoursPanel.h sequencer/MainSequencer.h HousePreviewPanel.h xLightsVersion.h TopEffectsPanel.h TabPreview.cpp: xLightsMain.h xLightsXmlFile.h ModelPreview.h HousePreviewPanel.h LayoutPanel.h ExternalHooks.h @@ -4310,14 +4398,16 @@ SubModelGenerateDialog.cpp: SubModelGenerateDialog.h SubBufferPanel.cpp: SubBufferPanel.h BufferSizeDialog.h xLightsApp.h xLightsMain.h sequencer/MainSequencer.h UtilFunctions.h +VAMPPluginDialog.cpp: VAMPPluginDialog.h UtilFunctions.h xLightsMain.h + +ValueCurveDialog.cpp: ValueCurveDialog.h xLightsMain.h ValueCurve.h xLightsVersion.h UtilFunctions.h xLightsApp.h ExternalHooks.h sequencer/MainSequencer.h sequencer/SequenceElements.h + ValueCurveButton.cpp: ValueCurveButton.h ValueCurve.cpp: ValueCurve.h xLightsVersion.h xLightsMain.h xLightsXmlFile.h UtilFunctions.h AudioManager.h ExternalHooks.h sequencer/SequenceElements.h VSAFile.cpp: VSAFile.h UtilFunctions.h -VAMPPluginDialog.cpp: VAMPPluginDialog.h UtilFunctions.h xLightsMain.h - UtilFunctions.cpp: UtilFunctions.h xLightsVersion.h ExternalHooks.h UtilClasses.cpp: UtilClasses.h effects/RenderableEffect.h effects/EffectManager.h @@ -4326,11 +4416,9 @@ UpdaterDialog.cpp: UpdaterDialog.h TraceLog.cpp: TraceLog.h -effects/ButterflyPanel.cpp: effects/ButterflyPanel.h effects/EffectPanelUtils.h effects/ButterflyEffect.h - -effects/ButterflyPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/AdjustEffect.cpp: effects/AdjustEffect.h effects/AdjustPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h models/ModelGroup.h xLightsApp.h xLightsMain.h TimingPanel.h ../include/adjust16.xpm ../include/adjust24.xpm ../include/adjust32.xpm ../include/adjust48.xpm ../include/adjust64.xpm UtilFunctions.h -effects/ButterflyEffect.cpp: effects/ButterflyEffect.h effects/ButterflyPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/butterfly-16.xpm ../include/butterfly-24.xpm ../include/butterfly_32.xpm ../include/butterfly-48.xpm ../include/butterfly-64.xpm Parallel.h +effects/AdjustPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/BarsPanel.cpp: effects/BarsPanel.h effects/EffectPanelUtils.h effects/BarsEffect.h @@ -4338,27 +4426,25 @@ effects/BarsPanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/BarsEffect.cpp: effects/BarsEffect.h effects/BarsPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/bars-16.xpm ../include/bars-24.xpm ../include/bars-32.xpm ../include/bars-48.xpm ../include/bars-64.xpm -controllers/WLED.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h outputs/DDPOutput.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h - -controllers/SanDevices.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h - -controllers/Pixlite16.cpp: outputs/OutputManager.h outputs/Output.h UtilFunctions.h outputs/ControllerEthernet.h Discovery.h +effects/AdjustPanel.cpp: effects/AdjustPanel.h effects/AdjustEffect.h effects/EffectPanelUtils.h UtilFunctions.h -effects/ColorWashEffect.cpp: effects/ColorWashEffect.h effects/ColorWashPanel.h sequencer/Effect.h sequencer/EffectLayer.h sequencer/Element.h RenderBuffer.h UtilClasses.h ../include/ColorWash.xpm +effects/ButterflyEffect.cpp: effects/ButterflyEffect.h effects/ButterflyPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/butterfly-16.xpm ../include/butterfly-24.xpm ../include/butterfly_32.xpm ../include/butterfly-48.xpm ../include/butterfly-64.xpm Parallel.h -effects/ColorWashPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +effects/ButterflyPanel.h: BulkEditControls.h effects/EffectPanelUtils.h -effects/DMXEffect.cpp: effects/DMXEffect.h effects/DMXPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h models/Model.h models/ModelGroup.h ../include/dmx-16.xpm ../include/dmx-24.xpm ../include/dmx-32.xpm ../include/dmx-48.xpm ../include/dmx-64.xpm UtilFunctions.h +controllers/WLED.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h outputs/DDPOutput.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h -effects/CurtainPanel.cpp: effects/CurtainPanel.h effects/EffectPanelUtils.h effects/CurtainEffect.h +controllers/SanDevices.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h -effects/CurtainPanel.h: BulkEditControls.h effects/EffectPanelUtils.h +controllers/Pixlite16.cpp: outputs/OutputManager.h outputs/Output.h UtilFunctions.h outputs/ControllerEthernet.h Discovery.h effects/CurtainEffect.cpp: effects/CurtainEffect.h effects/CurtainPanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h ../include/curtain-16.xpm ../include/curtain-24.xpm ../include/curtain-32.xpm ../include/curtain-48.xpm ../include/curtain-64.xpm effects/ColorWashPanel.cpp: effects/ColorWashPanel.h effects/ColorWashEffect.h -controllers/Minleon.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h outputs/DDPOutput.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h +effects/ColorWashPanel.h: BulkEditControls.h effects/EffectPanelUtils.h + +effects/ColorWashEffect.cpp: effects/ColorWashEffect.h effects/ColorWashPanel.h sequencer/Effect.h sequencer/EffectLayer.h sequencer/Element.h RenderBuffer.h UtilClasses.h ../include/ColorWash.xpm effects/CirclesPanel.cpp: effects/CirclesPanel.h effects/EffectPanelUtils.h effects/CirclesEffect.h @@ -4372,7 +4458,11 @@ effects/CandlePanel.h: BulkEditControls.h effects/EffectPanelUtils.h effects/CandleEffect.cpp: effects/CandleEffect.h effects/CandlePanel.h sequencer/Effect.h RenderBuffer.h UtilClasses.h AudioManager.h models/Model.h UtilFunctions.h Parallel.h ../include/candle-16.xpm ../include/candle-24.xpm ../include/candle-32.xpm ../include/candle-48.xpm ../include/candle-64.xpm -cad/VRMLWriter.cpp: xLightsVersion.h +effects/ButterflyPanel.cpp: effects/ButterflyPanel.h effects/EffectPanelUtils.h effects/ButterflyEffect.h + +controllers/AlphaPix.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h + +controllers/ESPixelStick.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h outputs/DDPOutput.h models/ModelManager.h UtilFunctions.h outputs/ControllerEthernet.h controllers/ControllerUploadData.cpp: outputs/Output.h outputs/OutputManager.h models/ModelManager.h models/Model.h outputs/ControllerEthernet.h UtilFunctions.h Pixels.h @@ -4380,11 +4470,13 @@ controllers/ControllerCaps.cpp: UtilFunctions.h ExternalHooks.h outputs/Controll controllers/BaseController.cpp: outputs/OutputManager.h models/ModelManager.h outputs/ControllerEthernet.h -controllers/AlphaPix.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h +cad/VRMLWriter.cpp: xLightsVersion.h cad/ModelToCAD.cpp: models/Model.h models/ModelManager.h -cad/CADWriter.cpp: UtilFunctions.h +controllers/Falcon.cpp: outputs/OutputManager.h outputs/Output.h models/Model.h models/ModelManager.h outputs/ControllerEthernet.h outputs/DDPOutput.h UtilFunctions.h + +controllers/Minleon.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h outputs/DDPOutput.h models/ModelManager.h outputs/ControllerEthernet.h UtilFunctions.h controllers/J1Sys.cpp: UtilFunctions.h outputs/ControllerEthernet.h models/Model.h outputs/OutputManager.h outputs/Output.h models/ModelManager.h @@ -4392,17 +4484,13 @@ controllers/HinksPixExportDialog.cpp: AudioManager.h ExternalHooks.h UtilFunctio controllers/HinksPix.cpp: UtilFunctions.h models/Model.h models/ModelManager.h outputs/ControllerEthernet.h outputs/Output.h outputs/OutputManager.h -controllers/Falcon.cpp: outputs/OutputManager.h outputs/Output.h models/Model.h models/ModelManager.h outputs/ControllerEthernet.h outputs/DDPOutput.h UtilFunctions.h - ../common/xlBaseApp.cpp: ExternalHooks.h xLightsVersion.h controllers/FPPConnectDialog.cpp: xLightsMain.h xLightsXmlFile.h outputs/Output.h outputs/OutputManager.h UtilFunctions.h ExternalHooks.h outputs/ControllerEthernet.h FSEQFile.h Parallel.h Discovery.h -controllers/FPP.cpp: ../include/zstd.h models/CustomModel.h models/Model.h models/MatrixModel.h outputs/OutputManager.h outputs/Output.h outputs/E131Output.h outputs/DDPOutput.h outputs/KinetOutput.h outputs/TwinklyOutput.h outputs/ControllerEthernet.h outputs/ControllerSerial.h UtilFunctions.h xLightsVersion.h Parallel.h ExternalHooks.h FSEQFile.h Discovery.h TraceLog.h +controllers/FPP.cpp: ../include/zstd.h models/CustomModel.h models/Model.h models/MatrixModel.h outputs/OutputManager.h outputs/Output.h outputs/E131Output.h outputs/DDPOutput.h outputs/ArtNetOutput.h outputs/KinetOutput.h outputs/TwinklyOutput.h outputs/ControllerEthernet.h outputs/ControllerSerial.h UtilFunctions.h xLightsVersion.h Parallel.h ExternalHooks.h FSEQFile.h Discovery.h TraceLog.h controllers/Experience.cpp: UtilFunctions.h models/Model.h models/ModelManager.h outputs/ControllerEthernet.h outputs/Output.h outputs/OutputManager.h outputs/DDPOutput.h -controllers/ESPixelStick.cpp: models/Model.h outputs/OutputManager.h outputs/Output.h models/ModelManager.h UtilFunctions.h outputs/ControllerEthernet.h - .PHONY: before_linux_debug after_linux_debug clean_linux_debug before_linux_release after_linux_release clean_linux_release diff --git a/xLights/xLightsApp.cpp b/xLights/xLightsApp.cpp index 34015bda5f..e04494990a 100644 --- a/xLights/xLightsApp.cpp +++ b/xLights/xLightsApp.cpp @@ -124,6 +124,9 @@ #pragma comment(lib, "swscale.lib") #pragma comment(lib, "z.lib") #pragma comment(lib, "lua5.3.5-static.lib") +#pragma comment(lib, "libwebp.lib") +#pragma comment(lib, "libwebpdecoder.lib") +#pragma comment(lib, "libwebpdemux.lib") #endif xLightsFrame* xLightsApp::__frame = nullptr; diff --git a/xLights/xLightsImportChannelMapDialog.cpp b/xLights/xLightsImportChannelMapDialog.cpp index 32f753a748..5c4dab55bd 100644 --- a/xLights/xLightsImportChannelMapDialog.cpp +++ b/xLights/xLightsImportChannelMapDialog.cpp @@ -46,6 +46,28 @@ int wxCALLBACK MyCompareFunctionDesc(wxIntPtr item1, wxIntPtr item2, wxIntPtr so return item1 == item2 ? 0 : ((item1 < item2) ? 1 : -1); } +int wxCALLBACK MyCompareFunctionAscEffects(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData) +{ + wxListCtrl* list = (wxListCtrl*)sortData; + auto i1 = list->GetItemText(item1, 0); + auto i2 = list->GetItemText(item2, 0); + auto it1 = wxAtoi(list->GetItemText(item1, 1)); + auto it2 = wxAtoi(list->GetItemText(item2, 1)); + + return it1 == it2 ? 0 : ((it1 < it2) ? -1 : 1); +} + +int wxCALLBACK MyCompareFunctionDescEffects(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData) +{ + wxListCtrl* list = (wxListCtrl*)sortData; + auto i1 = list->GetItemText(item1, 0); + auto i2 = list->GetItemText(item2, 0); + auto it1 = wxAtoi(list->GetItemText(item1, 1)); + auto it2 = wxAtoi(list->GetItemText(item2, 1)); + + return it1 == it2 ? 0 : ((it1 < it2) ? 1 : -1); +} + class MDDropSource : public wxDropSource { xLightsImportChannelMapDialog* _window; @@ -600,7 +622,7 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c } wxConfigBase* config = wxConfigBase::Get(); - CheckBox_LockEffects->SetValue(config->ReadBool("ImportEffectsLocked", true)); + CheckBox_LockEffects->SetValue(config->ReadBool("ImportEffectsLocked", false)); EnsureWindowHeaderIsOnScreen(this); } @@ -853,15 +875,15 @@ void xLightsImportChannelMapDialog::AddModel(Model *m, int &ms) { } } - xLightsImportModelNode *lastmodel = new xLightsImportModelNode(nullptr, m->GetName(), std::string(""), true, *wxWHITE, (m->GetDisplayAs() == "ModelGroup")); + xLightsImportModelNode* lastmodel = new xLightsImportModelNode(nullptr, m->GetName(), std::string(""), true, m->GetAliases(), *wxWHITE, (m->GetDisplayAs() == "ModelGroup")); _dataModel->BulkInsert(lastmodel, ms++); for (int s = 0; s < m->GetNumSubModels(); ++s) { Model *subModel = m->GetSubModel(s); xLightsImportModelNode* laststrand; if (channelColors.find(subModel->GetName()) != channelColors.end()) { - laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), subModel->GetName(), std::string(""), true, channelColors.find(subModel->GetName())->second.asWxColor()); + laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), subModel->GetName(), std::string(""), true, m->GetAliases(), channelColors.find(subModel->GetName())->second.asWxColor()); } else { - laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), subModel->GetName(), std::string(""), true, *wxWHITE); + laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), subModel->GetName(), std::string(""), true, m->GetAliases(), *wxWHITE); } lastmodel->Append(laststrand); } @@ -873,9 +895,9 @@ void xLightsImportChannelMapDialog::AddModel(Model *m, int &ms) { } xLightsImportModelNode* laststrand; if (channelColors.find(sn.ToStdString()) != channelColors.end()) { - laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), sn, std::string(""), true, channelColors.find(sn.ToStdString())->second.asWxColor()); + laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), sn, std::string(""), true, m->GetAliases(), channelColors.find(sn.ToStdString())->second.asWxColor()); } else { - laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), sn, std::string(""), true, *wxWHITE); + laststrand = new xLightsImportModelNode(lastmodel, m->GetName(), sn, std::string(""), true, m->GetAliases(), *wxWHITE); } lastmodel->Append(laststrand); for (int n = 0; n < m->GetStrandLength(s); ++n) { @@ -885,9 +907,9 @@ void xLightsImportChannelMapDialog::AddModel(Model *m, int &ms) { } xLightsImportModelNode* lastnode; if (channelColors.find(nn.ToStdString()) != channelColors.end()) { - lastnode = new xLightsImportModelNode(laststrand, m->GetName(), sn, nn, std::string(""), true, channelColors.find(nn.ToStdString())->second.asWxColor()); + lastnode = new xLightsImportModelNode(laststrand, m->GetName(), sn, nn, std::string(""), true, m->GetAliases(), channelColors.find(nn.ToStdString())->second.asWxColor()); } else { - lastnode = new xLightsImportModelNode(laststrand, m->GetName(), sn, nn, std::string(""), true, *wxWHITE); + lastnode = new xLightsImportModelNode(laststrand, m->GetName(), sn, nn, std::string(""), true, m->GetAliases(), *wxWHITE); } laststrand->Insert(lastnode, n); } @@ -1730,12 +1752,26 @@ void xLightsImportChannelMapDialog::OnListCtrl_AvailableItemSelect(wxListEvent& void xLightsImportChannelMapDialog::OnListCtrl_AvailableColumnClick(wxListEvent& event) { - if (_sortOrder == 0) { - _sortOrder = 1; - ListCtrl_Available->SortItems(MyCompareFunctionAsc, (wxIntPtr) ListCtrl_Available); - } else { - _sortOrder = 0; - ListCtrl_Available->SortItems(MyCompareFunctionDesc, (wxIntPtr)ListCtrl_Available); + if (event.m_col == 0) { + if (_sortOrder == 0) { + _sortOrder = 1; + ListCtrl_Available->SortItems(MyCompareFunctionAsc, (wxIntPtr)ListCtrl_Available); + } else { + _sortOrder = 0; + ListCtrl_Available->SortItems(MyCompareFunctionDesc, (wxIntPtr)ListCtrl_Available); + } + } + else if (event.m_col == 1) + { + if (_sortOrder == 3) { + _sortOrder = 4; + ListCtrl_Available->SortItems(MyCompareFunctionAsc, (wxIntPtr)ListCtrl_Available); // put it back in start order as otherwise this does not work + ListCtrl_Available->SortItems(MyCompareFunctionAscEffects, (wxIntPtr)ListCtrl_Available); + } else { + _sortOrder = 3; + ListCtrl_Available->SortItems(MyCompareFunctionAsc, (wxIntPtr)ListCtrl_Available); // put it back in start order as otherwise this does not work + ListCtrl_Available->SortItems(MyCompareFunctionDescEffects, (wxIntPtr)ListCtrl_Available); + } } } @@ -2113,7 +2149,7 @@ void xLightsImportChannelMapDialog::MarkUsed() if (!std::binary_search(used.begin(), used.end(), ListCtrl_Available->GetItemText(i).ToStdString())) { // not used ImportChannel* im = GetImportChannel(ListCtrl_Available->GetItemText(i).ToStdString()); - if (im != nullptr && im->name == "ModelGroup") { + if (im != nullptr && im->type == "ModelGroup") { ListCtrl_Available->SetItemTextColour(i, CyanOrBlue()); } else { ListCtrl_Available->SetItemTextColour(i, wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOXTEXT)); @@ -2179,25 +2215,28 @@ wxString xLightsImportChannelMapDialog::AggressiveAutomap(const wxString& name) } void xLightsImportChannelMapDialog::DoAutoMap( - std::function lambda_model, - std::function lambda_strand, - std::function lambda_node, + std::function&)> lambda_model, + std::function&)> lambda_strand, + std::function&)> lambda_node, const std::string& extra1, const std::string& extra2, const std::string& mg) { for (unsigned int i = 0; i < _dataModel->GetChildCount(); ++i) { auto model = _dataModel->GetNthChild(i); if (model != nullptr) { + + auto aliases = model->GetAliases(); + if ((model->IsGroup() && (mg == "B" || mg == "G")) || (!model->IsGroup() && (mg == "B" || mg == "M"))) { for (int j = 0; j < ListCtrl_Available->GetItemCount(); ++j) { wxString const availName = ListCtrl_Available->GetItemText(j).Trim(true).Trim(false).Lower(); if (availName.Contains("/")) { wxArrayString const parts = wxSplit(availName, '/'); - if (lambda_model(model->_model, parts[0], extra1, extra2)) { + if (lambda_model(model->_model, parts[0], extra1, extra2, aliases)) { // matched the model name ... need to look at strands and submodels for (unsigned int k = 0; k < model->GetChildCount(); ++k) { auto strand = model->GetNthChild(k); if (strand != nullptr) { - if (lambda_strand(strand->_strand, parts[1], extra1, extra2)) { + if (lambda_strand(strand->_strand, parts[1], extra1, extra2, aliases)) { // matched to the strand level if (parts.size() == 2) { if (strand->_mapping.empty()) { @@ -2210,7 +2249,7 @@ void xLightsImportChannelMapDialog::DoAutoMap( auto node = strand->GetNthChild(m); if (node != nullptr) { if (node->_mapping.empty()) { - if (lambda_node(node->_node, parts[2], extra1, extra2)) { + if (lambda_node(node->_node, parts[2], extra1, extra2, aliases)) { // matched to the node level if (parts.size() == 3) { node->_mapping = ListCtrl_Available->GetItemText(j); @@ -2228,14 +2267,14 @@ void xLightsImportChannelMapDialog::DoAutoMap( } } } else { - if (model->_mapping.empty() && lambda_model(model->_model, availName, extra1, extra2)) { + if (model->_mapping.empty() && lambda_model(model->_model, availName, extra1, extra2, aliases)) { model->_mapping = ListCtrl_Available->GetItemText(j); model->_mappingExists = true; } for (unsigned int k = 0; k < model->GetChildCount(); ++k) { auto strand = model->GetNthChild(k); if (strand != nullptr) { - if (strand->_mapping.empty() &&lambda_strand(model->_model + "/" + strand->_strand, availName, extra1, extra2)) { + if (strand->_mapping.empty() &&lambda_strand(model->_model + "/" + strand->_strand, availName, extra1, extra2, aliases)) { strand->_mapping = ListCtrl_Available->GetItemText(j); strand->_mappingExists = true; } @@ -2243,7 +2282,7 @@ void xLightsImportChannelMapDialog::DoAutoMap( // auto node = strand->GetNthChild(m); // if (node != nullptr) { // if (node->_mapping.empty()) { - // if (lambda_node(model->_model + "/" + strand->_strand + "/" + node->_node, availName, extra1, extra2)) { + // if (lambda_node(model->_model + "/" + strand->_strand + "/" + node->_node, availName, extra1, extra2, aliases)) { // // matched to the node level // node->_mapping = ListCtrl_Available->GetItemText(j); // node->_mappingExists = true; diff --git a/xLights/xLightsImportChannelMapDialog.h b/xLights/xLightsImportChannelMapDialog.h index 340fd0f43a..c3a1cdf1bb 100644 --- a/xLights/xLightsImportChannelMapDialog.h +++ b/xLights/xLightsImportChannelMapDialog.h @@ -67,8 +67,8 @@ class xLightsImportModelNode : wxDataViewTreeStoreNode { public: xLightsImportModelNode(xLightsImportModelNode* parent, - const wxString &model, const wxString &strand, const wxString &node, - const wxString &mapping, const bool mappingExists, const wxColor& color = *wxWHITE) : + const wxString& model, const wxString& strand, const wxString& node, + const wxString& mapping, const bool mappingExists, const std::list aliases, const wxColor& color = *wxWHITE) : wxDataViewTreeStoreNode(parent, "XXX"), m_parent(parent), _model(model), @@ -78,12 +78,13 @@ class xLightsImportModelNode : wxDataViewTreeStoreNode _color(color), _group(false), _mappingExists(mappingExists), + _aliases(aliases), m_container(false) { } xLightsImportModelNode(xLightsImportModelNode* parent, const wxString &model, const wxString &strand, - const wxString &mapping, const bool mappingExists, const wxColor& color = *wxWHITE) : + const wxString& mapping, const bool mappingExists, const std::list aliases, const wxColor& color = *wxWHITE) : wxDataViewTreeStoreNode(parent, "XXX"), m_parent(parent), _model(model), @@ -93,12 +94,13 @@ class xLightsImportModelNode : wxDataViewTreeStoreNode _color(color), _group(false), _mappingExists(mappingExists), + _aliases(aliases), m_container(true) { } xLightsImportModelNode(xLightsImportModelNode* parent, const wxString &model, - const wxString &mapping, const bool mappingExists, const wxColor& color = *wxWHITE, const bool isGroup = false) : + const wxString& mapping, const bool mappingExists, const std::list aliases, const wxColor& color = *wxWHITE, const bool isGroup = false) : wxDataViewTreeStoreNode(parent, "XXX"), m_parent(parent), _model(model), @@ -108,6 +110,7 @@ class xLightsImportModelNode : wxDataViewTreeStoreNode _color(color), _group(isGroup), _mappingExists(mappingExists), + _aliases(aliases), m_container(!isGroup) { } @@ -134,6 +137,11 @@ class xLightsImportModelNode : wxDataViewTreeStoreNode bool IsGroup() const { return _group; } + std::list GetAliases() const + { + return _aliases; + } + bool HasMapping() { if (!_mapping.empty()) { @@ -187,6 +195,7 @@ class xLightsImportModelNode : wxDataViewTreeStoreNode wxColor _color; bool _group; bool _mappingExists; + std::list _aliases; // TODO/FIXME: // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded) @@ -491,10 +500,10 @@ class xLightsImportChannelMapDialog: public wxDialog void BulkMapSubmodelsStrands(const std::string& fromModel, wxDataViewItem& toModel); void BulkMapNodes(const std::string& fromModel, wxDataViewItem& toModel); void DoAutoMap( - std::function lambda_model, - std::function lambda_strand, - std::function lambda_node, - const std::string& extra1, const std::string& extra2, const std::string& extra3); + std::function& aliases)> lambda_model, + std::function& aliases)> lambda_strand, + std::function& aliases)> lambda_node, + const std::string& extra1, const std::string& extra2, const std::string& mg); void LoadXMapMapping(wxString const& filename, bool hideWarnings); @@ -505,39 +514,49 @@ class xLightsImportChannelMapDialog: public wxDialog void generateMapHintsFile(wxString const& filename); static wxString AggressiveAutomap(const wxString& name); - std::function aggressive = - [](const std::string& s, const std::string& c, const std::string& extra1, const std::string& extra2) - { - return AggressiveAutomap(wxString(s).Trim(true).Trim(false).Lower()) == c; - }; - - std::function norm = - [](const std::string& s, const std::string& c, const std::string& extra1, const std::string& extra2) - { - return wxString(s).Trim(true).Trim(false).Lower() == c; - }; - - std::function regex = - [](const std::string& s, const std::string& c, const std::string& pattern, const std::string& replacement) - { - static wxRegEx r; - static std::string lastRegex; - - if (wxString(c).Trim().Lower() != wxString(replacement).Trim().Lower()) + std::function&)> aggressive = + [](const std::string& s, const std::string& c, const std::string& extra1, const std::string& extra2, const std::list& aliases) { + if (AggressiveAutomap(wxString(s).Trim(true).Trim(false).Lower()) == c) + return true; + + for (const auto& it : aliases) { + if (wxString(it).Trim(true).Trim(false).Lower() == "oldname:" + c) + return true; + } + + for (const auto& it : aliases) { + if (wxString(it).Trim(true).Trim(false).Lower() == c) + return true; + } + return false; + }; - // create a regex from extra - if (pattern != lastRegex) { - r.Compile(pattern, wxRE_ADVANCED | wxRE_ICASE); - lastRegex = pattern; - } + std::function&)> norm = + [](const std::string& s, const std::string& c, const std::string& extra1, const std::string& extra2, const std::list& aliases) { + return (wxString(s).Trim(true).Trim(false).Lower() == c); + }; - // run is against s ... return true if it matches - if (r.IsValid()) { - return (r.Matches(s)); - } - return false; - }; + std::function&)> regex = + [](const std::string& s, const std::string& c, const std::string& pattern, const std::string& replacement, const std::list& aliases) { + static wxRegEx r; + static std::string lastRegex; + + if (wxString(c).Trim().Lower() != wxString(replacement).Trim().Lower()) + return false; + + // create a regex from extra + if (pattern != lastRegex) { + r.Compile(pattern, wxRE_ADVANCED | wxRE_ICASE); + lastRegex = pattern; + } + + // run is against s ... return true if it matches + if (r.IsValid()) { + return (r.Matches(s)); + } + return false; + }; SequencePackage* _xsqPkg {nullptr}; diff --git a/xLights/xLightsMain.cpp b/xLights/xLightsMain.cpp index fd03b2dfcf..1c0df0b75e 100644 --- a/xLights/xLightsMain.cpp +++ b/xLights/xLightsMain.cpp @@ -124,6 +124,8 @@ #include +#include "wxWEBPHandler/wx/imagwebp.h" + //(*InternalHeaders(xLightsFrame) #include #include @@ -1873,6 +1875,7 @@ xLightsFrame::xLightsFrame(wxWindow* parent, int ab, wxWindowID id, bool renderO EnableNetworkChanges(); wxImage::AddHandler(new wxGIFHandler); + wxImage::AddHandler(new wxWEBPHandler); config->Read("xLightse131Sync", &me131Sync, false); _outputManager.SetSyncEnabled(me131Sync); @@ -5022,7 +5025,7 @@ std::string xLightsFrame::CheckSequence(bool displayInEditor, bool writeToFile) for (const auto& itc : _outputManager.GetControllers()) { auto eth = dynamic_cast(itc); if (eth != nullptr) { - if (eth != it && it->GetIP() != "MULTICAST" && (it->GetIP() == eth->GetIP() || it->GetIP() == eth->GetResolvedIP())) { + if (eth != it && it->GetIP() != "MULTICAST" && (it->GetIP() == eth->GetIP() || it->GetIP() == eth->GetResolvedIP(false))) { wxString msg = wxString::Format(" ERR: %s IP Address '%s' for controller '%s' used on another controller '%s'. This is not allowed.", (const char*)it->GetProtocol().c_str(), (const char*)it->GetIP().c_str(), @@ -6353,7 +6356,7 @@ void xLightsFrame::ValidateEffectAssets() } if (missing != "" && (_promptBatchRenderIssues || (!_renderMode && !_checkSequenceMode))) { - wxMessageBox("Sequence references files which cannot be found:\n" + missing + "\n Use Tools/Check Sequence for more details.", "Missing assets"); + wxMessageBox("Sequence references files which cannot be found:\nShow Folder: " + showDirectory + "\n" + missing + "\n Use Tools/Check Sequence for more details.", "Missing assets"); } } @@ -8747,12 +8750,8 @@ void xLightsFrame::SetSnapToTimingMarks(bool b) void xLightsFrame::PurgeDownloadCache() { - VendorModelDialog::GetCache().ClearCache(); - VendorModelDialog::GetCache().Save(); - VendorMusicDialog::GetCache().ClearCache(); - VendorMusicDialog::GetCache().Save(); - ShaderDownloadDialog::GetCache().ClearCache(); - ShaderDownloadDialog::GetCache().Save(); + CachedFileDownloader::GetDefaultCache().ClearCache(); + CachedFileDownloader::GetDefaultCache().Save(); } bool xLightsFrame::GetRecycleTips() const diff --git a/xLights/xLightsVersion.h b/xLights/xLightsVersion.h index 2087ce23f2..da2750b716 100644 --- a/xLights/xLightsVersion.h +++ b/xLights/xLightsVersion.h @@ -15,7 +15,7 @@ #if __has_include("xlights_build_version.h") #include "xlights_build_version.h" #else -static const wxString xlights_version_string = "2023.17"; +static const wxString xlights_version_string = "2023.22"; #endif #ifdef DEBUG static const wxString xlights_qualifier = " DEBUG"; diff --git a/xScanner/xScanner.cbp.mak b/xScanner/xScanner.cbp.mak index bb05e270fb..32abdb0afc 100644 --- a/xScanner/xScanner.cbp.mak +++ b/xScanner/xScanner.cbp.mak @@ -40,9 +40,9 @@ OBJDIR_LINUX_RELEASE = .objs_lr DEP_LINUX_RELEASE = OUT_LINUX_RELEASE = ../bin/xScanner -OBJ_LINUX_DEBUG = $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_DEBUG)/xScannerMain.o $(OBJDIR_LINUX_DEBUG)/xScannerApp.o $(OBJDIR_LINUX_DEBUG)/ScanWork.o $(OBJDIR_LINUX_DEBUG)/MAC.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Pixlite16.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/FPP.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/automation/automation.o $(OBJDIR_LINUX_DEBUG)/__/xLights/TraceLog.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Parallel.o $(OBJDIR_LINUX_DEBUG)/__/xLights/JobPool.o $(OBJDIR_LINUX_DEBUG)/__/xLights/ExportSettings.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Discovery.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Controller.o +OBJ_LINUX_DEBUG = $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_DEBUG)/xScannerMain.o $(OBJDIR_LINUX_DEBUG)/xScannerApp.o $(OBJDIR_LINUX_DEBUG)/ScanWork.o $(OBJDIR_LINUX_DEBUG)/MAC.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/CurlManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Pixlite16.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/FPP.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/automation/automation.o $(OBJDIR_LINUX_DEBUG)/__/xLights/TraceLog.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Parallel.o $(OBJDIR_LINUX_DEBUG)/__/xLights/JobPool.o $(OBJDIR_LINUX_DEBUG)/__/xLights/ExportSettings.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Discovery.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Controller.o -OBJ_LINUX_RELEASE = $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_RELEASE)/xScannerMain.o $(OBJDIR_LINUX_RELEASE)/xScannerApp.o $(OBJDIR_LINUX_RELEASE)/ScanWork.o $(OBJDIR_LINUX_RELEASE)/MAC.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Pixlite16.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/FPP.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/automation/automation.o $(OBJDIR_LINUX_RELEASE)/__/xLights/TraceLog.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Parallel.o $(OBJDIR_LINUX_RELEASE)/__/xLights/JobPool.o $(OBJDIR_LINUX_RELEASE)/__/xLights/ExportSettings.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Discovery.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Controller.o +OBJ_LINUX_RELEASE = $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_RELEASE)/xScannerMain.o $(OBJDIR_LINUX_RELEASE)/xScannerApp.o $(OBJDIR_LINUX_RELEASE)/ScanWork.o $(OBJDIR_LINUX_RELEASE)/MAC.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonwriter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonval.o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonreader.o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/CurlManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Pixlite16.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/FPP.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/automation/automation.o $(OBJDIR_LINUX_RELEASE)/__/xLights/TraceLog.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Parallel.o $(OBJDIR_LINUX_RELEASE)/__/xLights/JobPool.o $(OBJDIR_LINUX_RELEASE)/__/xLights/ExportSettings.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Discovery.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Controller.o all: linux_debug linux_release @@ -66,8 +66,8 @@ linux_debug: before_linux_debug out_linux_debug after_linux_debug out_linux_debug: before_linux_debug $(OBJ_LINUX_DEBUG) $(DEP_LINUX_DEBUG) $(LD) $(LIBDIR_LINUX_DEBUG) -o $(OUT_LINUX_DEBUG) $(OBJ_LINUX_DEBUG) $(LDFLAGS_LINUX_DEBUG) $(LIB_LINUX_DEBUG) -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o: ../xLights/outputs/RenardOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o: ../xLights/outputs/xxxEthernetOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/xxxEthernetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o @@ -87,8 +87,8 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TestPreset.o: ../xLights/outputs/TestPr $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/SerialOutput.o: ../xLights/outputs/SerialOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/SerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/SerialOutput.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o: ../xLights/outputs/RenardOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o: ../xLights/outputs/PixelNetOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o @@ -108,9 +108,6 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenDMXOutput.o: ../xLights/outputs/Ope $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o: ../xLights/outputs/OPCOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/OPCOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o: ../xLights/outputs/NullOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/NullOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o - $(OBJDIR_LINUX_DEBUG)/xScannerMain.o: xScannerMain.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c xScannerMain.cpp -o $(OBJDIR_LINUX_DEBUG)/xScannerMain.o @@ -126,6 +123,9 @@ $(OBJDIR_LINUX_DEBUG)/MAC.o: MAC.cpp $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonwriter.o: ../xSchedule/wxJSON/jsonwriter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xSchedule/wxJSON/jsonwriter.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonwriter.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o: ../xLights/outputs/NullOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/NullOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o + $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonval.o: ../xSchedule/wxJSON/jsonval.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xSchedule/wxJSON/jsonval.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xSchedule/wxJSON/jsonval.o @@ -141,6 +141,9 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/string_utils.o: ../xLights/utils/string_u $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o: ../xLights/utils/ip_utils.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/utils/ip_utils.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/utils/CurlManager.o: ../xLights/utils/CurlManager.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/utils/CurlManager.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/CurlManager.o + $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o: ../xLights/utils/Curl.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/utils/Curl.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o @@ -183,9 +186,6 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/ExportSettings.o: ../xLights/ExportSettings.cpp $(OBJDIR_LINUX_DEBUG)/__/xLights/Discovery.o: ../xLights/Discovery.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/Discovery.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/Discovery.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o: ../xLights/outputs/E131Output.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/E131Output.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o - $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o: ../xLights/outputs/LorControllers.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/LorControllers.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o @@ -210,6 +210,9 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/GenericSerialOutput.o: ../xLights/outpu $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o: ../common/xlBaseApp.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../common/xlBaseApp.cpp -o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o: ../xLights/outputs/E131Output.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/E131Output.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o + $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o: ../xLights/outputs/DMXOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/DMXOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o @@ -249,8 +252,8 @@ linux_release: before_linux_release out_linux_release after_linux_release out_linux_release: before_linux_release $(OBJ_LINUX_RELEASE) $(DEP_LINUX_RELEASE) $(LD) $(LIBDIR_LINUX_RELEASE) -o $(OUT_LINUX_RELEASE) $(OBJ_LINUX_RELEASE) $(LDFLAGS_LINUX_RELEASE) $(LIB_LINUX_RELEASE) -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o: ../xLights/outputs/RenardOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o: ../xLights/outputs/xxxEthernetOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/xxxEthernetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o @@ -270,8 +273,8 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TestPreset.o: ../xLights/outputs/Test $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/SerialOutput.o: ../xLights/outputs/SerialOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/SerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/SerialOutput.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o: ../xLights/outputs/RenardOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o: ../xLights/outputs/PixelNetOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o @@ -291,9 +294,6 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenDMXOutput.o: ../xLights/outputs/O $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o: ../xLights/outputs/OPCOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/OPCOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o: ../xLights/outputs/NullOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/NullOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o - $(OBJDIR_LINUX_RELEASE)/xScannerMain.o: xScannerMain.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c xScannerMain.cpp -o $(OBJDIR_LINUX_RELEASE)/xScannerMain.o @@ -309,6 +309,9 @@ $(OBJDIR_LINUX_RELEASE)/MAC.o: MAC.cpp $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonwriter.o: ../xSchedule/wxJSON/jsonwriter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xSchedule/wxJSON/jsonwriter.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonwriter.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o: ../xLights/outputs/NullOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/NullOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o + $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonval.o: ../xSchedule/wxJSON/jsonval.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xSchedule/wxJSON/jsonval.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xSchedule/wxJSON/jsonval.o @@ -324,6 +327,9 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/string_utils.o: ../xLights/utils/string $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o: ../xLights/utils/ip_utils.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/utils/ip_utils.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/utils/CurlManager.o: ../xLights/utils/CurlManager.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/utils/CurlManager.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/CurlManager.o + $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o: ../xLights/utils/Curl.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/utils/Curl.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o @@ -366,9 +372,6 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/ExportSettings.o: ../xLights/ExportSettings.c $(OBJDIR_LINUX_RELEASE)/__/xLights/Discovery.o: ../xLights/Discovery.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/Discovery.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/Discovery.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o: ../xLights/outputs/E131Output.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/E131Output.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o - $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o: ../xLights/outputs/LorControllers.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/LorControllers.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o @@ -393,6 +396,9 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/GenericSerialOutput.o: ../xLights/out $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o: ../common/xlBaseApp.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../common/xlBaseApp.cpp -o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o: ../xLights/outputs/E131Output.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/E131Output.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o + $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o: ../xLights/outputs/DMXOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/DMXOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o @@ -420,7 +426,7 @@ clean_linux_release: ../xLights/ExternalHooks.h: ../xLights/Color.h -../xLights/outputs/TwinklyOutput.cpp: ../xLights/UtilFunctions.h ../xLights/Discovery.h +../xLights/outputs/TwinklyOutput.cpp: ../xLights/UtilFunctions.h ../xLights/Discovery.h ../xLights/OutputModelManager.h ../xLights/outputs/TestPreset.cpp: ../xLights/UtilFunctions.h @@ -434,8 +440,6 @@ clean_linux_release: ../xLights/outputs/OPCOutput.cpp: ../xLights/UtilFunctions.h -../xLights/outputs/NullOutput.cpp: ../xLights/OutputModelManager.h - xScannerMain.cpp: xScannerMain.h ../xLights/xLightsVersion.h ../xLights/UtilFunctions.h ../include/xLights.xpm ../include/xLights-16.xpm ../include/xLights-32.xpm ../include/xLights-64.xpm ../include/xLights-128.xpm xScannerMain.h: ScanWork.h @@ -444,8 +448,12 @@ xScannerApp.cpp: xScannerApp.h xScannerMain.h ../xLights/xLightsVersion.h ScanWork.cpp: ScanWork.h ../xLights/Parallel.h xScannerMain.h xScannerApp.h ../xLights/UtilFunctions.h ../xLights/Discovery.h MAC.h +../xLights/outputs/NullOutput.cpp: ../xLights/OutputModelManager.h + ../xLights/xLightsVersion.cpp: ../xLights/xLightsVersion.h +../xLights/utils/CurlManager.cpp: ../xLights/xLightsVersion.h + ../xLights/UtilFunctions.cpp: ../xLights/UtilFunctions.h ../xLights/xLightsVersion.h ../xLights/ExternalHooks.h ../xLights/outputs/ArtNetOutput.cpp: ../xLights/UtilFunctions.h ../xLights/OutputModelManager.h ../xLights/SpecialOptions.h ../xLights/Discovery.h @@ -472,8 +480,6 @@ ScanWork.cpp: ScanWork.h ../xLights/Parallel.h xScannerMain.h xScannerApp.h ../x ../xLights/Discovery.cpp: ../xLights/Discovery.h ../xLights/UtilFunctions.h -../xLights/outputs/E131Output.cpp: ../xLights/UtilFunctions.h - ../xLights/outputs/LorController.cpp: ../xLights/UtilFunctions.h ../xLights/outputs/LOROptimisedOutput.cpp: ../xLights/OutputModelManager.h ../xLights/UtilFunctions.h @@ -482,6 +488,8 @@ ScanWork.cpp: ScanWork.h ../xLights/Parallel.h xScannerMain.h xScannerApp.h ../x ../common/xlBaseApp.cpp: ../xLights/ExternalHooks.h ../xLights/xLightsVersion.h +../xLights/outputs/E131Output.cpp: ../xLights/UtilFunctions.h + ../xLights/outputs/DDPOutput.cpp: ../xLights/UtilFunctions.h ../xLights/OutputModelManager.h ../xLights/Discovery.h ../xLights/outputs/ControllerSerial.cpp: ../xLights/OutputModelManager.h ../xLights/UtilFunctions.h ../xLights/SpecialOptions.h diff --git a/xSchedule/CommandManager.cpp b/xSchedule/CommandManager.cpp index 34ace30edf..d2a6944258 100644 --- a/xSchedule/CommandManager.cpp +++ b/xSchedule/CommandManager.cpp @@ -321,6 +321,7 @@ CommandManager::CommandManager() _commands.push_back(new Command("Run event playlist step if idle looped", 2, plst, false, false, false, false, false, true, true, true, false)); _commands.push_back(new Command("Stop event playlist", 1, pl, false, false, false, false, false, true, true, true, false)); _commands.push_back(new Command("Stop event playlist if playing step", 2, plst, false, false, false, false, false, true, true, true, false)); + _commands.push_back(new Command("Stop all event playlists", 0, {}, false, false, false, false, false, true, true, true, false)); _commands.push_back(new Command("Toggle loop current step", 0, {}, false, false, false, true, false, false, false, true, false)); _commands.push_back(new Command("Toggle current playlist random", 0, {}, false, false, false, true, false, false, false, true, false)); diff --git a/xSchedule/ESEQFile.cpp b/xSchedule/ESEQFile.cpp index 5aa4e0f19f..7035927c03 100644 --- a/xSchedule/ESEQFile.cpp +++ b/xSchedule/ESEQFile.cpp @@ -24,6 +24,7 @@ ESEQFile::ESEQFile() _frameBuffer = nullptr; _frame0Offset = 0; _ok = false; + _fseq = nullptr; } ESEQFile::ESEQFile(const std::string& filename) @@ -36,6 +37,7 @@ ESEQFile::ESEQFile(const std::string& filename) _frameBuffer = nullptr; _frame0Offset = 0; _ok = true; + _fseq = nullptr; Load(_filename); } @@ -47,6 +49,12 @@ ESEQFile::~ESEQFile() void ESEQFile::Close() { + if (_fseq != nullptr) + { + delete _fseq; + _fseq = nullptr; + } + if (_fh != nullptr) { _fh->Close(); @@ -108,6 +116,7 @@ void ESEQFile::Load(const std::string& filename) Close(); + _fseq = nullptr; _filename = FixFile("", filename); _fh = new wxFile(_filename); @@ -129,7 +138,22 @@ void ESEQFile::Load(const std::string& filename) wxFileName fn(_filename); _frames = (size_t)(fn.GetSize().ToULong() - _frame0Offset) / _channelsPerFrame; - logger_base.info("ESEQ file %s opened.", (const char *)_filename.c_str()); + logger_base.info("ESEQ file %s opened offset %lu channels %lu frames %lu.", (const char *)_filename.c_str(), _offset, _channelsPerFrame, _frames); + } + else if (std::string(tag) == "PSEQ") + { + Close(); + _fseq = FSEQFile::openFSEQFile(filename); + _frame0Offset = 20; + _channelsPerFrame = _fseq->getChannelCount(); + _modelSize = _channelsPerFrame; + _frameBuffer = (uint8_t*)malloc(_channelsPerFrame); + _frames = _fseq->getNumFrames(); + if (_fseq->getVersionMajor() == 2) + { + _offset = dynamic_cast(_fseq)->m_sparseRanges.front().first + 1; + } + logger_base.info("ESEQ file %s opened V2 offset %lu channels %lu frames %lu.", (const char*)_filename.c_str(), _offset, _channelsPerFrame, _frames); } else { @@ -148,14 +172,18 @@ void ESEQFile::ReadData(uint8_t* buffer, size_t buffersize, size_t frame, APPLYM { if (frame >= _frames) return; // cant read past end of file - if (_fh->Tell() != _frame0Offset + _channelsPerFrame * frame) - { - // we need to seek to our frame - _fh->Seek(_frame0Offset + _channelsPerFrame * frame, wxFromStart); - } + if (_fseq != nullptr) { + FSEQFile::FrameData* fd = _fseq->getFrame(frame); + memcpy(_frameBuffer, fd->GetData(), std::min(_channelsPerFrame, fd->GetSize())); + } else { + if (_fh->Tell() != _frame0Offset + _channelsPerFrame * frame) { + // we need to seek to our frame + _fh->Seek(_frame0Offset + _channelsPerFrame * frame, wxFromStart); + } - // read in the frame from disk - _fh->Read(_frameBuffer, _channelsPerFrame); + // read in the frame from disk + _fh->Read(_frameBuffer, _channelsPerFrame); + } Blend(buffer, buffersize, _frameBuffer, _modelSize, applyMethod, _offset - 1); } diff --git a/xSchedule/ESEQFile.h b/xSchedule/ESEQFile.h index 8e8649b38a..7449b0b753 100644 --- a/xSchedule/ESEQFile.h +++ b/xSchedule/ESEQFile.h @@ -16,18 +16,21 @@ #include #include "Blend.h" +#include "../xLights/FSEQFile.h" + class ESEQFile { - std::string _filename; - size_t _frames; - size_t _channelsPerFrame; - size_t _offset; - size_t _modelSize; - wxFile* _fh; - uint8_t* _frameBuffer; - size_t _frame0Offset; - bool _ok; + std::string _filename = ""; + size_t _frames = 0; + size_t _channelsPerFrame =0; + size_t _offset = 0; + size_t _modelSize = 0; + wxFile* _fh = nullptr; + uint8_t* _frameBuffer = nullptr; + size_t _frame0Offset= 0; + bool _ok = false; + FSEQFile* _fseq = nullptr; public: diff --git a/xSchedule/OSCPacket.cpp b/xSchedule/OSCPacket.cpp index 3a06865700..390e0b7c31 100644 --- a/xSchedule/OSCPacket.cpp +++ b/xSchedule/OSCPacket.cpp @@ -160,11 +160,11 @@ OSCPacket::OSCPacket(uint8_t* buffer, int buffsize, OSCOptions* options, int fra _buffer = (uint8_t*)malloc(_buffsize); memcpy(_buffer, buffer, buffsize); _progress = -2; - if (strlen((char*)buffer) > buffsize || strlen((char*)buffer) < 10) return; + if (strlen((char*)buffer) > buffsize) return; std::string path((char*)buffer); _path = path; - if (path.substr(0, 10) == "/Timecode/") + if (strlen((char*)buffer) >= 10 && path.substr(0, 10) == "/Timecode/") { _isSync = true; if (options->GetRemotePath() == "/Timecode/%STEPNAME%") diff --git a/xSchedule/ScheduleManager.cpp b/xSchedule/ScheduleManager.cpp index c303e5ce8d..a3ec82dae4 100644 --- a/xSchedule/ScheduleManager.cpp +++ b/xSchedule/ScheduleManager.cpp @@ -2357,6 +2357,16 @@ bool ScheduleManager::Action(const wxString& command, const wxString& parameters { SetBackgroundPlayList(nullptr); logger_base.info("Clear background playlist."); + } else if (command == "Stop all event playlists") { + auto it2 = _eventPlayLists.begin(); + while (it2 != _eventPlayLists.end()) { + logger_base.info("Stopped event playlist %s.", (const char*)(*it2)->GetNameNoTime().c_str()); + auto temp = it2; + ++it2; + (*temp)->Stop(); + delete *temp; + _eventPlayLists.remove(*temp); + } } else if (command == "Stop event playlist") { diff --git a/xSchedule/VirtualMatricesDialog.cpp b/xSchedule/VirtualMatricesDialog.cpp index a7ffd9a827..dfe64006fc 100644 --- a/xSchedule/VirtualMatricesDialog.cpp +++ b/xSchedule/VirtualMatricesDialog.cpp @@ -91,8 +91,9 @@ VirtualMatricesDialog::VirtualMatricesDialog(wxWindow* parent, OutputManager* ou ListView1->InsertColumn(7, "Start Channel"); ListView1->InsertColumn(8, "Quality"); ListView1->InsertColumn(9, "Matrix Multiplier"); + ListView1->InsertColumn(10, "Pixel"); - SetSize(950, 400); + SetSize(1000, 400); PopulateList(); @@ -175,8 +176,9 @@ void VirtualMatricesDialog::OnButton_OkClick(wxCommandEvent& event) matrixMultiplier = wxAtoi(ListView1->GetItemText(i, 9)); useMatrixSize = true; } + std::string pixelChannels = ListView1->GetItemText(i, 10).ToStdString(); - _vmatrices->push_back(new VirtualMatrix(_outputManager, width, height, topMost, rotation, quality, startChannel, name, size, location, useMatrixSize, matrixMultiplier)); + _vmatrices->push_back(new VirtualMatrix(_outputManager, width, height, topMost, rotation, pixelChannels, quality, startChannel, name, size, location, useMatrixSize, matrixMultiplier)); } EndDialog(wxID_OK); @@ -208,6 +210,7 @@ void VirtualMatricesDialog::DoAdd() int height = 16; bool topMost = true; std::string rotation = ""; + std::string pixelChannels = ""; wxSize size = _options->GetDefaultVideoSize(); wxPoint location = _options->GetDefaultVideoPos(); std::string startChannel = "1"; @@ -215,7 +218,7 @@ void VirtualMatricesDialog::DoAdd() bool useMatrixSize = false; int matrixMultiplier = 1; - VirtualMatrixDialog dlg(this, _outputManager, name, rotation, quality, size, location, width, height, topMost, startChannel, useMatrixSize, matrixMultiplier, _options); + VirtualMatrixDialog dlg(this, _outputManager, name, rotation, pixelChannels, quality, size, location, width, height, topMost, startChannel, useMatrixSize, matrixMultiplier, _options); if (dlg.ShowModal() == wxID_OK) { @@ -237,6 +240,7 @@ void VirtualMatricesDialog::DoAdd() { ListView1->SetItem(row, 9, ""); } + ListView1->SetItem(row, 10, pixelChannels); } ValidateWindow(); @@ -264,6 +268,7 @@ void VirtualMatricesDialog::DoEdit() int height = wxAtoi(ListView1->GetItemText(item, 2)); bool topMost = ListView1->GetItemText(item, 3) == "Yes"; std::string rotation = ListView1->GetItemText(item, 4).ToStdString(); + std::string pixelChannels = ListView1->GetItemText(item, 10).ToStdString(); auto sz = wxSplit(ListView1->GetItemText(item, 5), ','); wxSize size(300, 300); if (sz.GetCount() == 2) @@ -286,7 +291,7 @@ void VirtualMatricesDialog::DoEdit() useMatrixSize = true; } - VirtualMatrixDialog dlg(this, _outputManager, name, rotation, quality, size, location, width, height, topMost, startChannel, useMatrixSize, matrixMultiplier, _options); + VirtualMatrixDialog dlg(this, _outputManager, name, rotation, pixelChannels, quality, size, location, width, height, topMost, startChannel, useMatrixSize, matrixMultiplier, _options); if (dlg.ShowModal() == wxID_OK) { @@ -307,6 +312,7 @@ void VirtualMatricesDialog::DoEdit() { ListView1->SetItem(item, 9, ""); } + ListView1->SetItem(item, 10, pixelChannels); } ValidateWindow(); @@ -334,5 +340,6 @@ void VirtualMatricesDialog::PopulateList() { ListView1->SetItem(row, 9, ""); } + ListView1->SetItem(row, 10, (*it)->GetPixelChannels()); } } \ No newline at end of file diff --git a/xSchedule/VirtualMatrix.cpp b/xSchedule/VirtualMatrix.cpp index f9a923924b..79ede0d26c 100644 --- a/xSchedule/VirtualMatrix.cpp +++ b/xSchedule/VirtualMatrix.cpp @@ -23,7 +23,7 @@ extern "C" #include -VirtualMatrix::VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, VMROTATION rotation, wxImageResizeQuality quality, int swsQuality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier) +VirtualMatrix::VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, VMROTATION rotation, VMPIXELCHANNELS pixelChannels, wxImageResizeQuality quality, int swsQuality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier) { _suppress = false; _outputManager = outputManager; @@ -36,6 +36,7 @@ VirtualMatrix::VirtualMatrix(OutputManager* outputManager, int width, int height _useMatrixSize = useMatrixSize; _matrixMultiplier = matrixMultiplier; _rotation = rotation; + _pixelChannels = pixelChannels; _quality = quality; _swsQuality = swsQuality; _size = size; @@ -57,6 +58,7 @@ VirtualMatrix::VirtualMatrix(OutputManager* outputManager, ScheduleOptions* opti _useMatrixSize = false; _matrixMultiplier = 1; _rotation = VMROTATION::VM_NORMAL; + _pixelChannels = VMPIXELCHANNELS::RGB; _quality = wxIMAGE_QUALITY_HIGH; _swsQuality = -1; _size = options->GetDefaultVideoSize(); @@ -65,7 +67,7 @@ VirtualMatrix::VirtualMatrix(OutputManager* outputManager, ScheduleOptions* opti _window = nullptr; } -VirtualMatrix::VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, const std::string& rotation, const std::string& quality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier) +VirtualMatrix::VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, const std::string& rotation, const std::string& pixelChannels, const std::string& quality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier) { _suppress = false; _outputManager = outputManager; @@ -78,6 +80,7 @@ VirtualMatrix::VirtualMatrix(OutputManager* outputManager, int width, int height _useMatrixSize = useMatrixSize; _matrixMultiplier = matrixMultiplier; _rotation = EncodeRotation(rotation); + _pixelChannels = EncodePixelChannels(pixelChannels); _quality = EncodeScalingQuality(quality, _swsQuality); _size = size; _location = loc; @@ -97,6 +100,7 @@ VirtualMatrix::VirtualMatrix(OutputManager* outputManager, wxXmlNode* n) _topMost = (n->GetAttribute("TopMost", "TRUE") == "TRUE"); _useMatrixSize = (n->GetAttribute("UseMatrixSize", "FALSE") == "TRUE"); _rotation = EncodeRotation(n->GetAttribute("Rotation", "None").ToStdString()); + _pixelChannels = EncodePixelChannels(n->GetAttribute("PixelChannels", "RGB").ToStdString()); _quality = EncodeScalingQuality(n->GetAttribute("Quality", "Bilinear").ToStdString(), _swsQuality); _size = wxSize(wxAtoi(n->GetAttribute("WW", "300")), wxAtoi(n->GetAttribute("WH", "300"))); _matrixMultiplier = wxAtoi(n->GetAttribute("MatrixMultiplier", "1")); @@ -121,6 +125,7 @@ wxXmlNode* VirtualMatrix::Save() res->AddAttribute("UseMatrixSize", "TRUE"); } res->AddAttribute("Rotation", DecodeRotation(_rotation)); + res->AddAttribute("PixelChannels", DecodePixelChannels(_pixelChannels)); res->AddAttribute("Quality", DecodeScalingQuality(_quality, _swsQuality)); res->AddAttribute("WW", wxString::Format(wxT("%i"), (long)_size.GetWidth())); res->AddAttribute("WH", wxString::Format(wxT("%i"), (long)_size.GetHeight())); @@ -128,7 +133,6 @@ wxXmlNode* VirtualMatrix::Save() res->AddAttribute("Y", wxString::Format(wxT("%i"), (long)_location.y)); res->AddAttribute("MatrixMultiplier", wxString::Format(wxT("%d"), _matrixMultiplier)); res->AddAttribute("StartChannel", _startChannel); - return res; } @@ -176,6 +180,24 @@ std::string VirtualMatrix::DecodeRotation(VMROTATION rotation) } } +VMPIXELCHANNELS VirtualMatrix::EncodePixelChannels(const std::string rotation) +{ + if (wxString(rotation).Lower() == "rgbw") { + return VMPIXELCHANNELS::RGBW; + } else { + return VMPIXELCHANNELS::RGB; + } +} + +std::string VirtualMatrix::DecodePixelChannels(VMPIXELCHANNELS pixelChannels) +{ + if (pixelChannels == VMPIXELCHANNELS::RGBW) { + return "RGBW"; + } else { + return "RGB"; + } +} + wxImageResizeQuality VirtualMatrix::EncodeScalingQuality(const std::string quality, int& swsQuality) { swsQuality = -1; @@ -352,9 +374,10 @@ void VirtualMatrix::Frame(uint8_t*buffer, size_t size) long sc = _outputManager->DecodeStartChannel(_startChannel); - size_t end = _width * _height * 3 < size - (sc - 1) ? _width * _height * 3 : size - (sc - 1); + const int channelsPerPixel = GetPixelChannelsCount(); + size_t end = _width * _height * channelsPerPixel < size - (sc - 1) ? _width * _height * channelsPerPixel : size - (sc - 1); - for (size_t i = 0; i < end; i += 3) + for (size_t i = 0; i < end; i += channelsPerPixel) { uint8_t* pb = buffer + (sc - 1) + i; uint8_t r = *pb; @@ -368,7 +391,18 @@ void VirtualMatrix::Frame(uint8_t*buffer, size_t size) { b = *(pb + 2); } - _image.SetRGB((i / 3) % _width, i / 3 / _width, r, g, b); + if (channelsPerPixel > 3) + { + uint8_t w = 0; + if (i + 3 < end) { + w = *(pb + 3); + } + if (w != 0) + { + r = g = b = w; + } + } + _image.SetRGB((i / channelsPerPixel) % _width, i / channelsPerPixel / _width, r, g, b); } if (_rotation == VMROTATION::VM_NORMAL) @@ -454,3 +488,8 @@ long VirtualMatrix::GetStartChannelAsNumber() const { return _outputManager->DecodeStartChannel(_startChannel); } + +int VirtualMatrix::GetPixelChannelsCount() const +{ + return (_pixelChannels == VMPIXELCHANNELS::RGBW) ? 4 : 3; +} diff --git a/xSchedule/VirtualMatrix.h b/xSchedule/VirtualMatrix.h index f608e362be..8e6d59a510 100644 --- a/xSchedule/VirtualMatrix.h +++ b/xSchedule/VirtualMatrix.h @@ -19,6 +19,7 @@ class OutputManager; class ScheduleOptions; typedef enum {VM_NORMAL, VM_90, VM_270, VM_FLIP_HORIZONTAL, VM_FLIP_VERTICAL } VMROTATION; +typedef enum {RGB, RGBW } VMPIXELCHANNELS; class VirtualMatrix { @@ -34,6 +35,7 @@ class VirtualMatrix wxSize _size; wxPoint _location; VMROTATION _rotation; + VMPIXELCHANNELS _pixelChannels; std::string _startChannel; wxImage _image; wxImageResizeQuality _quality; @@ -45,12 +47,14 @@ class VirtualMatrix static VMROTATION EncodeRotation(const std::string rotation); static std::string DecodeRotation(VMROTATION rotation); + static VMPIXELCHANNELS EncodePixelChannels(const std::string pixelChannels); + static std::string DecodePixelChannels(VMPIXELCHANNELS pixelChannels); static wxImageResizeQuality EncodeScalingQuality(const std::string quality, int& swsQuality); static std::string DecodeScalingQuality(wxImageResizeQuality quality, int swsQuality); VirtualMatrix(OutputManager* outputManager, wxXmlNode* n); - VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, VMROTATION rotation, wxImageResizeQuality quality, int swsQuality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier); - VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, const std::string& rotation, const std::string& quality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier); + VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, VMROTATION rotation, VMPIXELCHANNELS pixelChannels, wxImageResizeQuality quality, int swsQuality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier); + VirtualMatrix(OutputManager* outputManager, int width, int height, bool topMost, const std::string& rotation, const std::string& pixelChannels, const std::string& quality, const std::string& startChannel, const std::string& name, wxSize size, wxPoint loc, bool useMatrixSize, int matrixMultiplier); VirtualMatrix(OutputManager* outputManager, ScheduleOptions* options); virtual ~VirtualMatrix() {} void Frame(uint8_t*buffer, size_t size); @@ -60,7 +64,8 @@ class VirtualMatrix void Suppress(bool suppress); std::string GetStartChannel() const { return _startChannel; } long GetStartChannelAsNumber() const; - size_t GetChannels() const { return _width * _height * 3; } + int GetPixelChannelsCount() const; + size_t GetChannels() const { return _width * _height * GetPixelChannelsCount(); } void SetStartChannel(const std::string& startChannel) { if (startChannel != _startChannel) { _startChannel = startChannel; _changeCount++; } } std::string GetName() const { return _name; } void SetName(const std::string& name) { if (name != _name) { _name = name; _changeCount++; } } @@ -72,6 +77,7 @@ class VirtualMatrix bool GetUseMatrixSize() const { return _useMatrixSize; } int GetMatrixMultiplier() const { return _matrixMultiplier; } std::string GetRotation() const { return DecodeRotation(_rotation); } + std::string GetPixelChannels() const { return DecodePixelChannels(_pixelChannels); } std::string GetScalingQuality() const { return DecodeScalingQuality(_quality, _swsQuality); } bool IsDirty() const { return _lastSavedChangeCount != _changeCount; } void ClearDirty() { _lastSavedChangeCount = _changeCount; } diff --git a/xSchedule/VirtualMatrixDialog.cpp b/xSchedule/VirtualMatrixDialog.cpp index c471b9876c..f9dcf5cdc8 100644 --- a/xSchedule/VirtualMatrixDialog.cpp +++ b/xSchedule/VirtualMatrixDialog.cpp @@ -28,6 +28,8 @@ const long VirtualMatrixDialog::ID_STATICTEXT1 = wxNewId(); const long VirtualMatrixDialog::ID_SPINCTRL1 = wxNewId(); const long VirtualMatrixDialog::ID_STATICTEXT4 = wxNewId(); const long VirtualMatrixDialog::ID_SPINCTRL2 = wxNewId(); +const long VirtualMatrixDialog::ID_STATICTEXT9 = wxNewId(); +const long VirtualMatrixDialog::ID_CHOICE4 = wxNewId(); const long VirtualMatrixDialog::ID_STATICTEXT2 = wxNewId(); const long VirtualMatrixDialog::ID_CHOICE1 = wxNewId(); const long VirtualMatrixDialog::ID_STATICTEXT5 = wxNewId(); @@ -46,8 +48,8 @@ BEGIN_EVENT_TABLE(VirtualMatrixDialog,wxDialog) //*) END_EVENT_TABLE() -VirtualMatrixDialog::VirtualMatrixDialog(wxWindow* parent, OutputManager* outputManager, std::string& name, std::string& rotation, std::string& quality, wxSize& vmsize, wxPoint& vmlocation, int& width, int& height, bool& topMost, std::string& startChannel, bool& useMatrixSize, int& matrixMultiplier, ScheduleOptions* options, wxWindowID id, const wxPoint& pos, const wxSize& size) : - _name(name), _width(width), _height(height), _topMost(topMost), _useMatrixSize(useMatrixSize), _matrixMultiplier(matrixMultiplier), _startChannel(startChannel), _size(vmsize), _location(vmlocation), _rotation(rotation), _quality(quality) +VirtualMatrixDialog::VirtualMatrixDialog(wxWindow* parent, OutputManager* outputManager, std::string& name, std::string& rotation, std::string& pixelChannels, std::string& quality, wxSize& vmsize, wxPoint& vmlocation, int& width, int& height, bool& topMost, std::string& startChannel, bool& useMatrixSize, int& matrixMultiplier, ScheduleOptions* options, wxWindowID id, const wxPoint& pos, const wxSize& size) : + _name(name), _width(width), _height(height), _topMost(topMost), _useMatrixSize(useMatrixSize), _matrixMultiplier(matrixMultiplier), _startChannel(startChannel), _size(vmsize), _location(vmlocation), _rotation(rotation), _pixelChannels(pixelChannels), _quality(quality) { _outputManager = outputManager; _tempSize = _size; @@ -78,6 +80,12 @@ VirtualMatrixDialog::VirtualMatrixDialog(wxWindow* parent, OutputManager* output SpinCtrl_Width = new wxSpinCtrl(this, ID_SPINCTRL2, _T("32"), wxDefaultPosition, wxDefaultSize, 0, 1, 5000, 32, _T("ID_SPINCTRL2")); SpinCtrl_Width->SetValue(_T("32")); FlexGridSizer1->Add(SpinCtrl_Width, 1, wxALL|wxEXPAND, 5); + StaticText9 = new wxStaticText(this, ID_STATICTEXT9, _("Pixel channels:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT9")); + FlexGridSizer1->Add(StaticText9, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + Choice_PixelChannels = new wxChoice(this, ID_CHOICE4, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE4")); + Choice_PixelChannels->SetSelection( Choice_PixelChannels->Append(_("RGB")) ); + Choice_PixelChannels->Append(_("RGBW")); + FlexGridSizer1->Add(Choice_PixelChannels, 1, wxALL|wxEXPAND, 5); StaticText2 = new wxStaticText(this, ID_STATICTEXT2, _("Rotation:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2")); FlexGridSizer1->Add(StaticText2, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); Choice_Rotation = new wxChoice(this, ID_CHOICE1, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1")); @@ -146,6 +154,7 @@ VirtualMatrixDialog::VirtualMatrixDialog(wxWindow* parent, OutputManager* output TextCtrl_Name->SetValue(_name); Choice_Rotation->SetStringSelection(_rotation); + Choice_PixelChannels->SetStringSelection(_pixelChannels); Choice_Quality->SetStringSelection(_quality); TextCtrl_StartChannel->SetValue(_startChannel); SpinCtrl_Width->SetValue(_width); @@ -163,6 +172,7 @@ void VirtualMatrixDialog::OnButton_OkClick(wxCommandEvent& event) { _name = TextCtrl_Name->GetValue().ToStdString(); _rotation = Choice_Rotation->GetStringSelection().ToStdString(); + _pixelChannels = Choice_PixelChannels->GetStringSelection().ToStdString(); _quality = Choice_Quality->GetStringSelection().ToStdString(); _startChannel = TextCtrl_StartChannel->GetValue().ToStdString(); _width = SpinCtrl_Width->GetValue(); diff --git a/xSchedule/VirtualMatrixDialog.h b/xSchedule/VirtualMatrixDialog.h index e4b5cf93f5..b64e01014d 100644 --- a/xSchedule/VirtualMatrixDialog.h +++ b/xSchedule/VirtualMatrixDialog.h @@ -36,6 +36,7 @@ class VirtualMatrixDialog : public wxDialog wxSize& _size; wxPoint& _location; std::string& _rotation; + std::string& _pixelChannels; std::string& _quality; OutputManager* _outputManager; wxSize _tempSize; @@ -44,7 +45,7 @@ class VirtualMatrixDialog : public wxDialog public: - VirtualMatrixDialog(wxWindow* parent, OutputManager* outputManager, std::string& name, std::string& rotation, std::string& quality, wxSize& vmsize, wxPoint& vmlocation, int& width, int& height, bool& topMost, std::string& _startChannel, bool& useMatrixSize, int& matrixMultiplier, ScheduleOptions* options, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + VirtualMatrixDialog(wxWindow* parent, OutputManager* outputManager, std::string& name, std::string& rotation, std::string& pixelChannels, std::string& quality, wxSize& vmsize, wxPoint& vmlocation, int& width, int& height, bool& topMost, std::string& _startChannel, bool& useMatrixSize, int& matrixMultiplier, ScheduleOptions* options, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); virtual ~VirtualMatrixDialog(); //(*Declarations(VirtualMatrixDialog) @@ -52,6 +53,7 @@ class VirtualMatrixDialog : public wxDialog wxButton* Button_Ok; wxButton* Button_Position; wxCheckBox* CheckBox_Topmost; + wxChoice* Choice_PixelChannels; wxChoice* Choice_Quality; wxChoice* Choice_Rotation; wxSpinCtrl* SpinCtrl_Height; @@ -63,6 +65,7 @@ class VirtualMatrixDialog : public wxDialog wxStaticText* StaticText5; wxStaticText* StaticText6; wxStaticText* StaticText7; + wxStaticText* StaticText9; wxTextCtrl* TextCtrl_Name; wxTextCtrl* TextCtrl_StartChannel; //*) @@ -76,6 +79,8 @@ class VirtualMatrixDialog : public wxDialog static const long ID_SPINCTRL1; static const long ID_STATICTEXT4; static const long ID_SPINCTRL2; + static const long ID_STATICTEXT9; + static const long ID_CHOICE4; static const long ID_STATICTEXT2; static const long ID_CHOICE1; static const long ID_STATICTEXT5; diff --git a/xSchedule/wxsmith/VirtualMatrixDialog.wxs b/xSchedule/wxsmith/VirtualMatrixDialog.wxs index 4ffdd5c916..72238c6751 100644 --- a/xSchedule/wxsmith/VirtualMatrixDialog.wxs +++ b/xSchedule/wxsmith/VirtualMatrixDialog.wxs @@ -57,6 +57,27 @@ 5 + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + RGB + RGBW + + 0 + + + wxALL|wxEXPAND + 5 + + diff --git a/xSchedule/xSchedule.cbp.mak b/xSchedule/xSchedule.cbp.mak index 26816683c7..deae7cd3f5 100644 --- a/xSchedule/xSchedule.cbp.mak +++ b/xSchedule/xSchedule.cbp.mak @@ -40,9 +40,9 @@ OBJDIR_LINUX_RELEASE = .objs_lr DEP_LINUX_RELEASE = OUT_LINUX_RELEASE = ../bin/xSchedule -OBJ_LINUX_DEBUG = $(OBJDIR_LINUX_DEBUG)/SetDialog.o $(OBJDIR_LINUX_DEBUG)/SustainDialog.o $(OBJDIR_LINUX_DEBUG)/SyncArtNet.o $(OBJDIR_LINUX_DEBUG)/SyncFPP.o $(OBJDIR_LINUX_DEBUG)/ScheduleOptions.o $(OBJDIR_LINUX_DEBUG)/SyncMIDI.o $(OBJDIR_LINUX_DEBUG)/SyncManager.o $(OBJDIR_LINUX_DEBUG)/SyncOSC.o $(OBJDIR_LINUX_DEBUG)/SyncSMPTE.o $(OBJDIR_LINUX_DEBUG)/PlayList/VideoWindowPositionDialog.o $(OBJDIR_LINUX_DEBUG)/PluginManager.o $(OBJDIR_LINUX_DEBUG)/RemapDialog.o $(OBJDIR_LINUX_DEBUG)/RemoteModeConfigDialog.o $(OBJDIR_LINUX_DEBUG)/ThreeToFourDialog.o $(OBJDIR_LINUX_DEBUG)/RunningSchedule.o $(OBJDIR_LINUX_DEBUG)/Schedule.o $(OBJDIR_LINUX_DEBUG)/ScheduleDialog.o $(OBJDIR_LINUX_DEBUG)/ScheduleManager.o $(OBJDIR_LINUX_DEBUG)/events/EventFPP.o $(OBJDIR_LINUX_DEBUG)/events/EventARTNetTrigger.o $(OBJDIR_LINUX_DEBUG)/events/EventBase.o $(OBJDIR_LINUX_DEBUG)/events/EventData.o $(OBJDIR_LINUX_DEBUG)/events/EventE131.o $(OBJDIR_LINUX_DEBUG)/events/EventFPPCommandPreset.o $(OBJDIR_LINUX_DEBUG)/events/EventLor.o $(OBJDIR_LINUX_DEBUG)/events/EventMIDI.o $(OBJDIR_LINUX_DEBUG)/events/EventMQTT.o $(OBJDIR_LINUX_DEBUG)/UserButton.o $(OBJDIR_LINUX_DEBUG)/VideoCache.o $(OBJDIR_LINUX_DEBUG)/VirtualMatricesDialog.o $(OBJDIR_LINUX_DEBUG)/VirtualMatrix.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayerWindow.o $(OBJDIR_LINUX_DEBUG)/VirtualMatrixDialog.o $(OBJDIR_LINUX_DEBUG)/WebServer.o $(OBJDIR_LINUX_DEBUG)/Xyzzy.o $(OBJDIR_LINUX_DEBUG)/events/EventARTNet.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRDSPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemPluginPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemProjector.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemProjectorPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRDS.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunCommand.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunCommandPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunProcess.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunProcessPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDIPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMQTT.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMQTTPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophone.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophonePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemOSC.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemOSCPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemPlugin.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemTextPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemVideo.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemVideoPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemText.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListSimpleDialog.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListStep.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListStepPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayerFrame.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSetColour.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemScreenMap.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemScreenMapPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSerial.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSerialPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSetColourPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemTest.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemTestPanel.o $(OBJDIR_LINUX_DEBUG)/xScheduleApp.o $(OBJDIR_LINUX_DEBUG)/xScheduleMain.o $(OBJDIR_LINUX_DEBUG)/events/ListenerLor.o $(OBJDIR_LINUX_DEBUG)/events/ListenerMIDI.o $(OBJDIR_LINUX_DEBUG)/events/ListenerMQTT.o $(OBJDIR_LINUX_DEBUG)/events/ListenerManager.o $(OBJDIR_LINUX_DEBUG)/events/ListenerFPP.o $(OBJDIR_LINUX_DEBUG)/events/ListenerOSC.o $(OBJDIR_LINUX_DEBUG)/events/ListenerSMPTE.o $(OBJDIR_LINUX_DEBUG)/events/ListenerSerial.o $(OBJDIR_LINUX_DEBUG)/md5.o $(OBJDIR_LINUX_DEBUG)/events/ListenerARTNet.o $(OBJDIR_LINUX_DEBUG)/events/EventOSC.o $(OBJDIR_LINUX_DEBUG)/events/EventPing.o $(OBJDIR_LINUX_DEBUG)/events/EventSerial.o $(OBJDIR_LINUX_DEBUG)/events/EventState.o $(OBJDIR_LINUX_DEBUG)/events/ListenerBase.o $(OBJDIR_LINUX_DEBUG)/events/ListenerCSVFPP.o $(OBJDIR_LINUX_DEBUG)/events/ListenerE131.o $(OBJDIR_LINUX_DEBUG)/wxMIDI/src/wxMidi.o $(OBJDIR_LINUX_DEBUG)/wxMIDI/src/wxMidiDatabase.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/connection.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/context.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/message.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/pages.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/request.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/response.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/server.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/sha1.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDI.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/status.o $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonreader.o $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonval.o $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonwriter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/Files.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_DEBUG)/City.o $(OBJDIR_LINUX_DEBUG)/ColourOrderDialog.o $(OBJDIR_LINUX_DEBUG)/CommandManager.o $(OBJDIR_LINUX_DEBUG)/ConfigureMIDITimecodeDialog.o $(OBJDIR_LINUX_DEBUG)/ButtonDetailsDialog.o $(OBJDIR_LINUX_DEBUG)/ConfigureOSC.o $(OBJDIR_LINUX_DEBUG)/ConfigureTest.o $(OBJDIR_LINUX_DEBUG)/DeadChannelDialog.o $(OBJDIR_LINUX_DEBUG)/DimDialog.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsTimer.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_DEBUG)/AddReverseDialog.o $(OBJDIR_LINUX_DEBUG)/BackgroundPlaylistDialog.o $(OBJDIR_LINUX_DEBUG)/Blend.o $(OBJDIR_LINUX_DEBUG)/__/xLights/VideoReader.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_DEBUG)/__/xLights/effects/GIFImage.o $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Controller.o $(OBJDIR_LINUX_DEBUG)/__/xLights/AudioManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Discovery.o $(OBJDIR_LINUX_DEBUG)/__/xLights/FSEQFile.o $(OBJDIR_LINUX_DEBUG)/__/xLights/JobPool.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Parallel.o $(OBJDIR_LINUX_DEBUG)/__/xLights/SequenceData.o $(OBJDIR_LINUX_DEBUG)/__/xLights/TraceLog.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrgan.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAudio.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAudioPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemCURL.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemCURLPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrganPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDelay.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDelayPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDim.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItem.o $(OBJDIR_LINUX_DEBUG)/OutputProcessingDialog.o $(OBJDIR_LINUX_DEBUG)/Pinger.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayList.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListDialog.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemARTNetTrigger.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemARTNetTriggerPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOff.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOffPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFade.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFadePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFile.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFilePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideoPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemImage.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemImagePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemJukebox.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemJukeboxPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEventPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDimPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemESEQ.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemESEQPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEvent.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQ.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideo.o $(OBJDIR_LINUX_DEBUG)/EventLorPanel.o $(OBJDIR_LINUX_DEBUG)/EventMIDIPanel.o $(OBJDIR_LINUX_DEBUG)/EventMQTTPanel.o $(OBJDIR_LINUX_DEBUG)/EventOSCPanel.o $(OBJDIR_LINUX_DEBUG)/EventFPPCommandPresetPanel.o $(OBJDIR_LINUX_DEBUG)/EventPingPanel.o $(OBJDIR_LINUX_DEBUG)/EventSerialPanel.o $(OBJDIR_LINUX_DEBUG)/EventStatePanel.o $(OBJDIR_LINUX_DEBUG)/EventsDialog.o $(OBJDIR_LINUX_DEBUG)/EventDataPanel.o $(OBJDIR_LINUX_DEBUG)/DimWhiteDialog.o $(OBJDIR_LINUX_DEBUG)/ESEQFile.o $(OBJDIR_LINUX_DEBUG)/EventARTNetPanel.o $(OBJDIR_LINUX_DEBUG)/EventARTNetTriggerPanel.o $(OBJDIR_LINUX_DEBUG)/ExcludeDimDialog.o $(OBJDIR_LINUX_DEBUG)/EventDialog.o $(OBJDIR_LINUX_DEBUG)/EventE131Panel.o $(OBJDIR_LINUX_DEBUG)/EventFPPPanel.o $(OBJDIR_LINUX_DEBUG)/OutputProcessExcludeDim.o $(OBJDIR_LINUX_DEBUG)/OptionsDialog.o $(OBJDIR_LINUX_DEBUG)/OutputProcess.o $(OBJDIR_LINUX_DEBUG)/OutputProcessColourOrder.o $(OBJDIR_LINUX_DEBUG)/OutputProcessDeadChannel.o $(OBJDIR_LINUX_DEBUG)/OutputProcessDim.o $(OBJDIR_LINUX_DEBUG)/OutputProcessDimWhite.o $(OBJDIR_LINUX_DEBUG)/OutputProcessGamma.o $(OBJDIR_LINUX_DEBUG)/OutputProcessRemap.o $(OBJDIR_LINUX_DEBUG)/OutputProcessReverse.o $(OBJDIR_LINUX_DEBUG)/OutputProcessSet.o $(OBJDIR_LINUX_DEBUG)/OutputProcessSustain.o $(OBJDIR_LINUX_DEBUG)/OutputProcessThreeToFour.o $(OBJDIR_LINUX_DEBUG)/ExtraIPDialog.o $(OBJDIR_LINUX_DEBUG)/ExtraIPsDialog.o $(OBJDIR_LINUX_DEBUG)/FPPRemotesDialog.o $(OBJDIR_LINUX_DEBUG)/GammaDialog.o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o $(OBJDIR_LINUX_DEBUG)/MatricesDialog.o $(OBJDIR_LINUX_DEBUG)/MatrixDialog.o $(OBJDIR_LINUX_DEBUG)/MatrixMapper.o $(OBJDIR_LINUX_DEBUG)/OSCPacket.o +OBJ_LINUX_DEBUG = $(OBJDIR_LINUX_DEBUG)/SetDialog.o $(OBJDIR_LINUX_DEBUG)/SustainDialog.o $(OBJDIR_LINUX_DEBUG)/SyncArtNet.o $(OBJDIR_LINUX_DEBUG)/SyncFPP.o $(OBJDIR_LINUX_DEBUG)/ScheduleOptions.o $(OBJDIR_LINUX_DEBUG)/SyncMIDI.o $(OBJDIR_LINUX_DEBUG)/SyncManager.o $(OBJDIR_LINUX_DEBUG)/SyncOSC.o $(OBJDIR_LINUX_DEBUG)/SyncSMPTE.o $(OBJDIR_LINUX_DEBUG)/PlayList/VideoWindowPositionDialog.o $(OBJDIR_LINUX_DEBUG)/PluginManager.o $(OBJDIR_LINUX_DEBUG)/RemapDialog.o $(OBJDIR_LINUX_DEBUG)/RemoteModeConfigDialog.o $(OBJDIR_LINUX_DEBUG)/ThreeToFourDialog.o $(OBJDIR_LINUX_DEBUG)/RunningSchedule.o $(OBJDIR_LINUX_DEBUG)/Schedule.o $(OBJDIR_LINUX_DEBUG)/ScheduleDialog.o $(OBJDIR_LINUX_DEBUG)/ScheduleManager.o $(OBJDIR_LINUX_DEBUG)/events/EventFPP.o $(OBJDIR_LINUX_DEBUG)/events/EventARTNetTrigger.o $(OBJDIR_LINUX_DEBUG)/events/EventBase.o $(OBJDIR_LINUX_DEBUG)/events/EventData.o $(OBJDIR_LINUX_DEBUG)/events/EventE131.o $(OBJDIR_LINUX_DEBUG)/events/EventFPPCommandPreset.o $(OBJDIR_LINUX_DEBUG)/events/EventLor.o $(OBJDIR_LINUX_DEBUG)/events/EventMIDI.o $(OBJDIR_LINUX_DEBUG)/events/EventMQTT.o $(OBJDIR_LINUX_DEBUG)/UserButton.o $(OBJDIR_LINUX_DEBUG)/VideoCache.o $(OBJDIR_LINUX_DEBUG)/VirtualMatricesDialog.o $(OBJDIR_LINUX_DEBUG)/VirtualMatrix.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayerWindow.o $(OBJDIR_LINUX_DEBUG)/VirtualMatrixDialog.o $(OBJDIR_LINUX_DEBUG)/WebServer.o $(OBJDIR_LINUX_DEBUG)/Xyzzy.o $(OBJDIR_LINUX_DEBUG)/events/EventARTNet.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRDSPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemPluginPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemProjector.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemProjectorPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRDS.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunCommand.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunCommandPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunProcess.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunProcessPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophone.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDI.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDIPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMQTT.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMQTTPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophonePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemOSC.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemOSCPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemPlugin.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemTextPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemVideo.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemVideoPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemText.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListSimpleDialog.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListStep.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListStepPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayerFrame.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSetColour.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemScreenMap.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemScreenMapPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSerial.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSerialPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemSetColourPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemTest.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemTestPanel.o $(OBJDIR_LINUX_DEBUG)/xScheduleApp.o $(OBJDIR_LINUX_DEBUG)/xScheduleMain.o $(OBJDIR_LINUX_DEBUG)/events/ListenerLor.o $(OBJDIR_LINUX_DEBUG)/events/ListenerMIDI.o $(OBJDIR_LINUX_DEBUG)/events/ListenerMQTT.o $(OBJDIR_LINUX_DEBUG)/events/ListenerManager.o $(OBJDIR_LINUX_DEBUG)/events/ListenerFPP.o $(OBJDIR_LINUX_DEBUG)/events/ListenerOSC.o $(OBJDIR_LINUX_DEBUG)/events/ListenerSMPTE.o $(OBJDIR_LINUX_DEBUG)/events/ListenerSerial.o $(OBJDIR_LINUX_DEBUG)/md5.o $(OBJDIR_LINUX_DEBUG)/events/ListenerARTNet.o $(OBJDIR_LINUX_DEBUG)/events/EventOSC.o $(OBJDIR_LINUX_DEBUG)/events/EventPing.o $(OBJDIR_LINUX_DEBUG)/events/EventSerial.o $(OBJDIR_LINUX_DEBUG)/events/EventState.o $(OBJDIR_LINUX_DEBUG)/events/ListenerBase.o $(OBJDIR_LINUX_DEBUG)/events/ListenerCSVFPP.o $(OBJDIR_LINUX_DEBUG)/events/ListenerE131.o $(OBJDIR_LINUX_DEBUG)/wxMIDI/src/wxMidi.o $(OBJDIR_LINUX_DEBUG)/wxMIDI/src/wxMidiDatabase.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/connection.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/context.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/message.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/pages.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/request.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/response.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/server.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/sha1.o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/status.o $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonreader.o $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonval.o $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonwriter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/CurlManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_DEBUG)/ConfigureMIDITimecodeDialog.o $(OBJDIR_LINUX_DEBUG)/ButtonDetailsDialog.o $(OBJDIR_LINUX_DEBUG)/City.o $(OBJDIR_LINUX_DEBUG)/ColourOrderDialog.o $(OBJDIR_LINUX_DEBUG)/CommandManager.o $(OBJDIR_LINUX_DEBUG)/ConfigureOSC.o $(OBJDIR_LINUX_DEBUG)/ConfigureTest.o $(OBJDIR_LINUX_DEBUG)/DeadChannelDialog.o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsTimer.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/Files.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_DEBUG)/AddReverseDialog.o $(OBJDIR_LINUX_DEBUG)/BackgroundPlaylistDialog.o $(OBJDIR_LINUX_DEBUG)/Blend.o $(OBJDIR_LINUX_DEBUG)/__/xLights/effects/GIFImage.o $(OBJDIR_LINUX_DEBUG)/__/xLights/VideoReader.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Controller.o $(OBJDIR_LINUX_DEBUG)/__/xLights/AudioManager.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Discovery.o $(OBJDIR_LINUX_DEBUG)/__/xLights/FSEQFile.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_DEBUG)/__/xLights/JobPool.o $(OBJDIR_LINUX_DEBUG)/__/xLights/Parallel.o $(OBJDIR_LINUX_DEBUG)/__/xLights/SequenceData.o $(OBJDIR_LINUX_DEBUG)/__/xLights/TraceLog.o $(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_DEBUG)/DimDialog.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAudio.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAudioPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemCURL.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemCURLPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOffPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrgan.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrganPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDelay.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDelayPanel.o $(OBJDIR_LINUX_DEBUG)/OutputProcessingDialog.o $(OBJDIR_LINUX_DEBUG)/Pinger.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayList.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListDialog.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDim.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItem.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemARTNetTrigger.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemARTNetTriggerPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOff.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFilePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideoPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFade.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFadePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFile.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemImage.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemImagePanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemJukebox.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemJukeboxPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDimPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemESEQ.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemESEQPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEvent.o $(OBJDIR_LINUX_DEBUG)/OutputProcessThreeToFour.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEventPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQ.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideo.o $(OBJDIR_LINUX_DEBUG)/EventOSCPanel.o $(OBJDIR_LINUX_DEBUG)/EventFPPCommandPresetPanel.o $(OBJDIR_LINUX_DEBUG)/EventLorPanel.o $(OBJDIR_LINUX_DEBUG)/EventMIDIPanel.o $(OBJDIR_LINUX_DEBUG)/EventMQTTPanel.o $(OBJDIR_LINUX_DEBUG)/EventPingPanel.o $(OBJDIR_LINUX_DEBUG)/EventSerialPanel.o $(OBJDIR_LINUX_DEBUG)/EventStatePanel.o $(OBJDIR_LINUX_DEBUG)/EventsDialog.o $(OBJDIR_LINUX_DEBUG)/DimWhiteDialog.o $(OBJDIR_LINUX_DEBUG)/ESEQFile.o $(OBJDIR_LINUX_DEBUG)/EventARTNetPanel.o $(OBJDIR_LINUX_DEBUG)/EventARTNetTriggerPanel.o $(OBJDIR_LINUX_DEBUG)/EventDataPanel.o $(OBJDIR_LINUX_DEBUG)/EventDialog.o $(OBJDIR_LINUX_DEBUG)/EventE131Panel.o $(OBJDIR_LINUX_DEBUG)/EventFPPPanel.o $(OBJDIR_LINUX_DEBUG)/OutputProcessDimWhite.o $(OBJDIR_LINUX_DEBUG)/OptionsDialog.o $(OBJDIR_LINUX_DEBUG)/OutputProcess.o $(OBJDIR_LINUX_DEBUG)/OutputProcessColourOrder.o $(OBJDIR_LINUX_DEBUG)/OutputProcessDeadChannel.o $(OBJDIR_LINUX_DEBUG)/OutputProcessDim.o $(OBJDIR_LINUX_DEBUG)/OSCPacket.o $(OBJDIR_LINUX_DEBUG)/OutputProcessExcludeDim.o $(OBJDIR_LINUX_DEBUG)/OutputProcessGamma.o $(OBJDIR_LINUX_DEBUG)/OutputProcessRemap.o $(OBJDIR_LINUX_DEBUG)/OutputProcessReverse.o $(OBJDIR_LINUX_DEBUG)/OutputProcessSet.o $(OBJDIR_LINUX_DEBUG)/OutputProcessSustain.o $(OBJDIR_LINUX_DEBUG)/GammaDialog.o $(OBJDIR_LINUX_DEBUG)/ExcludeDimDialog.o $(OBJDIR_LINUX_DEBUG)/ExtraIPDialog.o $(OBJDIR_LINUX_DEBUG)/ExtraIPsDialog.o $(OBJDIR_LINUX_DEBUG)/FPPRemotesDialog.o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o $(OBJDIR_LINUX_DEBUG)/MatricesDialog.o $(OBJDIR_LINUX_DEBUG)/MatrixDialog.o $(OBJDIR_LINUX_DEBUG)/MatrixMapper.o -OBJ_LINUX_RELEASE = $(OBJDIR_LINUX_RELEASE)/SetDialog.o $(OBJDIR_LINUX_RELEASE)/SustainDialog.o $(OBJDIR_LINUX_RELEASE)/SyncArtNet.o $(OBJDIR_LINUX_RELEASE)/SyncFPP.o $(OBJDIR_LINUX_RELEASE)/ScheduleOptions.o $(OBJDIR_LINUX_RELEASE)/SyncMIDI.o $(OBJDIR_LINUX_RELEASE)/SyncManager.o $(OBJDIR_LINUX_RELEASE)/SyncOSC.o $(OBJDIR_LINUX_RELEASE)/SyncSMPTE.o $(OBJDIR_LINUX_RELEASE)/PlayList/VideoWindowPositionDialog.o $(OBJDIR_LINUX_RELEASE)/PluginManager.o $(OBJDIR_LINUX_RELEASE)/RemapDialog.o $(OBJDIR_LINUX_RELEASE)/RemoteModeConfigDialog.o $(OBJDIR_LINUX_RELEASE)/ThreeToFourDialog.o $(OBJDIR_LINUX_RELEASE)/RunningSchedule.o $(OBJDIR_LINUX_RELEASE)/Schedule.o $(OBJDIR_LINUX_RELEASE)/ScheduleDialog.o $(OBJDIR_LINUX_RELEASE)/ScheduleManager.o $(OBJDIR_LINUX_RELEASE)/events/EventFPP.o $(OBJDIR_LINUX_RELEASE)/events/EventARTNetTrigger.o $(OBJDIR_LINUX_RELEASE)/events/EventBase.o $(OBJDIR_LINUX_RELEASE)/events/EventData.o $(OBJDIR_LINUX_RELEASE)/events/EventE131.o $(OBJDIR_LINUX_RELEASE)/events/EventFPPCommandPreset.o $(OBJDIR_LINUX_RELEASE)/events/EventLor.o $(OBJDIR_LINUX_RELEASE)/events/EventMIDI.o $(OBJDIR_LINUX_RELEASE)/events/EventMQTT.o $(OBJDIR_LINUX_RELEASE)/UserButton.o $(OBJDIR_LINUX_RELEASE)/VideoCache.o $(OBJDIR_LINUX_RELEASE)/VirtualMatricesDialog.o $(OBJDIR_LINUX_RELEASE)/VirtualMatrix.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayerWindow.o $(OBJDIR_LINUX_RELEASE)/VirtualMatrixDialog.o $(OBJDIR_LINUX_RELEASE)/WebServer.o $(OBJDIR_LINUX_RELEASE)/Xyzzy.o $(OBJDIR_LINUX_RELEASE)/events/EventARTNet.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRDSPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemPluginPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemProjector.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemProjectorPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRDS.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunCommand.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunCommandPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunProcess.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunProcessPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDIPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMQTT.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMQTTPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophone.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophonePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemOSC.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemOSCPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemPlugin.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemTextPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemVideo.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemVideoPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemText.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListSimpleDialog.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListStep.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListStepPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayerFrame.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSetColour.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemScreenMap.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemScreenMapPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSerial.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSerialPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSetColourPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemTest.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemTestPanel.o $(OBJDIR_LINUX_RELEASE)/xScheduleApp.o $(OBJDIR_LINUX_RELEASE)/xScheduleMain.o $(OBJDIR_LINUX_RELEASE)/events/ListenerLor.o $(OBJDIR_LINUX_RELEASE)/events/ListenerMIDI.o $(OBJDIR_LINUX_RELEASE)/events/ListenerMQTT.o $(OBJDIR_LINUX_RELEASE)/events/ListenerManager.o $(OBJDIR_LINUX_RELEASE)/events/ListenerFPP.o $(OBJDIR_LINUX_RELEASE)/events/ListenerOSC.o $(OBJDIR_LINUX_RELEASE)/events/ListenerSMPTE.o $(OBJDIR_LINUX_RELEASE)/events/ListenerSerial.o $(OBJDIR_LINUX_RELEASE)/md5.o $(OBJDIR_LINUX_RELEASE)/events/ListenerARTNet.o $(OBJDIR_LINUX_RELEASE)/events/EventOSC.o $(OBJDIR_LINUX_RELEASE)/events/EventPing.o $(OBJDIR_LINUX_RELEASE)/events/EventSerial.o $(OBJDIR_LINUX_RELEASE)/events/EventState.o $(OBJDIR_LINUX_RELEASE)/events/ListenerBase.o $(OBJDIR_LINUX_RELEASE)/events/ListenerCSVFPP.o $(OBJDIR_LINUX_RELEASE)/events/ListenerE131.o $(OBJDIR_LINUX_RELEASE)/wxMIDI/src/wxMidi.o $(OBJDIR_LINUX_RELEASE)/wxMIDI/src/wxMidiDatabase.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/connection.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/context.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/message.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/pages.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/request.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/response.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/server.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/sha1.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDI.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/status.o $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonreader.o $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonval.o $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonwriter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/Files.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_RELEASE)/City.o $(OBJDIR_LINUX_RELEASE)/ColourOrderDialog.o $(OBJDIR_LINUX_RELEASE)/CommandManager.o $(OBJDIR_LINUX_RELEASE)/ConfigureMIDITimecodeDialog.o $(OBJDIR_LINUX_RELEASE)/ButtonDetailsDialog.o $(OBJDIR_LINUX_RELEASE)/ConfigureOSC.o $(OBJDIR_LINUX_RELEASE)/ConfigureTest.o $(OBJDIR_LINUX_RELEASE)/DeadChannelDialog.o $(OBJDIR_LINUX_RELEASE)/DimDialog.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsTimer.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_RELEASE)/AddReverseDialog.o $(OBJDIR_LINUX_RELEASE)/BackgroundPlaylistDialog.o $(OBJDIR_LINUX_RELEASE)/Blend.o $(OBJDIR_LINUX_RELEASE)/__/xLights/VideoReader.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_RELEASE)/__/xLights/effects/GIFImage.o $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Controller.o $(OBJDIR_LINUX_RELEASE)/__/xLights/AudioManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Discovery.o $(OBJDIR_LINUX_RELEASE)/__/xLights/FSEQFile.o $(OBJDIR_LINUX_RELEASE)/__/xLights/JobPool.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Parallel.o $(OBJDIR_LINUX_RELEASE)/__/xLights/SequenceData.o $(OBJDIR_LINUX_RELEASE)/__/xLights/TraceLog.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrgan.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAudio.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAudioPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemCURL.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemCURLPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrganPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDelay.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDelayPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDim.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItem.o $(OBJDIR_LINUX_RELEASE)/OutputProcessingDialog.o $(OBJDIR_LINUX_RELEASE)/Pinger.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayList.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListDialog.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemARTNetTrigger.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemARTNetTriggerPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOff.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOffPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFade.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFadePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFile.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFilePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideoPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemImage.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemImagePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemJukebox.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemJukeboxPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEventPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDimPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemESEQ.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemESEQPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEvent.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQ.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideo.o $(OBJDIR_LINUX_RELEASE)/EventLorPanel.o $(OBJDIR_LINUX_RELEASE)/EventMIDIPanel.o $(OBJDIR_LINUX_RELEASE)/EventMQTTPanel.o $(OBJDIR_LINUX_RELEASE)/EventOSCPanel.o $(OBJDIR_LINUX_RELEASE)/EventFPPCommandPresetPanel.o $(OBJDIR_LINUX_RELEASE)/EventPingPanel.o $(OBJDIR_LINUX_RELEASE)/EventSerialPanel.o $(OBJDIR_LINUX_RELEASE)/EventStatePanel.o $(OBJDIR_LINUX_RELEASE)/EventsDialog.o $(OBJDIR_LINUX_RELEASE)/EventDataPanel.o $(OBJDIR_LINUX_RELEASE)/DimWhiteDialog.o $(OBJDIR_LINUX_RELEASE)/ESEQFile.o $(OBJDIR_LINUX_RELEASE)/EventARTNetPanel.o $(OBJDIR_LINUX_RELEASE)/EventARTNetTriggerPanel.o $(OBJDIR_LINUX_RELEASE)/ExcludeDimDialog.o $(OBJDIR_LINUX_RELEASE)/EventDialog.o $(OBJDIR_LINUX_RELEASE)/EventE131Panel.o $(OBJDIR_LINUX_RELEASE)/EventFPPPanel.o $(OBJDIR_LINUX_RELEASE)/OutputProcessExcludeDim.o $(OBJDIR_LINUX_RELEASE)/OptionsDialog.o $(OBJDIR_LINUX_RELEASE)/OutputProcess.o $(OBJDIR_LINUX_RELEASE)/OutputProcessColourOrder.o $(OBJDIR_LINUX_RELEASE)/OutputProcessDeadChannel.o $(OBJDIR_LINUX_RELEASE)/OutputProcessDim.o $(OBJDIR_LINUX_RELEASE)/OutputProcessDimWhite.o $(OBJDIR_LINUX_RELEASE)/OutputProcessGamma.o $(OBJDIR_LINUX_RELEASE)/OutputProcessRemap.o $(OBJDIR_LINUX_RELEASE)/OutputProcessReverse.o $(OBJDIR_LINUX_RELEASE)/OutputProcessSet.o $(OBJDIR_LINUX_RELEASE)/OutputProcessSustain.o $(OBJDIR_LINUX_RELEASE)/OutputProcessThreeToFour.o $(OBJDIR_LINUX_RELEASE)/ExtraIPDialog.o $(OBJDIR_LINUX_RELEASE)/ExtraIPsDialog.o $(OBJDIR_LINUX_RELEASE)/FPPRemotesDialog.o $(OBJDIR_LINUX_RELEASE)/GammaDialog.o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o $(OBJDIR_LINUX_RELEASE)/MatricesDialog.o $(OBJDIR_LINUX_RELEASE)/MatrixDialog.o $(OBJDIR_LINUX_RELEASE)/MatrixMapper.o $(OBJDIR_LINUX_RELEASE)/OSCPacket.o +OBJ_LINUX_RELEASE = $(OBJDIR_LINUX_RELEASE)/SetDialog.o $(OBJDIR_LINUX_RELEASE)/SustainDialog.o $(OBJDIR_LINUX_RELEASE)/SyncArtNet.o $(OBJDIR_LINUX_RELEASE)/SyncFPP.o $(OBJDIR_LINUX_RELEASE)/ScheduleOptions.o $(OBJDIR_LINUX_RELEASE)/SyncMIDI.o $(OBJDIR_LINUX_RELEASE)/SyncManager.o $(OBJDIR_LINUX_RELEASE)/SyncOSC.o $(OBJDIR_LINUX_RELEASE)/SyncSMPTE.o $(OBJDIR_LINUX_RELEASE)/PlayList/VideoWindowPositionDialog.o $(OBJDIR_LINUX_RELEASE)/PluginManager.o $(OBJDIR_LINUX_RELEASE)/RemapDialog.o $(OBJDIR_LINUX_RELEASE)/RemoteModeConfigDialog.o $(OBJDIR_LINUX_RELEASE)/ThreeToFourDialog.o $(OBJDIR_LINUX_RELEASE)/RunningSchedule.o $(OBJDIR_LINUX_RELEASE)/Schedule.o $(OBJDIR_LINUX_RELEASE)/ScheduleDialog.o $(OBJDIR_LINUX_RELEASE)/ScheduleManager.o $(OBJDIR_LINUX_RELEASE)/events/EventFPP.o $(OBJDIR_LINUX_RELEASE)/events/EventARTNetTrigger.o $(OBJDIR_LINUX_RELEASE)/events/EventBase.o $(OBJDIR_LINUX_RELEASE)/events/EventData.o $(OBJDIR_LINUX_RELEASE)/events/EventE131.o $(OBJDIR_LINUX_RELEASE)/events/EventFPPCommandPreset.o $(OBJDIR_LINUX_RELEASE)/events/EventLor.o $(OBJDIR_LINUX_RELEASE)/events/EventMIDI.o $(OBJDIR_LINUX_RELEASE)/events/EventMQTT.o $(OBJDIR_LINUX_RELEASE)/UserButton.o $(OBJDIR_LINUX_RELEASE)/VideoCache.o $(OBJDIR_LINUX_RELEASE)/VirtualMatricesDialog.o $(OBJDIR_LINUX_RELEASE)/VirtualMatrix.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayerWindow.o $(OBJDIR_LINUX_RELEASE)/VirtualMatrixDialog.o $(OBJDIR_LINUX_RELEASE)/WebServer.o $(OBJDIR_LINUX_RELEASE)/Xyzzy.o $(OBJDIR_LINUX_RELEASE)/events/EventARTNet.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRDSPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemPluginPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemProjector.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemProjectorPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRDS.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunCommand.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunCommandPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunProcess.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunProcessPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophone.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDI.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDIPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMQTT.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMQTTPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophonePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemOSC.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemOSCPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemPlugin.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemTextPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemVideo.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemVideoPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemText.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListSimpleDialog.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListStep.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListStepPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayerFrame.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSetColour.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemScreenMap.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemScreenMapPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSerial.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSerialPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemSetColourPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemTest.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemTestPanel.o $(OBJDIR_LINUX_RELEASE)/xScheduleApp.o $(OBJDIR_LINUX_RELEASE)/xScheduleMain.o $(OBJDIR_LINUX_RELEASE)/events/ListenerLor.o $(OBJDIR_LINUX_RELEASE)/events/ListenerMIDI.o $(OBJDIR_LINUX_RELEASE)/events/ListenerMQTT.o $(OBJDIR_LINUX_RELEASE)/events/ListenerManager.o $(OBJDIR_LINUX_RELEASE)/events/ListenerFPP.o $(OBJDIR_LINUX_RELEASE)/events/ListenerOSC.o $(OBJDIR_LINUX_RELEASE)/events/ListenerSMPTE.o $(OBJDIR_LINUX_RELEASE)/events/ListenerSerial.o $(OBJDIR_LINUX_RELEASE)/md5.o $(OBJDIR_LINUX_RELEASE)/events/ListenerARTNet.o $(OBJDIR_LINUX_RELEASE)/events/EventOSC.o $(OBJDIR_LINUX_RELEASE)/events/EventPing.o $(OBJDIR_LINUX_RELEASE)/events/EventSerial.o $(OBJDIR_LINUX_RELEASE)/events/EventState.o $(OBJDIR_LINUX_RELEASE)/events/ListenerBase.o $(OBJDIR_LINUX_RELEASE)/events/ListenerCSVFPP.o $(OBJDIR_LINUX_RELEASE)/events/ListenerE131.o $(OBJDIR_LINUX_RELEASE)/wxMIDI/src/wxMidi.o $(OBJDIR_LINUX_RELEASE)/wxMIDI/src/wxMidiDatabase.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/connection.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/context.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/message.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/pages.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/request.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/response.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/server.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/sha1.o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/status.o $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonreader.o $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonval.o $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonwriter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ZCPPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/serial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/CurlManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/string_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenDMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenPixelNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OutputManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/SerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TestPreset.o $(OBJDIR_LINUX_RELEASE)/ConfigureMIDITimecodeDialog.o $(OBJDIR_LINUX_RELEASE)/ButtonDetailsDialog.o $(OBJDIR_LINUX_RELEASE)/City.o $(OBJDIR_LINUX_RELEASE)/ColourOrderDialog.o $(OBJDIR_LINUX_RELEASE)/CommandManager.o $(OBJDIR_LINUX_RELEASE)/ConfigureOSC.o $(OBJDIR_LINUX_RELEASE)/ConfigureTest.o $(OBJDIR_LINUX_RELEASE)/DeadChannelDialog.o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsTimer.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/Files.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginChannelAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginHostAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginInputDomainAdapter.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginLoader.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginWrapper.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/RealTime.o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsVersion.o $(OBJDIR_LINUX_RELEASE)/AddReverseDialog.o $(OBJDIR_LINUX_RELEASE)/BackgroundPlaylistDialog.o $(OBJDIR_LINUX_RELEASE)/Blend.o $(OBJDIR_LINUX_RELEASE)/__/xLights/effects/GIFImage.o $(OBJDIR_LINUX_RELEASE)/__/xLights/VideoReader.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/BaseController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/ControllerCaps.o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Falcon.o $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/kiss_fft.o $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/tools/kiss_fftr.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ArtNetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Controller.o $(OBJDIR_LINUX_RELEASE)/__/xLights/AudioManager.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Discovery.o $(OBJDIR_LINUX_RELEASE)/__/xLights/FSEQFile.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o $(OBJDIR_LINUX_RELEASE)/__/xLights/JobPool.o $(OBJDIR_LINUX_RELEASE)/__/xLights/Parallel.o $(OBJDIR_LINUX_RELEASE)/__/xLights/SequenceData.o $(OBJDIR_LINUX_RELEASE)/__/xLights/TraceLog.o $(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/KinetOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROptimisedOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerNull.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerSerial.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DDPOutput.o $(OBJDIR_LINUX_RELEASE)/DimDialog.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/GenericSerialOutput.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAudio.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAudioPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemCURL.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemCURLPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOffPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrgan.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrganPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDelay.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDelayPanel.o $(OBJDIR_LINUX_RELEASE)/OutputProcessingDialog.o $(OBJDIR_LINUX_RELEASE)/Pinger.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayList.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListDialog.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDim.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItem.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemARTNetTrigger.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemARTNetTriggerPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOff.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFilePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideoPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFade.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFadePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFile.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemImage.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemImagePanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemJukebox.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemJukeboxPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDimPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemESEQ.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemESEQPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEvent.o $(OBJDIR_LINUX_RELEASE)/OutputProcessThreeToFour.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEventPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQ.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideo.o $(OBJDIR_LINUX_RELEASE)/EventOSCPanel.o $(OBJDIR_LINUX_RELEASE)/EventFPPCommandPresetPanel.o $(OBJDIR_LINUX_RELEASE)/EventLorPanel.o $(OBJDIR_LINUX_RELEASE)/EventMIDIPanel.o $(OBJDIR_LINUX_RELEASE)/EventMQTTPanel.o $(OBJDIR_LINUX_RELEASE)/EventPingPanel.o $(OBJDIR_LINUX_RELEASE)/EventSerialPanel.o $(OBJDIR_LINUX_RELEASE)/EventStatePanel.o $(OBJDIR_LINUX_RELEASE)/EventsDialog.o $(OBJDIR_LINUX_RELEASE)/DimWhiteDialog.o $(OBJDIR_LINUX_RELEASE)/ESEQFile.o $(OBJDIR_LINUX_RELEASE)/EventARTNetPanel.o $(OBJDIR_LINUX_RELEASE)/EventARTNetTriggerPanel.o $(OBJDIR_LINUX_RELEASE)/EventDataPanel.o $(OBJDIR_LINUX_RELEASE)/EventDialog.o $(OBJDIR_LINUX_RELEASE)/EventE131Panel.o $(OBJDIR_LINUX_RELEASE)/EventFPPPanel.o $(OBJDIR_LINUX_RELEASE)/OutputProcessDimWhite.o $(OBJDIR_LINUX_RELEASE)/OptionsDialog.o $(OBJDIR_LINUX_RELEASE)/OutputProcess.o $(OBJDIR_LINUX_RELEASE)/OutputProcessColourOrder.o $(OBJDIR_LINUX_RELEASE)/OutputProcessDeadChannel.o $(OBJDIR_LINUX_RELEASE)/OutputProcessDim.o $(OBJDIR_LINUX_RELEASE)/OSCPacket.o $(OBJDIR_LINUX_RELEASE)/OutputProcessExcludeDim.o $(OBJDIR_LINUX_RELEASE)/OutputProcessGamma.o $(OBJDIR_LINUX_RELEASE)/OutputProcessRemap.o $(OBJDIR_LINUX_RELEASE)/OutputProcessReverse.o $(OBJDIR_LINUX_RELEASE)/OutputProcessSet.o $(OBJDIR_LINUX_RELEASE)/OutputProcessSustain.o $(OBJDIR_LINUX_RELEASE)/GammaDialog.o $(OBJDIR_LINUX_RELEASE)/ExcludeDimDialog.o $(OBJDIR_LINUX_RELEASE)/ExtraIPDialog.o $(OBJDIR_LINUX_RELEASE)/ExtraIPsDialog.o $(OBJDIR_LINUX_RELEASE)/FPPRemotesDialog.o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o $(OBJDIR_LINUX_RELEASE)/MatricesDialog.o $(OBJDIR_LINUX_RELEASE)/MatrixDialog.o $(OBJDIR_LINUX_RELEASE)/MatrixMapper.o all: linux_debug linux_release @@ -58,10 +58,10 @@ before_linux_debug: @test -d $(OBJDIR_LINUX_DEBUG)/wxJSON || mkdir -p $(OBJDIR_LINUX_DEBUG)/wxJSON @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/utils || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/utils - @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights - @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers + @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/effects || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/effects + @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft @test -d $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/tools || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/tools @test -d $(OBJDIR_LINUX_DEBUG)/__/common || mkdir -p $(OBJDIR_LINUX_DEBUG)/__/common @@ -208,6 +208,12 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunProcess.o: PlayList/PlayListItemRu $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunProcessPanel.o: PlayList/PlayListItemRunProcessPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemRunProcessPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemRunProcessPanel.o +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophone.o: PlayList/PlayListItemMicrophone.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemMicrophone.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophone.o + +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDI.o: PlayList/PlayListItemMIDI.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemMIDI.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDI.o + $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDIPanel.o: PlayList/PlayListItemMIDIPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemMIDIPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDIPanel.o @@ -217,9 +223,6 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMQTT.o: PlayList/PlayListItemMQTT.cpp $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMQTTPanel.o: PlayList/PlayListItemMQTTPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemMQTTPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMQTTPanel.o -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophone.o: PlayList/PlayListItemMicrophone.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemMicrophone.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophone.o - $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophonePanel.o: PlayList/PlayListItemMicrophonePanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemMicrophonePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMicrophonePanel.o @@ -370,9 +373,6 @@ $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/server.o: wxHTTPServer/server.cpp $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/sha1.o: wxHTTPServer/sha1.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c wxHTTPServer/sha1.cpp -o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/sha1.o -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDI.o: PlayList/PlayListItemMIDI.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemMIDI.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemMIDI.o - $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/status.o: wxHTTPServer/status.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c wxHTTPServer/status.cpp -o $(OBJDIR_LINUX_DEBUG)/wxHTTPServer/status.o @@ -385,8 +385,8 @@ $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonval.o: wxJSON/jsonval.cpp $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonwriter.o: wxJSON/jsonwriter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c wxJSON/jsonwriter.cpp -o $(OBJDIR_LINUX_DEBUG)/wxJSON/jsonwriter.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o: ../xLights/outputs/TwinklyOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/TwinklyOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ZCPPOutput.o: ../xLights/outputs/ZCPPOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/ZCPPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ZCPPOutput.o @@ -397,18 +397,24 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/serial.o: ../xLights/outputs/serial.cpp $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o: ../xLights/outputs/xxxEthernetOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/xxxEthernetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxEthernetOutput.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/xxxSerialOutput.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o: ../xLights/outputs/TwinklyOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/TwinklyOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o: ../xLights/utils/Curl.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/utils/Curl.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/Curl.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/utils/CurlManager.o: ../xLights/utils/CurlManager.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/utils/CurlManager.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/CurlManager.o + $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o: ../xLights/utils/ip_utils.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/utils/ip_utils.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/string_utils.o: ../xLights/utils/string_utils.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/utils/string_utils.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/utils/string_utils.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o: ../xLights/outputs/PixelNetOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o + $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenDMXOutput.o: ../xLights/outputs/OpenDMXOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/OpenDMXOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OpenDMXOutput.o @@ -421,12 +427,6 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/Output.o: ../xLights/outputs/Output.cpp $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OutputManager.o: ../xLights/outputs/OutputManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/OutputManager.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OutputManager.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/Files.o: ../xLights/vamp-hostsdk/Files.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/vamp-hostsdk/Files.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/Files.o - -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o: ../xLights/outputs/PixelNetOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/PixelNetOutput.o - $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o: ../xLights/outputs/RenardOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/RenardOutput.o @@ -436,6 +436,12 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/SerialOutput.o: ../xLights/outputs/Seri $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TestPreset.o: ../xLights/outputs/TestPreset.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/TestPreset.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/TestPreset.o +$(OBJDIR_LINUX_DEBUG)/ConfigureMIDITimecodeDialog.o: ConfigureMIDITimecodeDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ConfigureMIDITimecodeDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ConfigureMIDITimecodeDialog.o + +$(OBJDIR_LINUX_DEBUG)/ButtonDetailsDialog.o: ButtonDetailsDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ButtonDetailsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ButtonDetailsDialog.o + $(OBJDIR_LINUX_DEBUG)/City.o: City.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c City.cpp -o $(OBJDIR_LINUX_DEBUG)/City.o @@ -445,12 +451,6 @@ $(OBJDIR_LINUX_DEBUG)/ColourOrderDialog.o: ColourOrderDialog.cpp $(OBJDIR_LINUX_DEBUG)/CommandManager.o: CommandManager.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c CommandManager.cpp -o $(OBJDIR_LINUX_DEBUG)/CommandManager.o -$(OBJDIR_LINUX_DEBUG)/ConfigureMIDITimecodeDialog.o: ConfigureMIDITimecodeDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ConfigureMIDITimecodeDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ConfigureMIDITimecodeDialog.o - -$(OBJDIR_LINUX_DEBUG)/ButtonDetailsDialog.o: ButtonDetailsDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ButtonDetailsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ButtonDetailsDialog.o - $(OBJDIR_LINUX_DEBUG)/ConfigureOSC.o: ConfigureOSC.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ConfigureOSC.cpp -o $(OBJDIR_LINUX_DEBUG)/ConfigureOSC.o @@ -460,8 +460,11 @@ $(OBJDIR_LINUX_DEBUG)/ConfigureTest.o: ConfigureTest.cpp $(OBJDIR_LINUX_DEBUG)/DeadChannelDialog.o: DeadChannelDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c DeadChannelDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/DeadChannelDialog.o -$(OBJDIR_LINUX_DEBUG)/DimDialog.o: DimDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c DimDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/DimDialog.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsTimer.o: ../xLights/xLightsTimer.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/xLightsTimer.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsTimer.o + +$(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/Files.o: ../xLights/vamp-hostsdk/Files.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/vamp-hostsdk/Files.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/Files.o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o: ../xLights/vamp-hostsdk/PluginBufferingAdapter.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/vamp-hostsdk/PluginBufferingAdapter.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o @@ -484,12 +487,6 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/PluginWrapper.o: ../xLights/vamp-h $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/RealTime.o: ../xLights/vamp-hostsdk/RealTime.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/vamp-hostsdk/RealTime.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/vamp-hostsdk/RealTime.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsTimer.o: ../xLights/xLightsTimer.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/xLightsTimer.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsTimer.o - -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o: ../xLights/outputs/OPCOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/OPCOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o - $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsVersion.o: ../xLights/xLightsVersion.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/xLightsVersion.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/xLightsVersion.o @@ -502,6 +499,9 @@ $(OBJDIR_LINUX_DEBUG)/BackgroundPlaylistDialog.o: BackgroundPlaylistDialog.cpp $(OBJDIR_LINUX_DEBUG)/Blend.o: Blend.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c Blend.cpp -o $(OBJDIR_LINUX_DEBUG)/Blend.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/effects/GIFImage.o: ../xLights/effects/GIFImage.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/effects/GIFImage.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/effects/GIFImage.o + $(OBJDIR_LINUX_DEBUG)/__/xLights/VideoReader.o: ../xLights/VideoReader.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/VideoReader.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/VideoReader.o @@ -514,12 +514,6 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/ControllerCaps.o: ../xLights/contro $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Falcon.o: ../xLights/controllers/Falcon.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/controllers/Falcon.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/controllers/Falcon.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o: ../xLights/UtilFunctions.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/UtilFunctions.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o - -$(OBJDIR_LINUX_DEBUG)/__/xLights/effects/GIFImage.o: ../xLights/effects/GIFImage.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/effects/GIFImage.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/effects/GIFImage.o - $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/kiss_fft.o: ../xLights/kiss_fft/kiss_fft.c $(CC) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/kiss_fft/kiss_fft.c -o $(OBJDIR_LINUX_DEBUG)/__/xLights/kiss_fft/kiss_fft.o @@ -541,6 +535,9 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/Discovery.o: ../xLights/Discovery.cpp $(OBJDIR_LINUX_DEBUG)/__/xLights/FSEQFile.o: ../xLights/FSEQFile.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/FSEQFile.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/FSEQFile.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o: ../xLights/outputs/ControllerEthernet.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/ControllerEthernet.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o + $(OBJDIR_LINUX_DEBUG)/__/xLights/JobPool.o: ../xLights/JobPool.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/JobPool.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/JobPool.o @@ -553,8 +550,11 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/SequenceData.o: ../xLights/SequenceData.cpp $(OBJDIR_LINUX_DEBUG)/__/xLights/TraceLog.o: ../xLights/TraceLog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/TraceLog.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/TraceLog.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o: ../xLights/outputs/IPOutput.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/IPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o: ../xLights/UtilFunctions.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/UtilFunctions.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/UtilFunctions.o + +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o: ../xLights/outputs/LorController.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/LorController.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/KinetOutput.o: ../xLights/outputs/KinetOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/KinetOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/KinetOutput.o @@ -565,8 +565,8 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROptimisedOutput.o: ../xLights/output $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROutput.o: ../xLights/outputs/LOROutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/LOROutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LOROutput.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o: ../xLights/outputs/LorController.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/LorController.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorController.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o: ../xLights/outputs/IPOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/IPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o: ../xLights/outputs/LorControllers.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/LorControllers.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o @@ -574,8 +574,8 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/LorControllers.o: ../xLights/outputs/Lo $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o: ../xLights/outputs/NullOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/NullOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/NullOutput.o -$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o: ../xLights/outputs/ControllerEthernet.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/ControllerEthernet.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerEthernet.o +$(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o: ../xLights/outputs/OPCOutput.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/OPCOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerNull.o: ../xLights/outputs/ControllerNull.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/ControllerNull.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerNull.o @@ -586,6 +586,9 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/ControllerSerial.o: ../xLights/outputs/ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DDPOutput.o: ../xLights/outputs/DDPOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/DDPOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DDPOutput.o +$(OBJDIR_LINUX_DEBUG)/DimDialog.o: DimDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c DimDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/DimDialog.o + $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o: ../xLights/outputs/DMXOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/DMXOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/DMXOutput.o @@ -595,9 +598,6 @@ $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/E131Output.o: ../xLights/outputs/E131Ou $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/GenericSerialOutput.o: ../xLights/outputs/GenericSerialOutput.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../xLights/outputs/GenericSerialOutput.cpp -o $(OBJDIR_LINUX_DEBUG)/__/xLights/outputs/GenericSerialOutput.o -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrgan.o: PlayList/PlayListItemColourOrgan.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemColourOrgan.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrgan.o - $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAudio.o: PlayList/PlayListItemAudio.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemAudio.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAudio.o @@ -610,6 +610,12 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemCURL.o: PlayList/PlayListItemCURL.cpp $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemCURLPanel.o: PlayList/PlayListItemCURLPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemCURLPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemCURLPanel.o +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOffPanel.o: PlayList/PlayListItemAllOffPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemAllOffPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOffPanel.o + +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrgan.o: PlayList/PlayListItemColourOrgan.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemColourOrgan.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrgan.o + $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrganPanel.o: PlayList/PlayListItemColourOrganPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemColourOrganPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemColourOrganPanel.o @@ -619,12 +625,6 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDelay.o: PlayList/PlayListItemDelay.c $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDelayPanel.o: PlayList/PlayListItemDelayPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemDelayPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDelayPanel.o -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDim.o: PlayList/PlayListItemDim.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemDim.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDim.o - -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItem.o: PlayList/PlayListItem.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItem.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItem.o - $(OBJDIR_LINUX_DEBUG)/OutputProcessingDialog.o: OutputProcessingDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessingDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessingDialog.o @@ -637,6 +637,12 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayList.o: PlayList/PlayList.cpp $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListDialog.o: PlayList/PlayListDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListDialog.o +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDim.o: PlayList/PlayListItemDim.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemDim.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDim.o + +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItem.o: PlayList/PlayListItem.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItem.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItem.o + $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemARTNetTrigger.o: PlayList/PlayListItemARTNetTrigger.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemARTNetTrigger.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemARTNetTrigger.o @@ -646,8 +652,11 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemARTNetTriggerPanel.o: PlayList/PlayLi $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOff.o: PlayList/PlayListItemAllOff.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemAllOff.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOff.o -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOffPanel.o: PlayList/PlayListItemAllOffPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemAllOffPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemAllOffPanel.o +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFilePanel.o: PlayList/PlayListItemFilePanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFilePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFilePanel.o + +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideoPanel.o: PlayList/PlayListItemFSEQVideoPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFSEQVideoPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideoPanel.o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFade.o: PlayList/PlayListItemFade.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFade.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFade.o @@ -658,12 +667,6 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFadePanel.o: PlayList/PlayListItemFad $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFile.o: PlayList/PlayListItemFile.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFile.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFile.o -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFilePanel.o: PlayList/PlayListItemFilePanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFilePanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFilePanel.o - -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideoPanel.o: PlayList/PlayListItemFSEQVideoPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFSEQVideoPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideoPanel.o - $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemImage.o: PlayList/PlayListItemImage.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemImage.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemImage.o @@ -676,9 +679,6 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemJukebox.o: PlayList/PlayListItemJukeb $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemJukeboxPanel.o: PlayList/PlayListItemJukeboxPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemJukeboxPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemJukeboxPanel.o -$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEventPanel.o: PlayList/PlayListItemFPPEventPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFPPEventPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEventPanel.o - $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDimPanel.o: PlayList/PlayListItemDimPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemDimPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemDimPanel.o @@ -691,6 +691,12 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemESEQPanel.o: PlayList/PlayListItemESE $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEvent.o: PlayList/PlayListItemFPPEvent.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFPPEvent.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEvent.o +$(OBJDIR_LINUX_DEBUG)/OutputProcessThreeToFour.o: OutputProcessThreeToFour.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessThreeToFour.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessThreeToFour.o + +$(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEventPanel.o: PlayList/PlayListItemFPPEventPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFPPEventPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFPPEventPanel.o + $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQ.o: PlayList/PlayListItemFSEQ.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFSEQ.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQ.o @@ -700,6 +706,12 @@ $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQPanel.o: PlayList/PlayListItemFSE $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideo.o: PlayList/PlayListItemFSEQVideo.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c PlayList/PlayListItemFSEQVideo.cpp -o $(OBJDIR_LINUX_DEBUG)/PlayList/PlayListItemFSEQVideo.o +$(OBJDIR_LINUX_DEBUG)/EventOSCPanel.o: EventOSCPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventOSCPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventOSCPanel.o + +$(OBJDIR_LINUX_DEBUG)/EventFPPCommandPresetPanel.o: EventFPPCommandPresetPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventFPPCommandPresetPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventFPPCommandPresetPanel.o + $(OBJDIR_LINUX_DEBUG)/EventLorPanel.o: EventLorPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventLorPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventLorPanel.o @@ -709,12 +721,6 @@ $(OBJDIR_LINUX_DEBUG)/EventMIDIPanel.o: EventMIDIPanel.cpp $(OBJDIR_LINUX_DEBUG)/EventMQTTPanel.o: EventMQTTPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventMQTTPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventMQTTPanel.o -$(OBJDIR_LINUX_DEBUG)/EventOSCPanel.o: EventOSCPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventOSCPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventOSCPanel.o - -$(OBJDIR_LINUX_DEBUG)/EventFPPCommandPresetPanel.o: EventFPPCommandPresetPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventFPPCommandPresetPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventFPPCommandPresetPanel.o - $(OBJDIR_LINUX_DEBUG)/EventPingPanel.o: EventPingPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventPingPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventPingPanel.o @@ -727,9 +733,6 @@ $(OBJDIR_LINUX_DEBUG)/EventStatePanel.o: EventStatePanel.cpp $(OBJDIR_LINUX_DEBUG)/EventsDialog.o: EventsDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/EventsDialog.o -$(OBJDIR_LINUX_DEBUG)/EventDataPanel.o: EventDataPanel.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventDataPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventDataPanel.o - $(OBJDIR_LINUX_DEBUG)/DimWhiteDialog.o: DimWhiteDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c DimWhiteDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/DimWhiteDialog.o @@ -742,8 +745,8 @@ $(OBJDIR_LINUX_DEBUG)/EventARTNetPanel.o: EventARTNetPanel.cpp $(OBJDIR_LINUX_DEBUG)/EventARTNetTriggerPanel.o: EventARTNetTriggerPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventARTNetTriggerPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventARTNetTriggerPanel.o -$(OBJDIR_LINUX_DEBUG)/ExcludeDimDialog.o: ExcludeDimDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ExcludeDimDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ExcludeDimDialog.o +$(OBJDIR_LINUX_DEBUG)/EventDataPanel.o: EventDataPanel.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventDataPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventDataPanel.o $(OBJDIR_LINUX_DEBUG)/EventDialog.o: EventDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/EventDialog.o @@ -754,8 +757,8 @@ $(OBJDIR_LINUX_DEBUG)/EventE131Panel.o: EventE131Panel.cpp $(OBJDIR_LINUX_DEBUG)/EventFPPPanel.o: EventFPPPanel.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c EventFPPPanel.cpp -o $(OBJDIR_LINUX_DEBUG)/EventFPPPanel.o -$(OBJDIR_LINUX_DEBUG)/OutputProcessExcludeDim.o: OutputProcessExcludeDim.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessExcludeDim.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessExcludeDim.o +$(OBJDIR_LINUX_DEBUG)/OutputProcessDimWhite.o: OutputProcessDimWhite.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessDimWhite.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessDimWhite.o $(OBJDIR_LINUX_DEBUG)/OptionsDialog.o: OptionsDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OptionsDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/OptionsDialog.o @@ -772,8 +775,11 @@ $(OBJDIR_LINUX_DEBUG)/OutputProcessDeadChannel.o: OutputProcessDeadChannel.cpp $(OBJDIR_LINUX_DEBUG)/OutputProcessDim.o: OutputProcessDim.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessDim.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessDim.o -$(OBJDIR_LINUX_DEBUG)/OutputProcessDimWhite.o: OutputProcessDimWhite.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessDimWhite.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessDimWhite.o +$(OBJDIR_LINUX_DEBUG)/OSCPacket.o: OSCPacket.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OSCPacket.cpp -o $(OBJDIR_LINUX_DEBUG)/OSCPacket.o + +$(OBJDIR_LINUX_DEBUG)/OutputProcessExcludeDim.o: OutputProcessExcludeDim.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessExcludeDim.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessExcludeDim.o $(OBJDIR_LINUX_DEBUG)/OutputProcessGamma.o: OutputProcessGamma.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessGamma.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessGamma.o @@ -790,8 +796,11 @@ $(OBJDIR_LINUX_DEBUG)/OutputProcessSet.o: OutputProcessSet.cpp $(OBJDIR_LINUX_DEBUG)/OutputProcessSustain.o: OutputProcessSustain.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessSustain.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessSustain.o -$(OBJDIR_LINUX_DEBUG)/OutputProcessThreeToFour.o: OutputProcessThreeToFour.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OutputProcessThreeToFour.cpp -o $(OBJDIR_LINUX_DEBUG)/OutputProcessThreeToFour.o +$(OBJDIR_LINUX_DEBUG)/GammaDialog.o: GammaDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c GammaDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/GammaDialog.o + +$(OBJDIR_LINUX_DEBUG)/ExcludeDimDialog.o: ExcludeDimDialog.cpp + $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ExcludeDimDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ExcludeDimDialog.o $(OBJDIR_LINUX_DEBUG)/ExtraIPDialog.o: ExtraIPDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ExtraIPDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/ExtraIPDialog.o @@ -802,9 +811,6 @@ $(OBJDIR_LINUX_DEBUG)/ExtraIPsDialog.o: ExtraIPsDialog.cpp $(OBJDIR_LINUX_DEBUG)/FPPRemotesDialog.o: FPPRemotesDialog.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c FPPRemotesDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/FPPRemotesDialog.o -$(OBJDIR_LINUX_DEBUG)/GammaDialog.o: GammaDialog.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c GammaDialog.cpp -o $(OBJDIR_LINUX_DEBUG)/GammaDialog.o - $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o: ../common/xlBaseApp.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c ../common/xlBaseApp.cpp -o $(OBJDIR_LINUX_DEBUG)/__/common/xlBaseApp.o @@ -817,9 +823,6 @@ $(OBJDIR_LINUX_DEBUG)/MatrixDialog.o: MatrixDialog.cpp $(OBJDIR_LINUX_DEBUG)/MatrixMapper.o: MatrixMapper.cpp $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c MatrixMapper.cpp -o $(OBJDIR_LINUX_DEBUG)/MatrixMapper.o -$(OBJDIR_LINUX_DEBUG)/OSCPacket.o: OSCPacket.cpp - $(CXX) $(CFLAGS_LINUX_DEBUG) $(INC_LINUX_DEBUG) -c OSCPacket.cpp -o $(OBJDIR_LINUX_DEBUG)/OSCPacket.o - clean_linux_debug: rm -f $(OBJ_LINUX_DEBUG) $(OUT_LINUX_DEBUG) @@ -833,10 +836,10 @@ before_linux_release: @test -d $(OBJDIR_LINUX_RELEASE)/wxJSON || mkdir -p $(OBJDIR_LINUX_RELEASE)/wxJSON @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/utils || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/utils - @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights - @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers + @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/effects || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/effects + @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft @test -d $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/tools || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/tools @test -d $(OBJDIR_LINUX_RELEASE)/__/common || mkdir -p $(OBJDIR_LINUX_RELEASE)/__/common @@ -983,6 +986,12 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunProcess.o: PlayList/PlayListItem $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunProcessPanel.o: PlayList/PlayListItemRunProcessPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemRunProcessPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemRunProcessPanel.o +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophone.o: PlayList/PlayListItemMicrophone.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemMicrophone.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophone.o + +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDI.o: PlayList/PlayListItemMIDI.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemMIDI.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDI.o + $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDIPanel.o: PlayList/PlayListItemMIDIPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemMIDIPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDIPanel.o @@ -992,9 +1001,6 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMQTT.o: PlayList/PlayListItemMQTT.c $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMQTTPanel.o: PlayList/PlayListItemMQTTPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemMQTTPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMQTTPanel.o -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophone.o: PlayList/PlayListItemMicrophone.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemMicrophone.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophone.o - $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophonePanel.o: PlayList/PlayListItemMicrophonePanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemMicrophonePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMicrophonePanel.o @@ -1145,9 +1151,6 @@ $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/server.o: wxHTTPServer/server.cpp $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/sha1.o: wxHTTPServer/sha1.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c wxHTTPServer/sha1.cpp -o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/sha1.o -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDI.o: PlayList/PlayListItemMIDI.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemMIDI.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemMIDI.o - $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/status.o: wxHTTPServer/status.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c wxHTTPServer/status.cpp -o $(OBJDIR_LINUX_RELEASE)/wxHTTPServer/status.o @@ -1160,8 +1163,8 @@ $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonval.o: wxJSON/jsonval.cpp $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonwriter.o: wxJSON/jsonwriter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c wxJSON/jsonwriter.cpp -o $(OBJDIR_LINUX_RELEASE)/wxJSON/jsonwriter.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o: ../xLights/outputs/TwinklyOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/TwinklyOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ZCPPOutput.o: ../xLights/outputs/ZCPPOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/ZCPPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ZCPPOutput.o @@ -1172,18 +1175,24 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/serial.o: ../xLights/outputs/serial.c $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o: ../xLights/outputs/xxxEthernetOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/xxxEthernetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxEthernetOutput.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o: ../xLights/outputs/xxxSerialOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/xxxSerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/xxxSerialOutput.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o: ../xLights/outputs/TwinklyOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/TwinklyOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TwinklyOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o: ../xLights/utils/Curl.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/utils/Curl.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/Curl.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/utils/CurlManager.o: ../xLights/utils/CurlManager.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/utils/CurlManager.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/CurlManager.o + $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o: ../xLights/utils/ip_utils.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/utils/ip_utils.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/ip_utils.o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/string_utils.o: ../xLights/utils/string_utils.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/utils/string_utils.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/utils/string_utils.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o: ../xLights/outputs/PixelNetOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o + $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenDMXOutput.o: ../xLights/outputs/OpenDMXOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/OpenDMXOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OpenDMXOutput.o @@ -1196,12 +1205,6 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/Output.o: ../xLights/outputs/Output.c $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OutputManager.o: ../xLights/outputs/OutputManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/OutputManager.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OutputManager.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/Files.o: ../xLights/vamp-hostsdk/Files.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/vamp-hostsdk/Files.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/Files.o - -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o: ../xLights/outputs/PixelNetOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/PixelNetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/PixelNetOutput.o - $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o: ../xLights/outputs/RenardOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/RenardOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/RenardOutput.o @@ -1211,6 +1214,12 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/SerialOutput.o: ../xLights/outputs/Se $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TestPreset.o: ../xLights/outputs/TestPreset.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/TestPreset.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/TestPreset.o +$(OBJDIR_LINUX_RELEASE)/ConfigureMIDITimecodeDialog.o: ConfigureMIDITimecodeDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ConfigureMIDITimecodeDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ConfigureMIDITimecodeDialog.o + +$(OBJDIR_LINUX_RELEASE)/ButtonDetailsDialog.o: ButtonDetailsDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ButtonDetailsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ButtonDetailsDialog.o + $(OBJDIR_LINUX_RELEASE)/City.o: City.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c City.cpp -o $(OBJDIR_LINUX_RELEASE)/City.o @@ -1220,12 +1229,6 @@ $(OBJDIR_LINUX_RELEASE)/ColourOrderDialog.o: ColourOrderDialog.cpp $(OBJDIR_LINUX_RELEASE)/CommandManager.o: CommandManager.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c CommandManager.cpp -o $(OBJDIR_LINUX_RELEASE)/CommandManager.o -$(OBJDIR_LINUX_RELEASE)/ConfigureMIDITimecodeDialog.o: ConfigureMIDITimecodeDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ConfigureMIDITimecodeDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ConfigureMIDITimecodeDialog.o - -$(OBJDIR_LINUX_RELEASE)/ButtonDetailsDialog.o: ButtonDetailsDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ButtonDetailsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ButtonDetailsDialog.o - $(OBJDIR_LINUX_RELEASE)/ConfigureOSC.o: ConfigureOSC.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ConfigureOSC.cpp -o $(OBJDIR_LINUX_RELEASE)/ConfigureOSC.o @@ -1235,8 +1238,11 @@ $(OBJDIR_LINUX_RELEASE)/ConfigureTest.o: ConfigureTest.cpp $(OBJDIR_LINUX_RELEASE)/DeadChannelDialog.o: DeadChannelDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c DeadChannelDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/DeadChannelDialog.o -$(OBJDIR_LINUX_RELEASE)/DimDialog.o: DimDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c DimDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/DimDialog.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsTimer.o: ../xLights/xLightsTimer.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/xLightsTimer.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsTimer.o + +$(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/Files.o: ../xLights/vamp-hostsdk/Files.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/vamp-hostsdk/Files.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/Files.o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o: ../xLights/vamp-hostsdk/PluginBufferingAdapter.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/vamp-hostsdk/PluginBufferingAdapter.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginBufferingAdapter.o @@ -1259,12 +1265,6 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/PluginWrapper.o: ../xLights/vamp $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/RealTime.o: ../xLights/vamp-hostsdk/RealTime.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/vamp-hostsdk/RealTime.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/vamp-hostsdk/RealTime.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsTimer.o: ../xLights/xLightsTimer.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/xLightsTimer.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsTimer.o - -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o: ../xLights/outputs/OPCOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/OPCOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o - $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsVersion.o: ../xLights/xLightsVersion.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/xLightsVersion.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/xLightsVersion.o @@ -1277,6 +1277,9 @@ $(OBJDIR_LINUX_RELEASE)/BackgroundPlaylistDialog.o: BackgroundPlaylistDialog.cpp $(OBJDIR_LINUX_RELEASE)/Blend.o: Blend.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c Blend.cpp -o $(OBJDIR_LINUX_RELEASE)/Blend.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/effects/GIFImage.o: ../xLights/effects/GIFImage.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/effects/GIFImage.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/effects/GIFImage.o + $(OBJDIR_LINUX_RELEASE)/__/xLights/VideoReader.o: ../xLights/VideoReader.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/VideoReader.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/VideoReader.o @@ -1289,12 +1292,6 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/ControllerCaps.o: ../xLights/cont $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Falcon.o: ../xLights/controllers/Falcon.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/controllers/Falcon.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/controllers/Falcon.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o: ../xLights/UtilFunctions.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/UtilFunctions.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o - -$(OBJDIR_LINUX_RELEASE)/__/xLights/effects/GIFImage.o: ../xLights/effects/GIFImage.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/effects/GIFImage.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/effects/GIFImage.o - $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/kiss_fft.o: ../xLights/kiss_fft/kiss_fft.c $(CC) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/kiss_fft/kiss_fft.c -o $(OBJDIR_LINUX_RELEASE)/__/xLights/kiss_fft/kiss_fft.o @@ -1316,6 +1313,9 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/Discovery.o: ../xLights/Discovery.cpp $(OBJDIR_LINUX_RELEASE)/__/xLights/FSEQFile.o: ../xLights/FSEQFile.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/FSEQFile.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/FSEQFile.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o: ../xLights/outputs/ControllerEthernet.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/ControllerEthernet.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o + $(OBJDIR_LINUX_RELEASE)/__/xLights/JobPool.o: ../xLights/JobPool.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/JobPool.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/JobPool.o @@ -1328,8 +1328,11 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/SequenceData.o: ../xLights/SequenceData.cpp $(OBJDIR_LINUX_RELEASE)/__/xLights/TraceLog.o: ../xLights/TraceLog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/TraceLog.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/TraceLog.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o: ../xLights/outputs/IPOutput.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/IPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o: ../xLights/UtilFunctions.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/UtilFunctions.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/UtilFunctions.o + +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o: ../xLights/outputs/LorController.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/LorController.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/KinetOutput.o: ../xLights/outputs/KinetOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/KinetOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/KinetOutput.o @@ -1340,8 +1343,8 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROptimisedOutput.o: ../xLights/outp $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROutput.o: ../xLights/outputs/LOROutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/LOROutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LOROutput.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o: ../xLights/outputs/LorController.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/LorController.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorController.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o: ../xLights/outputs/IPOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/IPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/IPOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o: ../xLights/outputs/LorControllers.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/LorControllers.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o @@ -1349,8 +1352,8 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/LorControllers.o: ../xLights/outputs/ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o: ../xLights/outputs/NullOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/NullOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/NullOutput.o -$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o: ../xLights/outputs/ControllerEthernet.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/ControllerEthernet.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerEthernet.o +$(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o: ../xLights/outputs/OPCOutput.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/OPCOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/OPCOutput.o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerNull.o: ../xLights/outputs/ControllerNull.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/ControllerNull.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerNull.o @@ -1361,6 +1364,9 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/ControllerSerial.o: ../xLights/output $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DDPOutput.o: ../xLights/outputs/DDPOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/DDPOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DDPOutput.o +$(OBJDIR_LINUX_RELEASE)/DimDialog.o: DimDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c DimDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/DimDialog.o + $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o: ../xLights/outputs/DMXOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/DMXOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/DMXOutput.o @@ -1370,9 +1376,6 @@ $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/E131Output.o: ../xLights/outputs/E131 $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/GenericSerialOutput.o: ../xLights/outputs/GenericSerialOutput.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../xLights/outputs/GenericSerialOutput.cpp -o $(OBJDIR_LINUX_RELEASE)/__/xLights/outputs/GenericSerialOutput.o -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrgan.o: PlayList/PlayListItemColourOrgan.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemColourOrgan.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrgan.o - $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAudio.o: PlayList/PlayListItemAudio.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemAudio.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAudio.o @@ -1385,6 +1388,12 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemCURL.o: PlayList/PlayListItemCURL.c $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemCURLPanel.o: PlayList/PlayListItemCURLPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemCURLPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemCURLPanel.o +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOffPanel.o: PlayList/PlayListItemAllOffPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemAllOffPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOffPanel.o + +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrgan.o: PlayList/PlayListItemColourOrgan.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemColourOrgan.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrgan.o + $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrganPanel.o: PlayList/PlayListItemColourOrganPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemColourOrganPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemColourOrganPanel.o @@ -1394,12 +1403,6 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDelay.o: PlayList/PlayListItemDelay $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDelayPanel.o: PlayList/PlayListItemDelayPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemDelayPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDelayPanel.o -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDim.o: PlayList/PlayListItemDim.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemDim.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDim.o - -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItem.o: PlayList/PlayListItem.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItem.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItem.o - $(OBJDIR_LINUX_RELEASE)/OutputProcessingDialog.o: OutputProcessingDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessingDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessingDialog.o @@ -1412,6 +1415,12 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayList.o: PlayList/PlayList.cpp $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListDialog.o: PlayList/PlayListDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListDialog.o +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDim.o: PlayList/PlayListItemDim.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemDim.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDim.o + +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItem.o: PlayList/PlayListItem.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItem.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItem.o + $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemARTNetTrigger.o: PlayList/PlayListItemARTNetTrigger.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemARTNetTrigger.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemARTNetTrigger.o @@ -1421,8 +1430,11 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemARTNetTriggerPanel.o: PlayList/Play $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOff.o: PlayList/PlayListItemAllOff.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemAllOff.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOff.o -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOffPanel.o: PlayList/PlayListItemAllOffPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemAllOffPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemAllOffPanel.o +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFilePanel.o: PlayList/PlayListItemFilePanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFilePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFilePanel.o + +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideoPanel.o: PlayList/PlayListItemFSEQVideoPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFSEQVideoPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideoPanel.o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFade.o: PlayList/PlayListItemFade.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFade.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFade.o @@ -1433,12 +1445,6 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFadePanel.o: PlayList/PlayListItemF $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFile.o: PlayList/PlayListItemFile.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFile.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFile.o -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFilePanel.o: PlayList/PlayListItemFilePanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFilePanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFilePanel.o - -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideoPanel.o: PlayList/PlayListItemFSEQVideoPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFSEQVideoPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideoPanel.o - $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemImage.o: PlayList/PlayListItemImage.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemImage.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemImage.o @@ -1451,9 +1457,6 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemJukebox.o: PlayList/PlayListItemJuk $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemJukeboxPanel.o: PlayList/PlayListItemJukeboxPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemJukeboxPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemJukeboxPanel.o -$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEventPanel.o: PlayList/PlayListItemFPPEventPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFPPEventPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEventPanel.o - $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDimPanel.o: PlayList/PlayListItemDimPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemDimPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemDimPanel.o @@ -1466,6 +1469,12 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemESEQPanel.o: PlayList/PlayListItemE $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEvent.o: PlayList/PlayListItemFPPEvent.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFPPEvent.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEvent.o +$(OBJDIR_LINUX_RELEASE)/OutputProcessThreeToFour.o: OutputProcessThreeToFour.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessThreeToFour.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessThreeToFour.o + +$(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEventPanel.o: PlayList/PlayListItemFPPEventPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFPPEventPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFPPEventPanel.o + $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQ.o: PlayList/PlayListItemFSEQ.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFSEQ.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQ.o @@ -1475,6 +1484,12 @@ $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQPanel.o: PlayList/PlayListItemF $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideo.o: PlayList/PlayListItemFSEQVideo.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c PlayList/PlayListItemFSEQVideo.cpp -o $(OBJDIR_LINUX_RELEASE)/PlayList/PlayListItemFSEQVideo.o +$(OBJDIR_LINUX_RELEASE)/EventOSCPanel.o: EventOSCPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventOSCPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventOSCPanel.o + +$(OBJDIR_LINUX_RELEASE)/EventFPPCommandPresetPanel.o: EventFPPCommandPresetPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventFPPCommandPresetPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventFPPCommandPresetPanel.o + $(OBJDIR_LINUX_RELEASE)/EventLorPanel.o: EventLorPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventLorPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventLorPanel.o @@ -1484,12 +1499,6 @@ $(OBJDIR_LINUX_RELEASE)/EventMIDIPanel.o: EventMIDIPanel.cpp $(OBJDIR_LINUX_RELEASE)/EventMQTTPanel.o: EventMQTTPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventMQTTPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventMQTTPanel.o -$(OBJDIR_LINUX_RELEASE)/EventOSCPanel.o: EventOSCPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventOSCPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventOSCPanel.o - -$(OBJDIR_LINUX_RELEASE)/EventFPPCommandPresetPanel.o: EventFPPCommandPresetPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventFPPCommandPresetPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventFPPCommandPresetPanel.o - $(OBJDIR_LINUX_RELEASE)/EventPingPanel.o: EventPingPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventPingPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventPingPanel.o @@ -1502,9 +1511,6 @@ $(OBJDIR_LINUX_RELEASE)/EventStatePanel.o: EventStatePanel.cpp $(OBJDIR_LINUX_RELEASE)/EventsDialog.o: EventsDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/EventsDialog.o -$(OBJDIR_LINUX_RELEASE)/EventDataPanel.o: EventDataPanel.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventDataPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventDataPanel.o - $(OBJDIR_LINUX_RELEASE)/DimWhiteDialog.o: DimWhiteDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c DimWhiteDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/DimWhiteDialog.o @@ -1517,8 +1523,8 @@ $(OBJDIR_LINUX_RELEASE)/EventARTNetPanel.o: EventARTNetPanel.cpp $(OBJDIR_LINUX_RELEASE)/EventARTNetTriggerPanel.o: EventARTNetTriggerPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventARTNetTriggerPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventARTNetTriggerPanel.o -$(OBJDIR_LINUX_RELEASE)/ExcludeDimDialog.o: ExcludeDimDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ExcludeDimDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ExcludeDimDialog.o +$(OBJDIR_LINUX_RELEASE)/EventDataPanel.o: EventDataPanel.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventDataPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventDataPanel.o $(OBJDIR_LINUX_RELEASE)/EventDialog.o: EventDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/EventDialog.o @@ -1529,8 +1535,8 @@ $(OBJDIR_LINUX_RELEASE)/EventE131Panel.o: EventE131Panel.cpp $(OBJDIR_LINUX_RELEASE)/EventFPPPanel.o: EventFPPPanel.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c EventFPPPanel.cpp -o $(OBJDIR_LINUX_RELEASE)/EventFPPPanel.o -$(OBJDIR_LINUX_RELEASE)/OutputProcessExcludeDim.o: OutputProcessExcludeDim.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessExcludeDim.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessExcludeDim.o +$(OBJDIR_LINUX_RELEASE)/OutputProcessDimWhite.o: OutputProcessDimWhite.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessDimWhite.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessDimWhite.o $(OBJDIR_LINUX_RELEASE)/OptionsDialog.o: OptionsDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OptionsDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/OptionsDialog.o @@ -1547,8 +1553,11 @@ $(OBJDIR_LINUX_RELEASE)/OutputProcessDeadChannel.o: OutputProcessDeadChannel.cpp $(OBJDIR_LINUX_RELEASE)/OutputProcessDim.o: OutputProcessDim.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessDim.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessDim.o -$(OBJDIR_LINUX_RELEASE)/OutputProcessDimWhite.o: OutputProcessDimWhite.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessDimWhite.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessDimWhite.o +$(OBJDIR_LINUX_RELEASE)/OSCPacket.o: OSCPacket.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OSCPacket.cpp -o $(OBJDIR_LINUX_RELEASE)/OSCPacket.o + +$(OBJDIR_LINUX_RELEASE)/OutputProcessExcludeDim.o: OutputProcessExcludeDim.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessExcludeDim.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessExcludeDim.o $(OBJDIR_LINUX_RELEASE)/OutputProcessGamma.o: OutputProcessGamma.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessGamma.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessGamma.o @@ -1565,8 +1574,11 @@ $(OBJDIR_LINUX_RELEASE)/OutputProcessSet.o: OutputProcessSet.cpp $(OBJDIR_LINUX_RELEASE)/OutputProcessSustain.o: OutputProcessSustain.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessSustain.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessSustain.o -$(OBJDIR_LINUX_RELEASE)/OutputProcessThreeToFour.o: OutputProcessThreeToFour.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OutputProcessThreeToFour.cpp -o $(OBJDIR_LINUX_RELEASE)/OutputProcessThreeToFour.o +$(OBJDIR_LINUX_RELEASE)/GammaDialog.o: GammaDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c GammaDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/GammaDialog.o + +$(OBJDIR_LINUX_RELEASE)/ExcludeDimDialog.o: ExcludeDimDialog.cpp + $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ExcludeDimDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ExcludeDimDialog.o $(OBJDIR_LINUX_RELEASE)/ExtraIPDialog.o: ExtraIPDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ExtraIPDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/ExtraIPDialog.o @@ -1577,9 +1589,6 @@ $(OBJDIR_LINUX_RELEASE)/ExtraIPsDialog.o: ExtraIPsDialog.cpp $(OBJDIR_LINUX_RELEASE)/FPPRemotesDialog.o: FPPRemotesDialog.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c FPPRemotesDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/FPPRemotesDialog.o -$(OBJDIR_LINUX_RELEASE)/GammaDialog.o: GammaDialog.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c GammaDialog.cpp -o $(OBJDIR_LINUX_RELEASE)/GammaDialog.o - $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o: ../common/xlBaseApp.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c ../common/xlBaseApp.cpp -o $(OBJDIR_LINUX_RELEASE)/__/common/xlBaseApp.o @@ -1592,9 +1601,6 @@ $(OBJDIR_LINUX_RELEASE)/MatrixDialog.o: MatrixDialog.cpp $(OBJDIR_LINUX_RELEASE)/MatrixMapper.o: MatrixMapper.cpp $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c MatrixMapper.cpp -o $(OBJDIR_LINUX_RELEASE)/MatrixMapper.o -$(OBJDIR_LINUX_RELEASE)/OSCPacket.o: OSCPacket.cpp - $(CXX) $(CFLAGS_LINUX_RELEASE) $(INC_LINUX_RELEASE) -c OSCPacket.cpp -o $(OBJDIR_LINUX_RELEASE)/OSCPacket.o - clean_linux_release: rm -f $(OBJ_LINUX_RELEASE) $(OUT_LINUX_RELEASE) @@ -1704,10 +1710,12 @@ PlayList/PlayListItemRunCommandPanel.cpp: xScheduleMain.h CommandManager.h Sched PlayList/PlayListItemRunProcess.cpp: xScheduleMain.h ScheduleManager.h -PlayList/PlayListItemMQTT.cpp: xScheduleMain.h ScheduleManager.h ../xLights/UtilFunctions.h - PlayList/PlayListItemMicrophone.cpp: ../xLights/AudioManager.h +PlayList/PlayListItemMIDI.cpp: ../xLights/UtilFunctions.h + +PlayList/PlayListItemMQTT.cpp: xScheduleMain.h ScheduleManager.h ../xLights/UtilFunctions.h + PlayList/PlayListItemMicrophonePanel.cpp: xScheduleMain.h ScheduleManager.h ../xLights/AudioManager.h PlayList/PlayListItemOSC.cpp: xScheduleMain.h ScheduleManager.h @@ -1736,7 +1744,7 @@ PlayList/PlayListItemSetColourPanel.cpp: xScheduleMain.h ScheduleManager.h PlayList/PlayListItemTestPanel.cpp: xScheduleMain.h ScheduleManager.h -xScheduleApp.cpp: xScheduleApp.h xScheduleMain.h ScheduleManager.h ../xLights/xLightsVersion.h +xScheduleApp.cpp: xScheduleApp.h xScheduleMain.h ScheduleManager.h ../xLights/xLightsVersion.h ../xLights/UtilFunctions.h xScheduleMain.cpp: xScheduleMain.h MyTreeItemData.h ScheduleManager.h Schedule.h ScheduleOptions.h OptionsDialog.h WebServer.h ../xLights/xLightsVersion.h RunningSchedule.h UserButton.h OutputProcessingDialog.h BackgroundPlaylistDialog.h MatricesDialog.h VirtualMatricesDialog.h FPPRemotesDialog.h ConfigureOSC.h ConfigureTest.h Pinger.h EventsDialog.h ../xLights/UtilFunctions.h ConfigureMIDITimecodeDialog.h City.h ExtraIPsDialog.h SyncFPP.h ../xLights/VideoReader.h ../xLights/SpecialOptions.h ../xLights/AudioManager.h RemoteModeConfigDialog.h ../include/xs_save.xpm ../include/xs_otlon.xpm ../include/xs_otloff.xpm ../include/xs_otlautoon.xpm ../include/xs_otlautooff.xpm ../include/xs_scheduled.xpm ../include/xs_queued.xpm ../include/xs_notscheduled.xpm ../include/xs_inactive.xpm ../include/xs_pllooped.xpm ../include/xs_plnotlooped.xpm ../include/xs_plsteplooped.xpm ../include/xs_plstepnotlooped.xpm ../include/xs_playing.xpm ../include/xs_idle.xpm ../include/xs_paused.xpm ../include/xs_random.xpm ../include/xs_notrandom.xpm ../include/xs_volume_down.xpm ../include/xs_volume_up.xpm ../include/xs_brightness_down.xpm ../include/xs_brightness_up.xpm ../include/xs_falcon.xpm ../include/xLights.xpm ../include/xLights-16.xpm ../include/xLights-32.xpm ../include/xLights-64.xpm ../include/xLights-128.xpm ../include/slow.xpm ../include/web_icon.xpm ../include/no_web_icon.xpm @@ -1776,14 +1784,14 @@ events/ListenerCSVFPP.cpp: Control.h ../xLights/UtilFunctions.h events/ListenerE131.cpp: ../xLights/UtilFunctions.h -PlayList/PlayListItemMIDI.cpp: ../xLights/UtilFunctions.h - -../xLights/outputs/TwinklyOutput.cpp: ../xLights/UtilFunctions.h ../xLights/Discovery.h - ../xLights/outputs/ZCPPOutput.cpp: ../xLights/UtilFunctions.h ../xLights/OutputModelManager.h ../xLights/ExternalHooks.h ../xLights/Discovery.h ../xLights/outputs/xxxEthernetOutput.cpp: ../xLights/UtilFunctions.h +../xLights/outputs/TwinklyOutput.cpp: ../xLights/UtilFunctions.h ../xLights/Discovery.h ../xLights/OutputModelManager.h + +../xLights/utils/CurlManager.cpp: ../xLights/xLightsVersion.h + ../xLights/outputs/Output.cpp: ../xLights/UtilFunctions.h ../xLights/outputs/OutputManager.cpp: ../xLights/Parallel.h ../xLights/UtilFunctions.h @@ -1792,28 +1800,24 @@ PlayList/PlayListItemMIDI.cpp: ../xLights/UtilFunctions.h ../xLights/outputs/TestPreset.cpp: ../xLights/UtilFunctions.h +ConfigureMIDITimecodeDialog.cpp: ConfigureMIDITimecodeDialog.h + +ButtonDetailsDialog.cpp: ButtonDetailsDialog.h xScheduleMain.h CommandManager.h + City.cpp: City.h ColourOrderDialog.cpp: ColourOrderDialog.h xScheduleMain.h ScheduleManager.h CommandManager.cpp: CommandManager.h ScheduleManager.h Schedule.h -ConfigureMIDITimecodeDialog.cpp: ConfigureMIDITimecodeDialog.h - -ButtonDetailsDialog.cpp: ButtonDetailsDialog.h xScheduleMain.h CommandManager.h - ConfigureOSC.cpp: ConfigureOSC.h ScheduleOptions.h OSCPacket.h ConfigureTest.cpp: ConfigureTest.h ScheduleOptions.h DeadChannelDialog.cpp: DeadChannelDialog.h xScheduleMain.h ScheduleManager.h -DimDialog.cpp: DimDialog.h xScheduleMain.h ScheduleManager.h - ../xLights/xLightsTimer.cpp: ../xLights/xLightsTimer.h -../xLights/outputs/OPCOutput.cpp: ../xLights/UtilFunctions.h - ../xLights/xLightsVersion.cpp: ../xLights/xLightsVersion.h AddReverseDialog.cpp: AddReverseDialog.h xScheduleMain.h ScheduleManager.h @@ -1828,8 +1832,6 @@ Blend.cpp: Blend.h ../xLights/controllers/Falcon.cpp: ../xLights/UtilFunctions.h -../xLights/UtilFunctions.cpp: ../xLights/UtilFunctions.h ../xLights/xLightsVersion.h ../xLights/ExternalHooks.h - ../xLights/outputs/ArtNetOutput.cpp: ../xLights/UtilFunctions.h ../xLights/OutputModelManager.h ../xLights/SpecialOptions.h ../xLights/Discovery.h ../xLights/outputs/Controller.cpp: ../xLights/UtilFunctions.h ../xLights/OutputModelManager.h @@ -1840,22 +1842,6 @@ Blend.cpp: Blend.h ../xLights/FSEQFile.cpp: ../xLights/FSEQFile.h ../include/zstd.h -../xLights/JobPool.cpp: ../xLights/JobPool.h ../xLights/ExternalHooks.h ../xLights/TraceLog.h - -../xLights/Parallel.cpp: ../xLights/Parallel.h ../xLights/JobPool.h - -../xLights/SequenceData.cpp: ../xLights/SequenceData.h ../xLights/UtilFunctions.h - -../xLights/TraceLog.cpp: ../xLights/TraceLog.h - -../xLights/outputs/KinetOutput.cpp: ../xLights/UtilFunctions.h - -../xLights/outputs/LOROptimisedOutput.cpp: ../xLights/OutputModelManager.h ../xLights/UtilFunctions.h - -../xLights/outputs/LorController.cpp: ../xLights/UtilFunctions.h - -../xLights/outputs/NullOutput.cpp: ../xLights/OutputModelManager.h - ../xLights/outputs/ControllerEthernet.cpp: ../xLights/UtilFunctions.h ../xLights/SpecialOptions.h ../xLights/OutputModelManager.h ../xLights/xLightsMain.h ../xLights/xLightsMain.h: ../xLights/PixelBuffer.h ../xLights/SequenceData.h ../xLights/xLightsTimer.h ../xLights/JobPool.h ../xLights/SequenceViewManager.h ../xLights/ColorManager.h ../xLights/ViewpointMgr.h ../xLights/PhonemeDictionary.h ../xLights/xLightsXmlFile.h ../xLights/RenderCache.h ../xLights/OutputModelManager.h ../xLights/SequencePackage.h ../xLights/ScriptsDialog.h ../xLights/TipOfTheDayDialog.h @@ -1872,25 +1858,45 @@ Blend.cpp: Blend.h ../xLights/DataLayer.h: ../xLights/SequenceData.h +../xLights/JobPool.cpp: ../xLights/JobPool.h ../xLights/ExternalHooks.h ../xLights/TraceLog.h + +../xLights/Parallel.cpp: ../xLights/Parallel.h ../xLights/JobPool.h + +../xLights/SequenceData.cpp: ../xLights/SequenceData.h ../xLights/UtilFunctions.h + +../xLights/TraceLog.cpp: ../xLights/TraceLog.h + +../xLights/UtilFunctions.cpp: ../xLights/UtilFunctions.h ../xLights/xLightsVersion.h ../xLights/ExternalHooks.h + +../xLights/outputs/LorController.cpp: ../xLights/UtilFunctions.h + +../xLights/outputs/KinetOutput.cpp: ../xLights/UtilFunctions.h + +../xLights/outputs/LOROptimisedOutput.cpp: ../xLights/OutputModelManager.h ../xLights/UtilFunctions.h + +../xLights/outputs/NullOutput.cpp: ../xLights/OutputModelManager.h + +../xLights/outputs/OPCOutput.cpp: ../xLights/UtilFunctions.h + ../xLights/outputs/ControllerNull.cpp: ../xLights/UtilFunctions.h ../xLights/SpecialOptions.h ../xLights/OutputModelManager.h ../xLights/outputs/ControllerSerial.cpp: ../xLights/OutputModelManager.h ../xLights/UtilFunctions.h ../xLights/SpecialOptions.h ../xLights/outputs/DDPOutput.cpp: ../xLights/UtilFunctions.h ../xLights/OutputModelManager.h ../xLights/Discovery.h -../xLights/outputs/E131Output.cpp: ../xLights/UtilFunctions.h +DimDialog.cpp: DimDialog.h xScheduleMain.h ScheduleManager.h -PlayList/PlayListItemColourOrgan.cpp: ../xLights/AudioManager.h +../xLights/outputs/E131Output.cpp: ../xLights/UtilFunctions.h PlayList/PlayListItemAudio.cpp: ../xLights/AudioManager.h ../xLights/UtilFunctions.h PlayList/PlayListItemAudioPanel.cpp: ../xLights/AudioManager.h -PlayList/PlayListItemColourOrganPanel.cpp: xScheduleMain.h ScheduleManager.h ../xLights/AudioManager.h +PlayList/PlayListItemAllOffPanel.cpp: xScheduleMain.h ScheduleManager.h -PlayList/PlayListItemDim.cpp: ../xLights/Parallel.h +PlayList/PlayListItemColourOrgan.cpp: ../xLights/AudioManager.h -PlayList/PlayListItem.cpp: xScheduleMain.h ScheduleManager.h ScheduleOptions.h ../xLights/AudioManager.h RunningSchedule.h +PlayList/PlayListItemColourOrganPanel.cpp: xScheduleMain.h ScheduleManager.h ../xLights/AudioManager.h OutputProcessingDialog.cpp: OutputProcessingDialog.h OutputProcessDimWhite.h OutputProcessThreeToFour.h OutputProcessColourOrder.h OutputProcessReverse.h OutputProcessDim.h OutputProcessExcludeDim.h OutputProcessSet.h OutputProcessRemap.h OutputProcessDeadChannel.h OutputProcessSustain.h DimDialog.h ExcludeDimDialog.h DimWhiteDialog.h ThreeToFourDialog.h SetDialog.h RemapDialog.h ColourOrderDialog.h AddReverseDialog.h GammaDialog.h OutputProcessGamma.h DeadChannelDialog.h SustainDialog.h @@ -1920,16 +1926,18 @@ PlayList/PlayList.cpp: Schedule.h xScheduleMain.h ScheduleOptions.h xScheduleApp PlayList/PlayListDialog.cpp: MyTreeItemData.h ../xLights/UtilFunctions.h +PlayList/PlayListItemDim.cpp: ../xLights/Parallel.h + +PlayList/PlayListItem.cpp: xScheduleMain.h ScheduleManager.h ScheduleOptions.h ../xLights/AudioManager.h RunningSchedule.h + PlayList/PlayListItemARTNetTrigger.cpp: Control.h ../xLights/UtilFunctions.h -PlayList/PlayListItemAllOffPanel.cpp: xScheduleMain.h ScheduleManager.h +PlayList/PlayListItemFSEQVideoPanel.cpp: xScheduleMain.h ScheduleManager.h ../xLights/FSEQFile.h ../xLights/AudioManager.h PlayList/PlayListItemFadePanel.cpp: xScheduleMain.h ScheduleManager.h PlayList/PlayListItemFile.cpp: xScheduleMain.h ScheduleManager.h -PlayList/PlayListItemFSEQVideoPanel.cpp: xScheduleMain.h ScheduleManager.h ../xLights/FSEQFile.h ../xLights/AudioManager.h - PlayList/PlayListItemImage.cpp: xScheduleApp.h xScheduleMain.h ScheduleManager.h ../xLights/UtilFunctions.h ScheduleOptions.h PlayList/PlayListItemJukebox.cpp: ../xLights/UtilFunctions.h @@ -1940,12 +1948,22 @@ PlayList/PlayListItemESEQ.cpp: ../xLights/UtilFunctions.h PlayList/PlayListItemFPPEvent.cpp: Control.h ../xLights/UtilFunctions.h +OutputProcessThreeToFour.cpp: OutputProcessThreeToFour.h + PlayList/PlayListItemFSEQ.cpp: ../xLights/AudioManager.h ../xLights/UtilFunctions.h ../xLights/FSEQFile.h PlayList/PlayListItemFSEQPanel.cpp: xScheduleMain.h ScheduleManager.h ../xLights/FSEQFile.h ../xLights/AudioManager.h PlayList/PlayListItemFSEQVideo.cpp: ../xLights/AudioManager.h ../xLights/VideoReader.h VideoCache.h xScheduleApp.h xScheduleMain.h ScheduleManager.h ../xLights/FSEQFile.h ../xLights/UtilFunctions.h ScheduleOptions.h +EventOSCPanel.cpp: EventOSCPanel.h EventDialog.h + +EventOSCPanel.h: EventPanel.h + +EventFPPCommandPresetPanel.cpp: EventFPPCommandPresetPanel.h + +EventFPPCommandPresetPanel.h: EventPanel.h + EventLorPanel.cpp: EventLorPanel.h EventLorPanel.h: EventPanel.h @@ -1958,14 +1976,6 @@ EventMQTTPanel.cpp: EventMQTTPanel.h EventDialog.h EventMQTTPanel.h: EventPanel.h -EventOSCPanel.cpp: EventOSCPanel.h EventDialog.h - -EventOSCPanel.h: EventPanel.h - -EventFPPCommandPresetPanel.cpp: EventFPPCommandPresetPanel.h - -EventFPPCommandPresetPanel.h: EventPanel.h - EventPingPanel.cpp: EventPingPanel.h EventPingPanel.h: EventPanel.h @@ -1980,15 +1990,11 @@ EventStatePanel.h: EventPanel.h EventsDialog.cpp: EventsDialog.h ScheduleOptions.h EventDialog.h -EventDataPanel.cpp: EventDataPanel.h EventDialog.h xScheduleMain.h ScheduleManager.h - -EventDataPanel.h: EventPanel.h - DimWhiteDialog.cpp: DimWhiteDialog.h xScheduleMain.h ScheduleManager.h ESEQFile.cpp: ESEQFile.h ../xLights/UtilFunctions.h -ESEQFile.h: Blend.h +ESEQFile.h: Blend.h ../xLights/FSEQFile.h EventARTNetPanel.cpp: EventARTNetPanel.h @@ -1998,7 +2004,9 @@ EventARTNetTriggerPanel.cpp: EventARTNetTriggerPanel.h EventARTNetTriggerPanel.h: EventPanel.h -ExcludeDimDialog.cpp: ExcludeDimDialog.h xScheduleMain.h ScheduleManager.h +EventDataPanel.cpp: EventDataPanel.h EventDialog.h xScheduleMain.h ScheduleManager.h + +EventDataPanel.h: EventPanel.h EventDialog.cpp: EventDialog.h EventE131Panel.h EventDataPanel.h EventSerialPanel.h EventLorPanel.h EventARTNetPanel.h EventARTNetTriggerPanel.h EventPingPanel.h EventOSCPanel.h EventFPPPanel.h EventFPPCommandPresetPanel.h EventMIDIPanel.h EventMQTTPanel.h EventStatePanel.h xScheduleMain.h ScheduleManager.h CommandManager.h @@ -2010,7 +2018,7 @@ EventE131Panel.cpp: EventE131Panel.h EventFPPPanel.cpp: EventFPPPanel.h -OutputProcessExcludeDim.cpp: OutputProcessExcludeDim.h +OutputProcessDimWhite.cpp: OutputProcessDimWhite.h OutputProcessExcludeDim.h OptionsDialog.cpp: OptionsDialog.h ScheduleOptions.h ButtonDetailsDialog.h UserButton.h CommandManager.h ../xLights/xLightsVersion.h ../xLights/AudioManager.h City.h ../xLights/UtilFunctions.h xScheduleMain.h ScheduleManager.h @@ -2022,7 +2030,9 @@ OutputProcessDeadChannel.cpp: OutputProcessDeadChannel.h OutputProcessDim.cpp: OutputProcessDim.h OutputProcessExcludeDim.h -OutputProcessDimWhite.cpp: OutputProcessDimWhite.h OutputProcessExcludeDim.h +OSCPacket.cpp: OSCPacket.h ../xLights/UtilFunctions.h ScheduleOptions.h + +OutputProcessExcludeDim.cpp: OutputProcessExcludeDim.h OutputProcessGamma.cpp: OutputProcessGamma.h OutputProcessExcludeDim.h @@ -2034,7 +2044,9 @@ OutputProcessSet.cpp: OutputProcessSet.h OutputProcessSustain.cpp: OutputProcessSustain.h -OutputProcessThreeToFour.cpp: OutputProcessThreeToFour.h +GammaDialog.cpp: GammaDialog.h xScheduleMain.h ScheduleManager.h + +ExcludeDimDialog.cpp: ExcludeDimDialog.h xScheduleMain.h ScheduleManager.h ExtraIPDialog.cpp: ExtraIPDialog.h @@ -2044,8 +2056,6 @@ ExtraIPsDialog.cpp: ExtraIPsDialog.h ExtraIPDialog.h FPPRemotesDialog.cpp: FPPRemotesDialog.h -GammaDialog.cpp: GammaDialog.h xScheduleMain.h ScheduleManager.h - ../common/xlBaseApp.cpp: ../xLights/ExternalHooks.h ../xLights/xLightsVersion.h MatricesDialog.cpp: MatricesDialog.h MatrixMapper.h MatrixDialog.h @@ -2054,7 +2064,5 @@ MatrixDialog.cpp: MatrixDialog.h xScheduleMain.h ScheduleManager.h MatrixMapper.cpp: MatrixMapper.h -OSCPacket.cpp: OSCPacket.h ../xLights/UtilFunctions.h ScheduleOptions.h - .PHONY: before_linux_debug after_linux_debug clean_linux_debug before_linux_release after_linux_release clean_linux_release