├── .clang-format ├── .gitignore ├── .gitmodules ├── CMakeLists.txt ├── LICENSE ├── Makefile ├── Project.xcconfig ├── README.md ├── RPI_listeners ├── udpLPD8806 ├── udpLPD8806.c ├── udpWS281x └── udpWS281x.c ├── addons.make ├── bin ├── data │ ├── .gitkeep │ ├── grab.frag │ ├── grab.vert │ ├── gui │ │ ├── mouse_grab_circle.jpg │ │ ├── mouse_grab_line.jpg │ │ ├── mouse_grab_matrix.jpg │ │ └── mouse_select.jpg │ ├── icon.icns │ └── ofxbraitsch │ │ ├── fonts │ │ ├── MavenPro-Medium.ttf │ │ ├── MavenPro-Regular.ttf │ │ └── Verdana.ttf │ │ └── ofxdatgui │ │ ├── icon-group-closed.png │ │ ├── icon-group-open.png │ │ ├── icon-radio-off.png │ │ ├── icon-radio-on.png │ │ └── picker-rainbow.png └── lm-enigma.evb ├── config.make ├── icon.rc ├── images ├── RPI_3_ledMapper_pinout.png ├── ledMapper_icon_200.png └── ledMapper_screenshot.png ├── ledMapper.sln ├── ledMapper.vcxproj ├── ledMapper.vcxproj.filters ├── ledMapper.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ ├── ledMapper Debug.xcscheme │ └── ledMapper Release.xcscheme ├── ledmapper_icon.ico ├── openFrameworks-Info.plist └── src ├── Player.cpp ├── Player.h ├── ledMapperApp.cpp ├── ledMapperApp.h └── main.cpp /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | ConstructorInitializerIndentWidth: 4 4 | AccessModifierOffset: -4 5 | ConstructorInitializerIndentWidth: 4 6 | AlignEscapedNewlinesLeft: false 7 | AlignTrailingComments: false 8 | AllowAllParametersOfDeclarationOnNextLine: true 9 | AllowShortBlocksOnASingleLine: true 10 | AllowShortIfStatementsOnASingleLine: false 11 | AllowShortLoopsOnASingleLine: false 12 | AllowShortFunctionsOnASingleLine: All 13 | AlwaysBreakTemplateDeclarations: false 14 | AlwaysBreakBeforeMultilineStrings: false 15 | BreakBeforeBinaryOperators: true 16 | BreakBeforeTernaryOperators: true 17 | BreakConstructorInitializersBeforeComma: true 18 | BinPackParameters: true 19 | ColumnLimit: 100 20 | ConstructorInitializerAllOnOneLineOrOnePerLine: false 21 | DerivePointerAlignment: false 22 | ExperimentalAutoDetectBinPacking: false 23 | IndentCaseLabels: true 24 | IndentWrappedFunctionNames: false 25 | IndentFunctionDeclarationAfterType: false 26 | MaxEmptyLinesToKeep: 1 27 | KeepEmptyLinesAtTheStartOfBlocks: true 28 | NamespaceIndentation: None 29 | ObjCSpaceAfterProperty: true 30 | ObjCSpaceBeforeProtocolList: true 31 | PenaltyBreakBeforeFirstCallParameter: 19 32 | PenaltyBreakComment: 300 33 | PenaltyBreakString: 1000 34 | PenaltyBreakFirstLessLess: 120 35 | PenaltyExcessCharacter: 1000000 36 | PenaltyReturnTypeOnItsOwnLine: 60 37 | PointerAlignment: Right 38 | SpacesBeforeTrailingComments: 1 39 | Cpp11BracedListStyle: false 40 | Standard: Cpp11 41 | IndentWidth: 4 42 | TabWidth: 4 43 | UseTab: Never 44 | BreakBeforeBraces: Stroustrup 45 | SpacesInParentheses: false 46 | SpacesInAngles: false 47 | SpaceInEmptyParentheses: false 48 | SpacesInCStyleCastParentheses: false 49 | SpacesInContainerLiterals: true 50 | SpaceBeforeAssignmentOperators: true 51 | ContinuationIndentWidth: 4 52 | CommentPragmas: '^ IWYU pragma:' 53 | ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] 54 | SpaceBeforeParens: ControlStatements 55 | DisableFormat: false 56 | ... 57 | 58 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea 3 | cmake-build-debug 4 | 5 | *.xcbkptlist 6 | 7 | ## User settings 8 | xcuserdata/ 9 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 10 | *.xcscmblueprint 11 | *.xccheckout 12 | 13 | # Compiled Object files 14 | *.slo 15 | *.lo 16 | *.o 17 | 18 | # Compiled Dynamic libraries 19 | *.so 20 | *.dylib 21 | 22 | # Compiled Static libraries 23 | *.lai 24 | *.la 25 | *.a 26 | 27 | *.app 28 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "rpi_ws281x"] 2 | path = rpi_ws281x 3 | url = https://github.com/techtim/rpi_ws281x.git 4 | [submodule "rpi_sk9822"] 5 | path = rpi_sk9822 6 | url = https://github.com/techtim/rpi_sk9822.git 7 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # ======================= ofxCMake Vers. 0.1 ============= 2 | # PUT THIS FILE INTO YOUR OPENFRAMEWORKS PROJECT FOLDER 3 | 4 | # ======================================================== 5 | # ===================== CMake Settings =================== 6 | # ======================================================== 7 | cmake_minimum_required( VERSION 3.3 ) 8 | project( openframeworks ) 9 | 10 | # ======================================================== 11 | # ===================== User Settings ==================== 12 | # ======================================================== 13 | # ---------------------- App name ----------------------- 14 | set( APP_NAME ledMapper ) 15 | 16 | # ------------------------ OF Path ----------------------- 17 | # --- If outside the OF structure, set an absolute OF path 18 | set( OF_DIRECTORY_BY_USER "../../.." ) 19 | 20 | # --------------------- Source Files --------------------- 21 | set( ${APP_NAME}_SOURCE_FILES 22 | src/main.cpp 23 | src/ledMapperApp.cpp 24 | src/Player.cpp ) 25 | 26 | 27 | # ------------------------ AddOns ----------------------- 28 | set( OFX_ADDONS_ACTIVE 29 | ofxXmlSettings 30 | ofxPoco 31 | ofxNetwork 32 | ofxDatGui 33 | ofxLedMapper 34 | ofxSyphon 35 | ofxMidi ) 36 | 37 | # ========================================================================= 38 | # ============================== OpenFrameworks =========================== 39 | # ========================================================================= 40 | include( ${OF_DIRECTORY_BY_USER}/addons/ofxCMake/modules/main.cmake ) 41 | # ========================================================================= 42 | 43 | if( APPLE ) # Set App icon 44 | set_source_files_properties(ledMapper.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") 45 | endif() 46 | 47 | ADD_CUSTOM_COMMAND( 48 | TARGET ${APP_NAME} 49 | POST_BUILD 50 | COMMAND rsync 51 | ARGS -av --exclude='.DS_Store' 52 | "${PROJECT_SOURCE_DIR}/bin/data/" 53 | "${PROJECT_SOURCE_DIR}/bin/${APP_NAME}.app/Contents/Resources" 54 | COMMENT "Copying Bundle Stuff") -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {description} 294 | Copyright (C) {year} {fullname} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Attempt to load a config.make file. 2 | # If none is found, project defaults in config.project.make will be used. 3 | ifneq ($(wildcard config.make),) 4 | include config.make 5 | endif 6 | 7 | # make sure the the OF_ROOT location is defined 8 | ifndef OF_ROOT 9 | OF_ROOT=$(realpath ../../..) 10 | endif 11 | 12 | # call the project makefile! 13 | include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk 14 | -------------------------------------------------------------------------------- /Project.xcconfig: -------------------------------------------------------------------------------- 1 | //THE PATH TO THE ROOT OF OUR OF PATH RELATIVE TO THIS PROJECT. 2 | //THIS NEEDS TO BE DEFINED BEFORE CoreOF.xcconfig IS INCLUDED 3 | OF_PATH = ../../.. 4 | 5 | //THIS HAS ALL THE HEADER AND LIBS FOR OF CORE 6 | #include "../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig" 7 | 8 | //ICONS - NEW IN 0072 9 | ICON_NAME_DEBUG = icon-debug.icns 10 | ICON_NAME_RELEASE = icon.icns 11 | ICON_FILE_PATH = $(OF_PATH)/libs/openFrameworksCompiled/project/osx/ 12 | 13 | //IF YOU WANT AN APP TO HAVE A CUSTOM ICON - PUT THEM IN YOUR DATA FOLDER AND CHANGE ICON_FILE_PATH to: 14 | //ICON_FILE_PATH = bin/data/ 15 | 16 | OTHER_CFLAGS = $(OF_CORE_CFLAGS) 17 | OTHER_LDFLAGS = $(OF_CORE_LIBS) $(OF_CORE_FRAMEWORKS) 18 | HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS) 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | ledMapper icon

3 | 4 | ledMapper 5 | === 6 | 7 | Open-source application for receiving input from Syphon/Spout or built-in video player and mapping it to distributed ligting system based on network connected RaspberryPi clients serving as controllers for digital LED ICs like LPD8806, WS281X, SK9822, SK6822, etc. 8 | 9 |

10 | ledMapper screenshot

11 | 12 | Check [Interface Description](https://github.com/techtim/ledMapper/wiki/ledMapper-Interface) page for details. 13 | 14 | Try out compiled apps for Windows and OSX and image for RaspberryPi 3 on [TVL website](https://tvl.io/soft/ledMapper/) 15 | 16 | ### Raspberry Pi 17 | 18 | C++ based UDP listener, listen localhost:3001 and sending data to GPIO pins. (https://github.com/techtim/lmListener) 19 | 20 | Pin numbers depends on LED IC type: 21 | - LPD8806/SK9822 - SCK > GPIO11 (SPI_CLK), DATA > GPIO10 (SPI_MOSI) 22 | - WS281X driver from https://github.com/jgarff/rpi_ws281x using 2 channel PWM on GPIO12 and GPIO13 23 | 24 | RPI LED connection scheme 25 | 26 | __RPI2/3:__ SK9822/APA102/LPD8806 (BLUE PINS) 27 | __RPI2/3:__ WS2812 (GREEN PINS) -------------------------------------------------------------------------------- /RPI_listeners/udpLPD8806: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/RPI_listeners/udpLPD8806 -------------------------------------------------------------------------------- /RPI_listeners/udpLPD8806.c: -------------------------------------------------------------------------------- 1 | /* 2 | * udp_listen.c 3 | * 4 | * Tim Tavlintsev 2016 < tim@tvl.io > 5 | * 6 | * Illustrate simple UDP connection 7 | * It opens a blocking socket and 8 | * listens for messages in a for loop. It takes the name of the machine 9 | * that it will be listening on as argument. 10 | * Then messages sending to SPI GPIO pins using lpd8806 lib (https://github.com/eranrund/blinky-pants/tree/master/lpd) 11 | */ 12 | 13 | // compile using: 14 | // sudo gcc -lm ./lpd8806led.c ./udpLPD8806.c -o udpLPD8806 15 | 16 | #include 17 | #include 18 | #include 19 | 20 | #include "lpd8806led.h" 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | static const char *device = "/dev/spidev0.0"; 31 | static const int leds = 2000; 32 | static const int message_size = 2048*3; 33 | static int continue_looping; 34 | 35 | #define SERVER_PORT 3000 36 | 37 | void stop_program(int sig); 38 | void HSVtoRGB(double h, double s, double v, double *r, double *g, double *b); 39 | 40 | 41 | main(int argc, char *argv[]) { 42 | char message[message_size]; 43 | int sock; 44 | struct sockaddr_in name; 45 | struct hostent *hp, *gethostbyname(); 46 | int bytes; 47 | 48 | printf("Listen activating.\n"); 49 | 50 | /* Create socket from which to read */ 51 | sock = socket(AF_INET, SOCK_DGRAM, 0); 52 | if (sock < 0) { 53 | perror("Opening datagram socket"); 54 | exit(1); 55 | } 56 | 57 | /* Bind our local address so that the client can send to us */ 58 | bzero((char *) &name, sizeof(name)); 59 | name.sin_family = AF_INET; 60 | name.sin_addr.s_addr = htonl(INADDR_ANY); 61 | name.sin_port = htons(SERVER_PORT); 62 | 63 | if (bind(sock, (struct sockaddr *) &name, sizeof(name))) { 64 | perror("binding datagram socket"); 65 | exit(1); 66 | } 67 | 68 | printf("Socket has port number #%d\n", ntohs(name.sin_port)); 69 | // -------- LPD8806 ---------- 70 | lpd8806_buffer buf; 71 | int fd; 72 | int return_value; 73 | lpd8806_color *p; 74 | int i; 75 | double h, r, g, b; 76 | 77 | /* Open the device file using Low-Level IO */ 78 | fd = open(device,O_WRONLY); 79 | if(fd<0) { 80 | fprintf(stderr,"Error %d: %s\n",errno,strerror(errno)); 81 | exit(1); 82 | } 83 | 84 | /* Initialize the SPI bus for Total Control Lighting */ 85 | return_value = spi_init(fd); 86 | if(return_value==-1) { 87 | fprintf(stderr,"SPI initialization error %d: %s\n",errno, strerror(errno)); 88 | exit(1); 89 | } 90 | 91 | /* Initialize pixel buffer */ 92 | if(lpd8806_init(&buf,leds)<0) { 93 | fprintf(stderr,"Pixel buffer initialization error: Not enough memory.\n"); 94 | exit(1); 95 | } 96 | 97 | /* Set the gamma correction factors for each color */ 98 | set_gamma(2.2,2.2,2.2); 99 | 100 | /* Blank the pixels */ 101 | for(i=0;i 0) { 111 | // message[bytes] = '\0'; 112 | // printf("recv: %s\n", message); 113 | printf("%d %d %d\n",message[i*3+0], message[i*3+1], message[i*3+2]); 114 | 115 | for (i=0; i < bytes/3; i++) { 116 | write_gamma_color(&buf.pixels[i], message[i*3+0], message[i*3+1], message[i*3+2]); 117 | } 118 | send_buffer(fd,&buf); 119 | 120 | usleep(1000); 121 | } 122 | } 123 | 124 | for(i=0;i 5 | * Copyright (c) 2014 Jeremy Garff 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without modification, are permitted 10 | * provided that the following conditions are met: 11 | * 12 | * 1. Redistributions of source code must retain the above copyright notice, this list of 13 | * conditions and the following disclaimer. 14 | * 2. Redistributions in binary form must reproduce the above copyright notice, this list 15 | * of conditions and the following disclaimer in the documentation and/or other materials 16 | * provided with the distribution. 17 | * 3. Neither the name of the owner nor the names of its contributors may be used to endorse 18 | * or promote products derived from this software without specific prior written permission. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 21 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 22 | * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE 23 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 25 | * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 27 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | * 29 | */ 30 | 31 | // compile using: scons 32 | // sudo apt-get install scons 33 | 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | #include 40 | #include 41 | #include 42 | #include 43 | #include 44 | 45 | #include 46 | #include 47 | #include 48 | 49 | #include "clk.h" 50 | #include "gpio.h" 51 | #include "dma.h" 52 | #include "pwm.h" 53 | 54 | #include "ws2811.h" 55 | 56 | 57 | #define ARRAY_SIZE(stuff) (sizeof(stuff) / sizeof(stuff[0])) 58 | #define TARGET_FREQ WS2811_TARGET_FREQ 59 | #define GPIO_PIN 18 60 | #define GPIO_PIN_2 17 61 | #define DMA 5 62 | #define LED_COUNT 1024 63 | #define MESSAGE_SIZE 1024*3 64 | 65 | #define SERVER_PORT 3000 66 | 67 | ws2811_t ledstring = 68 | { 69 | .freq = TARGET_FREQ, 70 | .dmanum = DMA, 71 | .channel = 72 | { 73 | [0] = 74 | { 75 | .gpionum = GPIO_PIN, 76 | .count = LED_COUNT, 77 | .invert = 0, 78 | .brightness = 255, 79 | }, 80 | [1] = 81 | { 82 | .gpionum = 0, 83 | .count = 0, 84 | .invert = 0, 85 | .brightness = 255, 86 | }, 87 | }, 88 | }; 89 | 90 | 91 | static void ctrl_c_handler(int signum) 92 | { 93 | ws2811_fini(&ledstring); 94 | } 95 | 96 | static void setup_handlers(void) 97 | { 98 | struct sigaction sa = 99 | { 100 | .sa_handler = ctrl_c_handler, 101 | }; 102 | 103 | sigaction(SIGKILL, &sa, NULL); 104 | } 105 | 106 | int main(int argc, char *argv[]) 107 | { 108 | int ret = 0; 109 | setup_handlers(); 110 | 111 | // --- WS281x SETUP --- 112 | 113 | if (ws2811_init(&ledstring)) 114 | { 115 | printf("ws2811_init failed!\n"); 116 | return -1; 117 | } 118 | 119 | // --- UDP SETUP --- 120 | char message[MESSAGE_SIZE]; 121 | int sock; 122 | struct sockaddr_in name; 123 | //struct hostent *hp, *gethostbyname(); 124 | int bytes; 125 | 126 | printf("Listen activating.\n"); 127 | 128 | /* Create socket from which to read */ 129 | sock = socket(AF_INET, SOCK_DGRAM, 0); 130 | if (sock < 0) { 131 | perror("Opening datagram socket"); 132 | exit(1); 133 | } 134 | 135 | /* Bind our local address so that the client can send to us */ 136 | bzero((char *) &name, sizeof(name)); 137 | name.sin_family = AF_INET; 138 | name.sin_addr.s_addr = htonl(INADDR_ANY); 139 | name.sin_port = htons(SERVER_PORT); 140 | 141 | if (bind(sock, (struct sockaddr *) &name, sizeof(name))) { 142 | perror("binding datagram socket"); 143 | exit(1); 144 | } 145 | 146 | printf("Socket has port number #%d\n", ntohs(name.sin_port)); 147 | 148 | int i; 149 | 150 | while (1) 151 | { 152 | while ((bytes = read(sock, message, MESSAGE_SIZE)) > 0) { 153 | // message[bytes] = '\0'; 154 | // printf("recv: %s\n", message); 155 | // printf("%d %d %d\n",message[i*3+0], message[i*3+1], message[i*3+2]); 156 | 157 | for (i=0; i < bytes/3; i++) { 158 | ledstring.channel[0].leds[i] = (message[i*3+0] << 16) | (message[i*3+1] << 8) | message[i*3+2]; 159 | // &buf.pixels[i], message[i*3+0], message[i*3+1], message[i*3+2]); 160 | } 161 | if (ws2811_render(&ledstring)) 162 | { 163 | ret = -1; 164 | break; 165 | } 166 | 167 | // 15 frames /sec 168 | // usleep(1000000 / 15); 169 | usleep(1000000 / 60); 170 | 171 | } 172 | } 173 | 174 | ws2811_fini(&ledstring); 175 | 176 | return ret; 177 | } 178 | 179 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /addons.make: -------------------------------------------------------------------------------- 1 | ofxDatGui 2 | ofxLedMapper 3 | ofxNetwork 4 | ofxSyphon 5 | ofxSpout2 6 | ofxXmlSettings 7 | -------------------------------------------------------------------------------- /bin/data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/.gitkeep -------------------------------------------------------------------------------- /bin/data/grab.frag: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | uniform sampler2DRect texIn; 4 | in vec2 ledPos; 5 | out vec4 vFragColor; 6 | 7 | vec4 colorConvert(vec4 col) { 8 | return vec4(col.g, col.b, col.r, 1.0); 9 | } 10 | 11 | void main() 12 | { 13 | vFragColor = colorConvert(texture(texIn, ledPos)); 14 | } 15 | 16 | -------------------------------------------------------------------------------- /bin/data/grab.vert: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | precision mediump float; 4 | uniform mat4 modelViewProjectionMatrix; 5 | uniform ivec2 outTexResolution; 6 | 7 | layout(location = 0) in vec3 VertexPosition; 8 | out vec2 ledPos; 9 | 10 | void main() 11 | { 12 | ledPos = VertexPosition.xy; 13 | gl_Position = modelViewProjectionMatrix 14 | * vec4(gl_VertexID % outTexResolution.x, 1+floor(gl_VertexID / outTexResolution.x), 15 | 0.0, 1.0); 16 | } -------------------------------------------------------------------------------- /bin/data/gui/mouse_grab_circle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/gui/mouse_grab_circle.jpg -------------------------------------------------------------------------------- /bin/data/gui/mouse_grab_line.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/gui/mouse_grab_line.jpg -------------------------------------------------------------------------------- /bin/data/gui/mouse_grab_matrix.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/gui/mouse_grab_matrix.jpg -------------------------------------------------------------------------------- /bin/data/gui/mouse_select.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/gui/mouse_select.jpg -------------------------------------------------------------------------------- /bin/data/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/icon.icns -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/fonts/MavenPro-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/fonts/MavenPro-Medium.ttf -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/fonts/MavenPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/fonts/MavenPro-Regular.ttf -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/fonts/Verdana.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/fonts/Verdana.ttf -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/ofxdatgui/icon-group-closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/ofxdatgui/icon-group-closed.png -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/ofxdatgui/icon-group-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/ofxdatgui/icon-group-open.png -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/ofxdatgui/icon-radio-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/ofxdatgui/icon-radio-off.png -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/ofxdatgui/icon-radio-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/ofxdatgui/icon-radio-on.png -------------------------------------------------------------------------------- /bin/data/ofxbraitsch/ofxdatgui/picker-rainbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/bin/data/ofxbraitsch/ofxdatgui/picker-rainbow.png -------------------------------------------------------------------------------- /bin/lm-enigma.evb: -------------------------------------------------------------------------------- 1 |  2 | <> 3 | ledMapper.exe 4 | C:\Users\tim\source\repos\of10\apps\myApps\ledMapper\bin\ledMapper_boxed.exe 5 | 6 | True 7 | False 8 | False 9 | 10 | 11 | 3 12 | %DEFAULT FOLDER% 13 | 0 14 | False 15 | False 16 | 0 17 | 18 | 19 | 3 20 | data 21 | 0 22 | False 23 | False 24 | 0 25 | 26 | 27 | 3 28 | gui 29 | 0 30 | False 31 | False 32 | 0 33 | 34 | 35 | 2 36 | mouse_grab_circle.jpg 37 | data\gui\mouse_grab_circle.jpg 38 | False 39 | False 40 | 0 41 | False 42 | False 43 | False 44 | 0 45 | 46 | 47 | 2 48 | mouse_grab_line.jpg 49 | data\gui\mouse_grab_line.jpg 50 | False 51 | False 52 | 0 53 | False 54 | False 55 | False 56 | 0 57 | 58 | 59 | 2 60 | mouse_grab_matrix.jpg 61 | data\gui\mouse_grab_matrix.jpg 62 | False 63 | False 64 | 0 65 | False 66 | False 67 | False 68 | 0 69 | 70 | 71 | 2 72 | mouse_select.jpg 73 | data\gui\mouse_select.jpg 74 | False 75 | False 76 | 0 77 | False 78 | False 79 | False 80 | 0 81 | 82 | 83 | 84 | 85 | 2 86 | icon.icns 87 | data\icon.icns 88 | False 89 | False 90 | 0 91 | False 92 | False 93 | False 94 | 0 95 | 96 | 97 | 3 98 | ofxbraitsch 99 | 0 100 | False 101 | False 102 | 0 103 | 104 | 105 | 3 106 | fonts 107 | 0 108 | False 109 | False 110 | 0 111 | 112 | 113 | 2 114 | MavenPro-Medium.ttf 115 | data\ofxbraitsch\fonts\MavenPro-Medium.ttf 116 | False 117 | False 118 | 0 119 | False 120 | False 121 | False 122 | 0 123 | 124 | 125 | 2 126 | MavenPro-Regular.ttf 127 | data\ofxbraitsch\fonts\MavenPro-Regular.ttf 128 | False 129 | False 130 | 0 131 | False 132 | False 133 | False 134 | 0 135 | 136 | 137 | 2 138 | Verdana.ttf 139 | data\ofxbraitsch\fonts\Verdana.ttf 140 | False 141 | False 142 | 0 143 | False 144 | False 145 | False 146 | 0 147 | 148 | 149 | 150 | 151 | 3 152 | ofxdatgui 153 | 0 154 | False 155 | False 156 | 0 157 | 158 | 159 | 2 160 | icon-group-closed.png 161 | data\ofxbraitsch\ofxdatgui\icon-group-closed.png 162 | False 163 | False 164 | 0 165 | False 166 | False 167 | False 168 | 0 169 | 170 | 171 | 2 172 | icon-group-open.png 173 | data\ofxbraitsch\ofxdatgui\icon-group-open.png 174 | False 175 | False 176 | 0 177 | False 178 | False 179 | False 180 | 0 181 | 182 | 183 | 2 184 | icon-radio-off.png 185 | data\ofxbraitsch\ofxdatgui\icon-radio-off.png 186 | False 187 | False 188 | 0 189 | False 190 | False 191 | False 192 | 0 193 | 194 | 195 | 2 196 | icon-radio-on.png 197 | data\ofxbraitsch\ofxdatgui\icon-radio-on.png 198 | False 199 | False 200 | 0 201 | False 202 | False 203 | False 204 | 0 205 | 206 | 207 | 2 208 | picker-rainbow.png 209 | data\ofxbraitsch\ofxdatgui\picker-rainbow.png 210 | False 211 | False 212 | 0 213 | False 214 | False 215 | False 216 | 0 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 2 226 | fmodex64.dll 227 | fmodex64.dll 228 | False 229 | False 230 | 0 231 | False 232 | False 233 | False 234 | 0 235 | 236 | 237 | 2 238 | fmodexL64.dll 239 | fmodexL64.dll 240 | False 241 | False 242 | 0 243 | False 244 | False 245 | False 246 | 0 247 | 248 | 249 | 2 250 | FreeImage.dll 251 | FreeImage.dll 252 | False 253 | False 254 | 0 255 | False 256 | False 257 | False 258 | 0 259 | 260 | 261 | 262 | 263 | 264 | 265 | False 266 | 267 | 268 | 1 269 | True 270 | Classes 271 | 0 272 | 273 | 274 | 275 | 276 | 1 277 | True 278 | User 279 | 0 280 | 281 | 282 | 283 | 284 | 1 285 | True 286 | Machine 287 | 0 288 | 289 | 290 | 291 | 292 | 1 293 | True 294 | Users 295 | 0 296 | 297 | 298 | 299 | 300 | 1 301 | True 302 | Config 303 | 0 304 | 305 | 306 | 307 | 308 | 309 | 310 | False 311 | 312 | 313 | False 314 | True 315 | True 316 | 317 | 318 | -------------------------------------------------------------------------------- /config.make: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # CONFIGURE PROJECT MAKEFILE (optional) 3 | # This file is where we make project specific configurations. 4 | ################################################################################ 5 | 6 | ################################################################################ 7 | # OF ROOT 8 | # The location of your root openFrameworks installation 9 | # (default) OF_ROOT = ../../.. 10 | ################################################################################ 11 | # OF_ROOT = ../../.. 12 | 13 | ################################################################################ 14 | # PROJECT ROOT 15 | # The location of the project - a starting place for searching for files 16 | # (default) PROJECT_ROOT = . (this directory) 17 | # 18 | ################################################################################ 19 | # PROJECT_ROOT = . 20 | 21 | ################################################################################ 22 | # PROJECT SPECIFIC CHECKS 23 | # This is a project defined section to create internal makefile flags to 24 | # conditionally enable or disable the addition of various features within 25 | # this makefile. For instance, if you want to make changes based on whether 26 | # GTK is installed, one might test that here and create a variable to check. 27 | ################################################################################ 28 | # None 29 | 30 | ################################################################################ 31 | # PROJECT EXTERNAL SOURCE PATHS 32 | # These are fully qualified paths that are not within the PROJECT_ROOT folder. 33 | # Like source folders in the PROJECT_ROOT, these paths are subject to 34 | # exlclusion via the PROJECT_EXLCUSIONS list. 35 | # 36 | # (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) 37 | # 38 | # Note: Leave a leading space when adding list items with the += operator 39 | ################################################################################ 40 | # PROJECT_EXTERNAL_SOURCE_PATHS = 41 | 42 | ################################################################################ 43 | # PROJECT EXCLUSIONS 44 | # These makefiles assume that all folders in your current project directory 45 | # and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations 46 | # to look for source code. The any folders or files that match any of the 47 | # items in the PROJECT_EXCLUSIONS list below will be ignored. 48 | # 49 | # Each item in the PROJECT_EXCLUSIONS list will be treated as a complete 50 | # string unless teh user adds a wildcard (%) operator to match subdirectories. 51 | # GNU make only allows one wildcard for matching. The second wildcard (%) is 52 | # treated literally. 53 | # 54 | # (default) PROJECT_EXCLUSIONS = (blank) 55 | # 56 | # Will automatically exclude the following: 57 | # 58 | # $(PROJECT_ROOT)/bin% 59 | # $(PROJECT_ROOT)/obj% 60 | # $(PROJECT_ROOT)/%.xcodeproj 61 | # 62 | # Note: Leave a leading space when adding list items with the += operator 63 | ################################################################################ 64 | # PROJECT_EXCLUSIONS = 65 | 66 | ################################################################################ 67 | # PROJECT LINKER FLAGS 68 | # These flags will be sent to the linker when compiling the executable. 69 | # 70 | # (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs 71 | # 72 | # Note: Leave a leading space when adding list items with the += operator 73 | ################################################################################ 74 | 75 | # Currently, shared libraries that are needed are copied to the 76 | # $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to 77 | # add a runtime path to search for those shared libraries, since they aren't 78 | # incorporated directly into the final executable application binary. 79 | # TODO: should this be a default setting? 80 | # PROJECT_LDFLAGS=-Wl,-rpath=./libs 81 | 82 | ################################################################################ 83 | # PROJECT DEFINES 84 | # Create a space-delimited list of DEFINES. The list will be converted into 85 | # CFLAGS with the "-D" flag later in the makefile. 86 | # 87 | # (default) PROJECT_DEFINES = (blank) 88 | # 89 | # Note: Leave a leading space when adding list items with the += operator 90 | ################################################################################ 91 | # PROJECT_DEFINES = 92 | 93 | ################################################################################ 94 | # PROJECT CFLAGS 95 | # This is a list of fully qualified CFLAGS required when compiling for this 96 | # project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS 97 | # defined in your platform specific core configuration files. These flags are 98 | # presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. 99 | # 100 | # (default) PROJECT_CFLAGS = (blank) 101 | # 102 | # Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in 103 | # your platform specific configuration file will be applied by default and 104 | # further flags here may not be needed. 105 | # 106 | # Note: Leave a leading space when adding list items with the += operator 107 | ################################################################################ 108 | # PROJECT_CFLAGS = 109 | 110 | ################################################################################ 111 | # PROJECT OPTIMIZATION CFLAGS 112 | # These are lists of CFLAGS that are target-specific. While any flags could 113 | # be conditionally added, they are usually limited to optimization flags. 114 | # These flags are added BEFORE the PROJECT_CFLAGS. 115 | # 116 | # PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. 117 | # 118 | # (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) 119 | # 120 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. 121 | # 122 | # (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) 123 | # 124 | # Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the 125 | # PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration 126 | # file will be applied by default and further optimization flags here may not 127 | # be needed. 128 | # 129 | # Note: Leave a leading space when adding list items with the += operator 130 | ################################################################################ 131 | # PROJECT_OPTIMIZATION_CFLAGS_RELEASE = 132 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG = 133 | 134 | ################################################################################ 135 | # PROJECT COMPILERS 136 | # Custom compilers can be set for CC and CXX 137 | # (default) PROJECT_CXX = (blank) 138 | # (default) PROJECT_CC = (blank) 139 | # Note: Leave a leading space when adding list items with the += operator 140 | ################################################################################ 141 | # PROJECT_CXX = 142 | # PROJECT_CC = 143 | -------------------------------------------------------------------------------- /icon.rc: -------------------------------------------------------------------------------- 1 | // Icon Resource Definition 2 | #define MAIN_ICON 102 3 | 4 | #if defined(_DEBUG) 5 | MAIN_ICON ICON "ledmapper_icon.ico" 6 | #else 7 | MAIN_ICON ICON "ledmapper_icon.ico" 8 | #endif 9 | -------------------------------------------------------------------------------- /images/RPI_3_ledMapper_pinout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/images/RPI_3_ledMapper_pinout.png -------------------------------------------------------------------------------- /images/ledMapper_icon_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/images/ledMapper_icon_200.png -------------------------------------------------------------------------------- /images/ledMapper_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/images/ledMapper_screenshot.png -------------------------------------------------------------------------------- /ledMapper.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 15 3 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ledMapper", "ledMapper.vcxproj", "{7FD42DF7-442E-479A-BA76-D0022F99702A}" 4 | EndProject 5 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openframeworksLib", "..\..\..\libs\openFrameworksCompiled\project\vs\openframeworksLib.vcxproj", "{5837595D-ACA9-485C-8E76-729040CE4B0B}" 6 | EndProject 7 | Global 8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 9 | Debug|Win32 = Debug|Win32 10 | Debug|x64 = Debug|x64 11 | Release|Win32 = Release|Win32 12 | Release|x64 = Release|x64 13 | EndGlobalSection 14 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 15 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Debug|Win32.ActiveCfg = Debug|Win32 16 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Debug|Win32.Build.0 = Debug|Win32 17 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Debug|x64.ActiveCfg = Debug|x64 18 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Debug|x64.Build.0 = Debug|x64 19 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Release|Win32.ActiveCfg = Release|Win32 20 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Release|Win32.Build.0 = Release|Win32 21 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Release|x64.ActiveCfg = Release|x64 22 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Release|x64.Build.0 = Release|x64 23 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Debug|Win32.ActiveCfg = Debug|Win32 24 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Debug|Win32.Build.0 = Debug|Win32 25 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Debug|x64.ActiveCfg = Debug|x64 26 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Debug|x64.Build.0 = Debug|x64 27 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Release|Win32.ActiveCfg = Release|Win32 28 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Release|Win32.Build.0 = Release|Win32 29 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Release|x64.ActiveCfg = Release|x64 30 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Release|x64.Build.0 = Release|x64 31 | EndGlobalSection 32 | GlobalSection(SolutionProperties) = preSolution 33 | HideSolutionNode = FALSE 34 | EndGlobalSection 35 | EndGlobal 36 | -------------------------------------------------------------------------------- /ledMapper.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) 23 | $(LatestTargetPlatformVersion) 24 | $(WindowsTargetPlatformVersion) 25 | 26 | 27 | {7FD42DF7-442E-479A-BA76-D0022F99702A} 28 | Win32Proj 29 | ledMapper 30 | 31 | 32 | 33 | Application 34 | Unicode 35 | v141 36 | 37 | 38 | Application 39 | Unicode 40 | v141 41 | 42 | 43 | Application 44 | Unicode 45 | true 46 | v141 47 | 48 | 49 | Application 50 | Unicode 51 | true 52 | v141 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | bin\ 74 | obj\$(Configuration)\ 75 | $(ProjectName)_debug 76 | true 77 | true 78 | 79 | 80 | bin\ 81 | obj\$(Configuration)\ 82 | $(ProjectName)_debug 83 | true 84 | true 85 | 86 | 87 | bin\ 88 | obj\$(Configuration)\ 89 | false 90 | 91 | 92 | bin\ 93 | obj\$(Configuration)\ 94 | false 95 | 96 | 97 | 98 | Disabled 99 | EnableFastChecks 100 | %(PreprocessorDefinitions) 101 | MultiThreadedDebugDLL 102 | Level3 103 | %(AdditionalIncludeDirectories);src;..\..\..\addons\ofxDatGui\src;..\..\..\addons\ofxDatGui\src\components;..\..\..\addons\ofxDatGui\src\core;..\..\..\addons\ofxDatGui\src\libs;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data\raleway;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata\xcschemes;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\readme-img;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\themes;..\..\..\addons\ofxLedMapper\src;..\..\..\addons\ofxNetwork\src;..\..\..\addons\ofxSpout2\libs;..\..\..\addons\ofxSpout2\libs\include;..\..\..\addons\ofxSpout2\libs\src;..\..\..\addons\ofxSpout2\src;..\..\..\addons\ofxXmlSettings\libs;..\..\..\addons\ofxXmlSettings\src 104 | CompileAsCpp 105 | $(IntDir)/%(RelativeDir)/ 106 | 107 | 108 | true 109 | Console 110 | false 111 | %(AdditionalDependencies) 112 | %(AdditionalLibraryDirectories) 113 | 114 | 115 | 116 | 117 | 118 | Disabled 119 | EnableFastChecks 120 | %(PreprocessorDefinitions) 121 | MultiThreadedDebugDLL 122 | Level3 123 | %(AdditionalIncludeDirectories);src;..\..\..\addons\ofxDatGui\src;..\..\..\addons\ofxDatGui\src\components;..\..\..\addons\ofxDatGui\src\core;..\..\..\addons\ofxDatGui\src\libs;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data\raleway;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata\xcschemes;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\readme-img;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\themes;..\..\..\addons\ofxLedMapper\src;..\..\..\addons\ofxNetwork\src;..\..\..\addons\ofxSpout2\libs;..\..\..\addons\ofxSpout2\libs\include;..\..\..\addons\ofxSpout2\libs\src;..\..\..\addons\ofxSpout2\src;..\..\..\addons\ofxXmlSettings\libs;..\..\..\addons\ofxXmlSettings\src 124 | CompileAsCpp 125 | $(IntDir)/%(RelativeDir)/ 126 | true 127 | 128 | 129 | true 130 | Windows 131 | false 132 | %(AdditionalDependencies) 133 | %(AdditionalLibraryDirectories) 134 | 135 | 136 | 137 | 138 | 139 | false 140 | %(PreprocessorDefinitions) 141 | MultiThreadedDLL 142 | Level3 143 | %(AdditionalIncludeDirectories);src;..\..\..\addons\ofxDatGui\src;..\..\..\addons\ofxDatGui\src\components;..\..\..\addons\ofxDatGui\src\core;..\..\..\addons\ofxDatGui\src\libs;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data\raleway;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata\xcschemes;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\readme-img;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\themes;..\..\..\addons\ofxLedMapper\src;..\..\..\addons\ofxNetwork\src;..\..\..\addons\ofxSpout2\libs;..\..\..\addons\ofxSpout2\libs\include;..\..\..\addons\ofxSpout2\libs\src;..\..\..\addons\ofxSpout2\src;..\..\..\addons\ofxXmlSettings\libs;..\..\..\addons\ofxXmlSettings\src 144 | CompileAsCpp 145 | $(IntDir)/%(RelativeDir)/ 146 | true 147 | 148 | 149 | false 150 | false 151 | Console 152 | true 153 | true 154 | false 155 | %(AdditionalDependencies) 156 | %(AdditionalLibraryDirectories) 157 | 158 | 159 | 160 | 161 | 162 | false 163 | %(PreprocessorDefinitions) 164 | MultiThreadedDLL 165 | Level3 166 | %(AdditionalIncludeDirectories);src;..\..\..\addons\ofxDatGui\src;..\..\..\addons\ofxDatGui\src\components;..\..\..\addons\ofxDatGui\src\core;..\..\..\addons\ofxDatGui\src\libs;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\bin\data\raleway;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\example-ofxSmartFont.xcodeproj\xcshareddata\xcschemes;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\example-ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\readme-img;..\..\..\addons\ofxDatGui\src\libs\ofxSmartFont\src;..\..\..\addons\ofxDatGui\src\themes;..\..\..\addons\ofxLedMapper\src;..\..\..\addons\ofxNetwork\src;..\..\..\addons\ofxSpout2\libs;..\..\..\addons\ofxSpout2\libs\include;..\..\..\addons\ofxSpout2\libs\src;..\..\..\addons\ofxSpout2\src;..\..\..\addons\ofxXmlSettings\libs;..\..\..\addons\ofxXmlSettings\src 167 | CompileAsCpp 168 | $(IntDir)/%(RelativeDir)/ 169 | 170 | 171 | false 172 | false 173 | Windows 174 | true 175 | true 176 | false 177 | %(AdditionalDependencies) 178 | %(AdditionalLibraryDirectories) 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | {5837595d-aca9-485c-8e76-729040ce4b0b} 273 | 274 | 275 | 276 | 277 | /D_DEBUG %(AdditionalOptions) 278 | /D_DEBUG %(AdditionalOptions) 279 | $(OF_ROOT)\libs\openFrameworksCompiled\project\vs 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | -------------------------------------------------------------------------------- /ledMapper.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | src 6 | 7 | 8 | src 9 | 10 | 11 | src 12 | 13 | 14 | src 15 | 16 | 17 | addons\ofxDatGui\src\core 18 | 19 | 20 | addons\ofxDatGui\src\libs\ofxSmartFont\src 21 | 22 | 23 | addons\ofxDatGui\src 24 | 25 | 26 | addons\ofxLedMapper\src 27 | 28 | 29 | addons\ofxLedMapper\src 30 | 31 | 32 | addons\ofxNetwork\src 33 | 34 | 35 | addons\ofxNetwork\src 36 | 37 | 38 | addons\ofxNetwork\src 39 | 40 | 41 | addons\ofxNetwork\src 42 | 43 | 44 | addons\ofxNetwork\src 45 | 46 | 47 | addons\ofxSpout2\src 48 | 49 | 50 | addons\ofxSpout2\src 51 | 52 | 53 | addons\ofxSpout2\libs\src 54 | 55 | 56 | addons\ofxSpout2\libs\src 57 | 58 | 59 | addons\ofxSpout2\libs\src 60 | 61 | 62 | addons\ofxSpout2\libs\src 63 | 64 | 65 | addons\ofxSpout2\libs\src 66 | 67 | 68 | addons\ofxSpout2\libs\src 69 | 70 | 71 | addons\ofxSpout2\libs\src 72 | 73 | 74 | addons\ofxSpout2\libs\src 75 | 76 | 77 | addons\ofxSpout2\libs\src 78 | 79 | 80 | addons\ofxXmlSettings\src 81 | 82 | 83 | addons\ofxXmlSettings\libs 84 | 85 | 86 | addons\ofxXmlSettings\libs 87 | 88 | 89 | addons\ofxXmlSettings\libs 90 | 91 | 92 | addons\ofxLedMapper\src\output 93 | 94 | 95 | 96 | 97 | {d8376475-7454-4a24-b08a-aac121d3ad6f} 98 | 99 | 100 | {71834F65-F3A9-211E-73B8-DC85} 101 | 102 | 103 | {B36B06DF-1AA4-00D4-5A1B-6893} 104 | 105 | 106 | {CAA2E9BA-611F-99B2-780A-B8BA} 107 | 108 | 109 | {8EFE15E2-401E-A657-3818-AD66} 110 | 111 | 112 | {6835CAB6-404A-D3AD-148B-CD60} 113 | 114 | 115 | {ABAEF2A2-DCDC-DB83-4614-EB2B} 116 | 117 | 118 | {A694AB8C-4705-277A-3AC8-2B8E} 119 | 120 | 121 | {11149A5A-9ACC-C40C-6630-21F5} 122 | 123 | 124 | {2646318C-49AB-44C5-70D8-23E6} 125 | 126 | 127 | {A96BFA17-5DD8-8C27-30D2-8E1A} 128 | 129 | 130 | {84117DA6-D35A-5A56-BA02-FB0C} 131 | 132 | 133 | {01A15744-29A6-108D-08E9-83A7} 134 | 135 | 136 | {3D1C10C7-8F35-E796-9C70-F5F3} 137 | 138 | 139 | {DB49CB87-27C8-0C02-F602-86D7} 140 | 141 | 142 | {917203BC-05C2-034C-1B38-B098} 143 | 144 | 145 | {68A64BA7-C89A-C657-EC7A-10D6} 146 | 147 | 148 | {76E15BF2-5348-07F8-F8E1-A911} 149 | 150 | 151 | {EED9D931-64B9-6EC6-5E54-A96C} 152 | 153 | 154 | {877F005D-13E6-0592-1D97-F2E3} 155 | 156 | 157 | {CCB2AC63-49D2-977C-CFE8-AEAD} 158 | 159 | 160 | {687714A8-1662-FA1C-261F-50F0} 161 | 162 | 163 | {53e9c937-5ffc-41f2-98b0-5579218fc3e7} 164 | 165 | 166 | 167 | 168 | src 169 | 170 | 171 | src 172 | 173 | 174 | addons\ofxDatGui\src\components 175 | 176 | 177 | addons\ofxDatGui\src\components 178 | 179 | 180 | addons\ofxDatGui\src\components 181 | 182 | 183 | addons\ofxDatGui\src\components 184 | 185 | 186 | addons\ofxDatGui\src\components 187 | 188 | 189 | addons\ofxDatGui\src\components 190 | 191 | 192 | addons\ofxDatGui\src\components 193 | 194 | 195 | addons\ofxDatGui\src\components 196 | 197 | 198 | addons\ofxDatGui\src\components 199 | 200 | 201 | addons\ofxDatGui\src\components 202 | 203 | 204 | addons\ofxDatGui\src\components 205 | 206 | 207 | addons\ofxDatGui\src\components 208 | 209 | 210 | addons\ofxDatGui\src\components 211 | 212 | 213 | addons\ofxDatGui\src\components 214 | 215 | 216 | addons\ofxDatGui\src\core 217 | 218 | 219 | addons\ofxDatGui\src\core 220 | 221 | 222 | addons\ofxDatGui\src\core 223 | 224 | 225 | addons\ofxDatGui\src\core 226 | 227 | 228 | addons\ofxDatGui\src\libs\ofxSmartFont\src 229 | 230 | 231 | addons\ofxDatGui\src 232 | 233 | 234 | addons\ofxDatGui\src\themes 235 | 236 | 237 | addons\ofxDatGui\src\themes 238 | 239 | 240 | addons\ofxLedMapper\src 241 | 242 | 243 | addons\ofxLedMapper\src 244 | 245 | 246 | addons\ofxLedMapper\src 247 | 248 | 249 | addons\ofxLedMapper\src 250 | 251 | 252 | addons\ofxLedMapper\src 253 | 254 | 255 | addons\ofxLedMapper\src 256 | 257 | 258 | addons\ofxNetwork\src 259 | 260 | 261 | addons\ofxNetwork\src 262 | 263 | 264 | addons\ofxNetwork\src 265 | 266 | 267 | addons\ofxNetwork\src 268 | 269 | 270 | addons\ofxNetwork\src 271 | 272 | 273 | addons\ofxNetwork\src 274 | 275 | 276 | addons\ofxNetwork\src 277 | 278 | 279 | addons\ofxNetwork\src 280 | 281 | 282 | addons\ofxSpout2\src 283 | 284 | 285 | addons\ofxSpout2\src 286 | 287 | 288 | addons\ofxSpout2\libs\include 289 | 290 | 291 | addons\ofxSpout2\libs\include 292 | 293 | 294 | addons\ofxSpout2\libs\include 295 | 296 | 297 | addons\ofxSpout2\libs\include 298 | 299 | 300 | addons\ofxSpout2\libs\include 301 | 302 | 303 | addons\ofxSpout2\libs\include 304 | 305 | 306 | addons\ofxSpout2\libs\include 307 | 308 | 309 | addons\ofxSpout2\libs\include 310 | 311 | 312 | addons\ofxSpout2\libs\include 313 | 314 | 315 | addons\ofxSpout2\libs\include 316 | 317 | 318 | addons\ofxSpout2\libs\include 319 | 320 | 321 | addons\ofxXmlSettings\src 322 | 323 | 324 | addons\ofxXmlSettings\libs 325 | 326 | 327 | addons\ofxLedMapper\src\output 328 | 329 | 330 | addons\ofxLedMapper\src\output 331 | 332 | 333 | 334 | 335 | 336 | -------------------------------------------------------------------------------- /ledMapper.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0294CC40A9B329B0BC2E56EA /* ofxSmartFont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD2F86770A7EF44B62E23A5B /* ofxSmartFont.cpp */; }; 11 | 11DF9AB1B4EAA63E3B190CA0 /* ofxSyphonServerDirectory.mm in Sources */ = {isa = PBXBuildFile; fileRef = E723BEF4C55D236E24639608 /* ofxSyphonServerDirectory.mm */; }; 12 | 125506CD3E5F428AAFE5CC65 /* ofxTCPManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F399B91E98DC31CDA6DDACB4 /* ofxTCPManager.cpp */; }; 13 | 1F558B76FB3412843DDAA031 /* ofxSyphonClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 03EA4DA95B5E1B8409FC058E /* ofxSyphonClient.mm */; }; 14 | 286029986107AE7D1E316D5F /* ofxLedRpi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3CD3B211D65ECBA1185B3265 /* ofxLedRpi.cpp */; }; 15 | 2C0BFEEEA8FC74648567F8D0 /* ledMapperApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EBBFE8BF9D851CEAB1AF783 /* ledMapperApp.cpp */; }; 16 | 3A68D60BBC83A9B2916DD444 /* ofxLedMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 57A5AA75AAA997CD805B12E0 /* ofxLedMapper.cpp */; }; 17 | 4D508D34156E7076531D9084 /* Syphon.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D58DCB2C0AEFDE6171E29540 /* Syphon.framework */; }; 18 | 5A4349E9754D6FA14C0F2A3A /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FC5DA1C87211D4F6377DA719 /* tinyxmlparser.cpp */; }; 19 | 63B57AC5BF4EF088491E0317 /* ofxXmlSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50DF87D612C5AAE17AAFA6C0 /* ofxXmlSettings.cpp */; }; 20 | 661A1991F5CE4CCC2919D8E7 /* ofxNetworkUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE30B18B42BAF0E92CB140E5 /* ofxNetworkUtils.cpp */; }; 21 | 66CA411C5A9664E27326BF36 /* ofxTCPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C085E327DAB912CFA2A443D /* ofxTCPServer.cpp */; }; 22 | 8D60C222CBD3F869382832E9 /* ofxSyphonServer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 32D6F27DC6308427F9A278C1 /* ofxSyphonServer.mm */; }; 23 | 933A2227713C720CEFF80FD9 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2B40EDA85BEB63E46785BC29 /* tinyxml.cpp */; }; 24 | 960D20B191346612D5C05A6A /* ofxTCPClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF88F02779DD820913ACEA06 /* ofxTCPClient.cpp */; }; 25 | 9D44DC88EF9E7991B4A09951 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 832BDC407620CDBA568B713D /* tinyxmlerror.cpp */; }; 26 | C1F59DBDF31035FEDBDE8018 /* readme.md in Sources */ = {isa = PBXBuildFile; fileRef = CC9FA26E1F7B54F1C5CB1CE4 /* readme.md */; }; 27 | C9109422648B170B07A778CF /* SyphonNameboundClient.m in Sources */ = {isa = PBXBuildFile; fileRef = E3405C5AE387BDDC2AD19473 /* SyphonNameboundClient.m */; }; 28 | C9466C434D1CF8AB968D298D /* ofxDatGui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26490D7CC31EF7D6ED5F925A /* ofxDatGui.cpp */; }; 29 | CB70B178311B16CC26AC0B3E /* Player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7B46A3AD8E3B2B2B99C0D3D /* Player.cpp */; }; 30 | D3C1C48E59CAA2D68C0DD477 /* ofxDatGuiComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A3E3B8F332A1A3C7EDF4998 /* ofxDatGuiComponent.cpp */; }; 31 | E09536E345D4B6B8E303FAC3 /* ofxSmartFont.png in Sources */ = {isa = PBXBuildFile; fileRef = 5BF1E1022187F07E14503CFD /* ofxSmartFont.png */; }; 32 | E1A3FD40C8BCD507345F1126 /* Syphon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D58DCB2C0AEFDE6171E29540 /* Syphon.framework */; }; 33 | E2564CF7DDB3713772BB682E /* ofxUDPManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35BB9BB90DBABFD3B39F8DB6 /* ofxUDPManager.cpp */; }; 34 | E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4328148138ABC890047C5CB /* openFrameworksDebug.a */; }; 35 | E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */; }; 36 | F7A0454B4E90992C5F26200E /* ofxLedDmx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9777D7DB866861604412EC2B /* ofxLedDmx.cpp */; }; 37 | FBF33B1A4D323955BA965F7B /* ofxLedController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B30F06EFD0AC0041DC16B85 /* ofxLedController.cpp */; }; 38 | /* End PBXBuildFile section */ 39 | 40 | /* Begin PBXContainerItemProxy section */ 41 | E4328147138ABC890047C5CB /* PBXContainerItemProxy */ = { 42 | isa = PBXContainerItemProxy; 43 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 44 | proxyType = 2; 45 | remoteGlobalIDString = E4B27C1510CBEB8E00536013; 46 | remoteInfo = openFrameworks; 47 | }; 48 | E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */ = { 49 | isa = PBXContainerItemProxy; 50 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 51 | proxyType = 1; 52 | remoteGlobalIDString = E4B27C1410CBEB8E00536013; 53 | remoteInfo = openFrameworks; 54 | }; 55 | /* End PBXContainerItemProxy section */ 56 | 57 | /* Begin PBXCopyFilesBuildPhase section */ 58 | E4C2427710CC5ABF004149E2 /* CopyFiles */ = { 59 | isa = PBXCopyFilesBuildPhase; 60 | buildActionMask = 2147483647; 61 | dstPath = ""; 62 | dstSubfolderSpec = 10; 63 | files = ( 64 | 4D508D34156E7076531D9084 /* Syphon.framework in CopyFiles */, 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | /* End PBXCopyFilesBuildPhase section */ 69 | 70 | /* Begin PBXFileReference section */ 71 | 01DCC0911400F9ACF5B65578 /* ofxXmlSettings.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxXmlSettings.h; path = ../../../addons/ofxXmlSettings/src/ofxXmlSettings.h; sourceTree = SOURCE_ROOT; }; 72 | 01FAC3552E00C3620035EA2F /* ofxSyphonClient.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxSyphonClient.h; path = ../../../addons/ofxSyphon/src/ofxSyphonClient.h; sourceTree = SOURCE_ROOT; }; 73 | 03EA4DA95B5E1B8409FC058E /* ofxSyphonClient.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = ofxSyphonClient.mm; path = ../../../addons/ofxSyphon/src/ofxSyphonClient.mm; sourceTree = SOURCE_ROOT; }; 74 | 04C339FF9ADCF05DF2DA62A3 /* ofxDatGuiTextInputField.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiTextInputField.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiTextInputField.h; sourceTree = SOURCE_ROOT; }; 75 | 0A42C807BEF3A18E8E105A3B /* ofxDatGuiTimeGraph.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiTimeGraph.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiTimeGraph.h; sourceTree = SOURCE_ROOT; }; 76 | 0FB83AC7747296DD35C1C295 /* ofxSyphon.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxSyphon.h; path = ../../../addons/ofxSyphon/src/ofxSyphon.h; sourceTree = SOURCE_ROOT; }; 77 | 163ABB7F5E22B6A0ECF51B07 /* ofxTCPSettings.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxTCPSettings.h; path = ../../../addons/ofxNetwork/src/ofxTCPSettings.h; sourceTree = SOURCE_ROOT; }; 78 | 1A3E3B8F332A1A3C7EDF4998 /* ofxDatGuiComponent.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxDatGuiComponent.cpp; path = ../../../addons/ofxDatGui/src/core/ofxDatGuiComponent.cpp; sourceTree = SOURCE_ROOT; }; 79 | 1C085E327DAB912CFA2A443D /* ofxTCPServer.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxTCPServer.cpp; path = ../../../addons/ofxNetwork/src/ofxTCPServer.cpp; sourceTree = SOURCE_ROOT; }; 80 | 1DFA26F2C6BBD1B8AC24C0B1 /* ofxNetworkUtils.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxNetworkUtils.h; path = ../../../addons/ofxNetwork/src/ofxNetworkUtils.h; sourceTree = SOURCE_ROOT; }; 81 | 21E1E3071CB7B11914428B62 /* ofxDatGuiThemes.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiThemes.h; path = ../../../addons/ofxDatGui/src/themes/ofxDatGuiThemes.h; sourceTree = SOURCE_ROOT; }; 82 | 26490D7CC31EF7D6ED5F925A /* ofxDatGui.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxDatGui.cpp; path = ../../../addons/ofxDatGui/src/ofxDatGui.cpp; sourceTree = SOURCE_ROOT; }; 83 | 26EF3E71A07C6948EAF6709E /* ofxTCPManager.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxTCPManager.h; path = ../../../addons/ofxNetwork/src/ofxTCPManager.h; sourceTree = SOURCE_ROOT; }; 84 | 2B40EDA85BEB63E46785BC29 /* tinyxml.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = tinyxml.cpp; path = ../../../addons/ofxXmlSettings/libs/tinyxml.cpp; sourceTree = SOURCE_ROOT; }; 85 | 2F519EB3B0DCD7378FB86ABE /* ofxUDPManager.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxUDPManager.h; path = ../../../addons/ofxNetwork/src/ofxUDPManager.h; sourceTree = SOURCE_ROOT; }; 86 | 30841703B7AC8487D16FB4AA /* ofxTCPServer.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxTCPServer.h; path = ../../../addons/ofxNetwork/src/ofxTCPServer.h; sourceTree = SOURCE_ROOT; }; 87 | 32D6F27DC6308427F9A278C1 /* ofxSyphonServer.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = ofxSyphonServer.mm; path = ../../../addons/ofxSyphon/src/ofxSyphonServer.mm; sourceTree = SOURCE_ROOT; }; 88 | 337B812806A0E7D26A029E5A /* ofxSyphonServerDirectory.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxSyphonServerDirectory.h; path = ../../../addons/ofxSyphon/src/ofxSyphonServerDirectory.h; sourceTree = SOURCE_ROOT; }; 89 | 35BB9BB90DBABFD3B39F8DB6 /* ofxUDPManager.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxUDPManager.cpp; path = ../../../addons/ofxNetwork/src/ofxUDPManager.cpp; sourceTree = SOURCE_ROOT; }; 90 | 36E40AF65DF6F84EAAD2B281 /* ofxLedRpi.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedRpi.h; path = ../../../addons/ofxLedMapper/src/output/ofxLedRpi.h; sourceTree = SOURCE_ROOT; }; 91 | 3CD3B211D65ECBA1185B3265 /* ofxLedRpi.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxLedRpi.cpp; path = ../../../addons/ofxLedMapper/src/output/ofxLedRpi.cpp; sourceTree = SOURCE_ROOT; }; 92 | 3EE52579F19D9666EFBD2FB0 /* ofxDatGuiButtonImage.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiButtonImage.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiButtonImage.h; sourceTree = SOURCE_ROOT; }; 93 | 422C4E1AAC7EC4D30B17702D /* ofxDatGuiIntObject.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiIntObject.h; path = ../../../addons/ofxDatGui/src/core/ofxDatGuiIntObject.h; sourceTree = SOURCE_ROOT; }; 94 | 4505C12B49020110D28FB6D1 /* ofxSmartFont.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxSmartFont.h; path = ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src/ofxSmartFont.h; sourceTree = SOURCE_ROOT; }; 95 | 46BBCC26D60B589958BF0D03 /* ofxSyphonServer.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxSyphonServer.h; path = ../../../addons/ofxSyphon/src/ofxSyphonServer.h; sourceTree = SOURCE_ROOT; }; 96 | 4A323001EC8050B5E3B8971F /* ofxLedGrabLine.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedGrabLine.h; path = ../../../addons/ofxLedMapper/src/ofxLedGrabLine.h; sourceTree = SOURCE_ROOT; }; 97 | 4B30F06EFD0AC0041DC16B85 /* ofxLedController.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxLedController.cpp; path = ../../../addons/ofxLedMapper/src/ofxLedController.cpp; sourceTree = SOURCE_ROOT; }; 98 | 4DEC3C2F68AAF4858A6FE2B9 /* ofxLedMapper.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedMapper.h; path = ../../../addons/ofxLedMapper/src/ofxLedMapper.h; sourceTree = SOURCE_ROOT; }; 99 | 50DF87D612C5AAE17AAFA6C0 /* ofxXmlSettings.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxXmlSettings.cpp; path = ../../../addons/ofxXmlSettings/src/ofxXmlSettings.cpp; sourceTree = SOURCE_ROOT; }; 100 | 545BBA6F6669BED2DA497BC6 /* ofxDatGuiScrollView.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiScrollView.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiScrollView.h; sourceTree = SOURCE_ROOT; }; 101 | 57A5AA75AAA997CD805B12E0 /* ofxLedMapper.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxLedMapper.cpp; path = ../../../addons/ofxLedMapper/src/ofxLedMapper.cpp; sourceTree = SOURCE_ROOT; }; 102 | 5BF1E1022187F07E14503CFD /* ofxSmartFont.png */ = {isa = PBXFileReference; explicitFileType = file; fileEncoding = 4; name = ofxSmartFont.png; path = "../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme-img/ofxSmartFont.png"; sourceTree = SOURCE_ROOT; }; 103 | 64C563B8158C37E9D07AE29D /* ofxDatGuiFRM.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiFRM.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiFRM.h; sourceTree = SOURCE_ROOT; }; 104 | 71FFD50EA75BCC76F0C58D12 /* SyphonNameboundClient.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = SyphonNameboundClient.h; path = ../../../addons/ofxSyphon/libs/Syphon/src/SyphonNameboundClient.h; sourceTree = SOURCE_ROOT; }; 105 | 744031A3E8F8DAF9FE6F3EA8 /* ofxDatGuiGroups.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiGroups.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiGroups.h; sourceTree = SOURCE_ROOT; }; 106 | 787315438BF1DD00C81DF413 /* ofxDatGuiLabel.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiLabel.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiLabel.h; sourceTree = SOURCE_ROOT; }; 107 | 7EBBFE8BF9D851CEAB1AF783 /* ledMapperApp.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ledMapperApp.cpp; path = src/ledMapperApp.cpp; sourceTree = SOURCE_ROOT; }; 108 | 832BDC407620CDBA568B713D /* tinyxmlerror.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = tinyxmlerror.cpp; path = ../../../addons/ofxXmlSettings/libs/tinyxmlerror.cpp; sourceTree = SOURCE_ROOT; }; 109 | 902724601B82C6AD81BBCD71 /* ofxDatGui2dPad.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGui2dPad.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGui2dPad.h; sourceTree = SOURCE_ROOT; }; 110 | 946FF9210F175C3956CB16B6 /* ledMapperApp.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ledMapperApp.h; path = src/ledMapperApp.h; sourceTree = SOURCE_ROOT; }; 111 | 9705D66270ED89ECA6E6FECE /* ofxDatGui.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGui.h; path = ../../../addons/ofxDatGui/src/ofxDatGui.h; sourceTree = SOURCE_ROOT; }; 112 | 9777D7DB866861604412EC2B /* ofxLedDmx.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxLedDmx.cpp; path = ../../../addons/ofxLedMapper/src/output/ofxLedDmx.cpp; sourceTree = SOURCE_ROOT; }; 113 | 9B5051062C6A871714E6F5F4 /* ofxDatGuiConstants.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiConstants.h; path = ../../../addons/ofxDatGui/src/core/ofxDatGuiConstants.h; sourceTree = SOURCE_ROOT; }; 114 | 9DB1266C68243123FFBAB6C1 /* json.hpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = json.hpp; path = ../../../addons/ofxLedMapper/src/json.hpp; sourceTree = SOURCE_ROOT; }; 115 | A507F73A41048908D4FEF0A2 /* Common.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = Common.h; path = ../../../addons/ofxLedMapper/src/Common.h; sourceTree = SOURCE_ROOT; }; 116 | A7B46A3AD8E3B2B2B99C0D3D /* Player.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = Player.cpp; path = src/Player.cpp; sourceTree = SOURCE_ROOT; }; 117 | A837538A506CA52AF2214190 /* Player.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = Player.h; path = src/Player.h; sourceTree = SOURCE_ROOT; }; 118 | AE30B18B42BAF0E92CB140E5 /* ofxNetworkUtils.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxNetworkUtils.cpp; path = ../../../addons/ofxNetwork/src/ofxNetworkUtils.cpp; sourceTree = SOURCE_ROOT; }; 119 | B21E7E5F548EEA92F368040B /* tinyxml.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = tinyxml.h; path = ../../../addons/ofxXmlSettings/libs/tinyxml.h; sourceTree = SOURCE_ROOT; }; 120 | B498F0559F473CF855EF6062 /* ofxDatGuiTheme.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiTheme.h; path = ../../../addons/ofxDatGui/src/themes/ofxDatGuiTheme.h; sourceTree = SOURCE_ROOT; }; 121 | B71E597923645D590CF2B6CA /* ofxLedOutput.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedOutput.h; path = ../../../addons/ofxLedMapper/src/output/ofxLedOutput.h; sourceTree = SOURCE_ROOT; }; 122 | BCC84C6EB3417706F4F762F0 /* ofxDatGuiComponent.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiComponent.h; path = ../../../addons/ofxDatGui/src/core/ofxDatGuiComponent.h; sourceTree = SOURCE_ROOT; }; 123 | BF88F02779DD820913ACEA06 /* ofxTCPClient.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxTCPClient.cpp; path = ../../../addons/ofxNetwork/src/ofxTCPClient.cpp; sourceTree = SOURCE_ROOT; }; 124 | C085A33340AB0C1DB647AC2F /* ofxDatGuiTextInput.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiTextInput.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiTextInput.h; sourceTree = SOURCE_ROOT; }; 125 | C1278B7557E7CD889064CEB8 /* ofJson.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofJson.h; path = ../../../addons/ofxLedMapper/src/ofJson.h; sourceTree = SOURCE_ROOT; }; 126 | C84ED7FCC017328C6F58283D /* ofxDatGuiColorPicker.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiColorPicker.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiColorPicker.h; sourceTree = SOURCE_ROOT; }; 127 | C8C9B823D7872F9CBF03A813 /* ofxTCPClient.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxTCPClient.h; path = ../../../addons/ofxNetwork/src/ofxTCPClient.h; sourceTree = SOURCE_ROOT; }; 128 | CC9FA26E1F7B54F1C5CB1CE4 /* readme.md */ = {isa = PBXFileReference; explicitFileType = file; fileEncoding = 4; name = readme.md; path = ../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme.md; sourceTree = SOURCE_ROOT; }; 129 | CDF7278CB636137FE7BF91A5 /* ofxDatGuiMatrix.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiMatrix.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiMatrix.h; sourceTree = SOURCE_ROOT; }; 130 | D0D6A66BEBA820EA1D396889 /* ofxDatGuiSlider.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiSlider.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiSlider.h; sourceTree = SOURCE_ROOT; }; 131 | D38F3868AA05BA46C75D3C42 /* ofxLedGrabObject.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedGrabObject.h; path = ../../../addons/ofxLedMapper/src/ofxLedGrabObject.h; sourceTree = SOURCE_ROOT; }; 132 | D58DCB2C0AEFDE6171E29540 /* Syphon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Syphon.framework; path = ../../../addons/ofxSyphon/libs/Syphon/lib/osx/Syphon.framework; sourceTree = ""; }; 133 | D67FE8EDE92985070F3FD992 /* ofxUDPSettings.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxUDPSettings.h; path = ../../../addons/ofxNetwork/src/ofxUDPSettings.h; sourceTree = SOURCE_ROOT; }; 134 | DA137B8F97182895CF34D714 /* ofxLedController.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedController.h; path = ../../../addons/ofxLedMapper/src/ofxLedController.h; sourceTree = SOURCE_ROOT; }; 135 | DD2F86770A7EF44B62E23A5B /* ofxSmartFont.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxSmartFont.cpp; path = ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src/ofxSmartFont.cpp; sourceTree = SOURCE_ROOT; }; 136 | DF371044B637F86956E83B66 /* ofxLedPixelGrab.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedPixelGrab.h; path = ../../../addons/ofxLedMapper/src/ofxLedPixelGrab.h; sourceTree = SOURCE_ROOT; }; 137 | E100ED9DCB412957A879CD5A /* ofxDatGuiControls.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiControls.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiControls.h; sourceTree = SOURCE_ROOT; }; 138 | E1144CF43D89A9FAB71ACCE5 /* ofxLedDmx.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxLedDmx.h; path = ../../../addons/ofxLedMapper/src/output/ofxLedDmx.h; sourceTree = SOURCE_ROOT; }; 139 | E3405C5AE387BDDC2AD19473 /* SyphonNameboundClient.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = SyphonNameboundClient.m; path = ../../../addons/ofxSyphon/libs/Syphon/src/SyphonNameboundClient.m; sourceTree = SOURCE_ROOT; }; 140 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = openFrameworksLib.xcodeproj; path = ../../../libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj; sourceTree = SOURCE_ROOT; }; 141 | E4B69B5B0A3A1756003C02F2 /* ledMapperDebug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ledMapperDebug.app; sourceTree = BUILT_PRODUCTS_DIR; }; 142 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = src/main.cpp; sourceTree = SOURCE_ROOT; }; 143 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "openFrameworks-Info.plist"; sourceTree = ""; }; 144 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = CoreOF.xcconfig; path = ../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig; sourceTree = SOURCE_ROOT; }; 145 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Project.xcconfig; sourceTree = ""; }; 146 | E723BEF4C55D236E24639608 /* ofxSyphonServerDirectory.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = ofxSyphonServerDirectory.mm; path = ../../../addons/ofxSyphon/src/ofxSyphonServerDirectory.mm; sourceTree = SOURCE_ROOT; }; 147 | F399B91E98DC31CDA6DDACB4 /* ofxTCPManager.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = ofxTCPManager.cpp; path = ../../../addons/ofxNetwork/src/ofxTCPManager.cpp; sourceTree = SOURCE_ROOT; }; 148 | F59384ED57A7C6A7A8B0351D /* ofxDatGuiEvents.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiEvents.h; path = ../../../addons/ofxDatGui/src/core/ofxDatGuiEvents.h; sourceTree = SOURCE_ROOT; }; 149 | F66993296A3AEEC70FD444F5 /* ofxNetwork.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxNetwork.h; path = ../../../addons/ofxNetwork/src/ofxNetwork.h; sourceTree = SOURCE_ROOT; }; 150 | FC5DA1C87211D4F6377DA719 /* tinyxmlparser.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = tinyxmlparser.cpp; path = ../../../addons/ofxXmlSettings/libs/tinyxmlparser.cpp; sourceTree = SOURCE_ROOT; }; 151 | FDA86F4C2F1F1964D35391C6 /* ofxDatGuiButton.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = ofxDatGuiButton.h; path = ../../../addons/ofxDatGui/src/components/ofxDatGuiButton.h; sourceTree = SOURCE_ROOT; }; 152 | /* End PBXFileReference section */ 153 | 154 | /* Begin PBXFrameworksBuildPhase section */ 155 | E4B69B590A3A1756003C02F2 /* Frameworks */ = { 156 | isa = PBXFrameworksBuildPhase; 157 | buildActionMask = 2147483647; 158 | files = ( 159 | E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */, 160 | E1A3FD40C8BCD507345F1126 /* Syphon.framework in Frameworks */, 161 | ); 162 | runOnlyForDeploymentPostprocessing = 0; 163 | }; 164 | /* End PBXFrameworksBuildPhase section */ 165 | 166 | /* Begin PBXGroup section */ 167 | 037363833F55AC730CC42F3E /* src */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | DD2F86770A7EF44B62E23A5B /* ofxSmartFont.cpp */, 171 | 4505C12B49020110D28FB6D1 /* ofxSmartFont.h */, 172 | ); 173 | name = src; 174 | sourceTree = ""; 175 | }; 176 | 09D35E9640961BEC4FAAFB0D /* output */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | A507F73A41048908D4FEF0A2 /* Common.h */, 180 | 9777D7DB866861604412EC2B /* ofxLedDmx.cpp */, 181 | 3CD3B211D65ECBA1185B3265 /* ofxLedRpi.cpp */, 182 | B71E597923645D590CF2B6CA /* ofxLedOutput.h */, 183 | E1144CF43D89A9FAB71ACCE5 /* ofxLedDmx.h */, 184 | 36E40AF65DF6F84EAAD2B281 /* ofxLedRpi.h */, 185 | ); 186 | name = output; 187 | sourceTree = ""; 188 | }; 189 | 0EF29D3ABD6E4147AE024D7A /* ofxSmartFont */ = { 190 | isa = PBXGroup; 191 | children = ( 192 | CC9FA26E1F7B54F1C5CB1CE4 /* readme.md */, 193 | 82716BE1C4EFC36AF3DB74FA /* readme-img */, 194 | 037363833F55AC730CC42F3E /* src */, 195 | ); 196 | name = ofxSmartFont; 197 | sourceTree = ""; 198 | }; 199 | 18240ECCE4076FB0833A8578 /* ofxNetwork */ = { 200 | isa = PBXGroup; 201 | children = ( 202 | 219374A14594D121F27FED3A /* src */, 203 | ); 204 | name = ofxNetwork; 205 | sourceTree = ""; 206 | }; 207 | 1F4FB5C423662B96ADFDCC0B /* ofxXmlSettings */ = { 208 | isa = PBXGroup; 209 | children = ( 210 | 6ECEF0D76BC33727823EADFF /* src */, 211 | 6E54289412D2D94F45A05113 /* libs */, 212 | ); 213 | name = ofxXmlSettings; 214 | sourceTree = ""; 215 | }; 216 | 219374A14594D121F27FED3A /* src */ = { 217 | isa = PBXGroup; 218 | children = ( 219 | 26EF3E71A07C6948EAF6709E /* ofxTCPManager.h */, 220 | C8C9B823D7872F9CBF03A813 /* ofxTCPClient.h */, 221 | F66993296A3AEEC70FD444F5 /* ofxNetwork.h */, 222 | 35BB9BB90DBABFD3B39F8DB6 /* ofxUDPManager.cpp */, 223 | 1C085E327DAB912CFA2A443D /* ofxTCPServer.cpp */, 224 | D67FE8EDE92985070F3FD992 /* ofxUDPSettings.h */, 225 | 1DFA26F2C6BBD1B8AC24C0B1 /* ofxNetworkUtils.h */, 226 | F399B91E98DC31CDA6DDACB4 /* ofxTCPManager.cpp */, 227 | BF88F02779DD820913ACEA06 /* ofxTCPClient.cpp */, 228 | AE30B18B42BAF0E92CB140E5 /* ofxNetworkUtils.cpp */, 229 | 163ABB7F5E22B6A0ECF51B07 /* ofxTCPSettings.h */, 230 | 2F519EB3B0DCD7378FB86ABE /* ofxUDPManager.h */, 231 | 30841703B7AC8487D16FB4AA /* ofxTCPServer.h */, 232 | ); 233 | name = src; 234 | sourceTree = ""; 235 | }; 236 | 2317994671CD76BBA16927B8 /* libs */ = { 237 | isa = PBXGroup; 238 | children = ( 239 | 65F3085962B3A8825746C3C2 /* Syphon */, 240 | ); 241 | name = libs; 242 | sourceTree = ""; 243 | }; 244 | 398D2AD7D162CE13BF40CD4F /* lib */ = { 245 | isa = PBXGroup; 246 | children = ( 247 | 821159A073ABA066739FD401 /* osx */, 248 | ); 249 | name = lib; 250 | sourceTree = ""; 251 | }; 252 | 49A9E39C52C2DF4DDA1E185F /* src */ = { 253 | isa = PBXGroup; 254 | children = ( 255 | 0FB83AC7747296DD35C1C295 /* ofxSyphon.h */, 256 | 32D6F27DC6308427F9A278C1 /* ofxSyphonServer.mm */, 257 | 46BBCC26D60B589958BF0D03 /* ofxSyphonServer.h */, 258 | 03EA4DA95B5E1B8409FC058E /* ofxSyphonClient.mm */, 259 | E723BEF4C55D236E24639608 /* ofxSyphonServerDirectory.mm */, 260 | 01FAC3552E00C3620035EA2F /* ofxSyphonClient.h */, 261 | 337B812806A0E7D26A029E5A /* ofxSyphonServerDirectory.h */, 262 | ); 263 | name = src; 264 | sourceTree = ""; 265 | }; 266 | 50EAFB5FF7C5722E7B4895C7 /* src */ = { 267 | isa = PBXGroup; 268 | children = ( 269 | E3405C5AE387BDDC2AD19473 /* SyphonNameboundClient.m */, 270 | 71FFD50EA75BCC76F0C58D12 /* SyphonNameboundClient.h */, 271 | ); 272 | name = src; 273 | sourceTree = ""; 274 | }; 275 | 65F3085962B3A8825746C3C2 /* Syphon */ = { 276 | isa = PBXGroup; 277 | children = ( 278 | 50EAFB5FF7C5722E7B4895C7 /* src */, 279 | 398D2AD7D162CE13BF40CD4F /* lib */, 280 | ); 281 | name = Syphon; 282 | sourceTree = ""; 283 | }; 284 | 69146F0BA46E48E576618E5E /* libs */ = { 285 | isa = PBXGroup; 286 | children = ( 287 | 0EF29D3ABD6E4147AE024D7A /* ofxSmartFont */, 288 | ); 289 | name = libs; 290 | sourceTree = ""; 291 | }; 292 | 6948EE371B920CB800B5AC1A /* local_addons */ = { 293 | isa = PBXGroup; 294 | children = ( 295 | ); 296 | name = local_addons; 297 | sourceTree = ""; 298 | }; 299 | 6E54289412D2D94F45A05113 /* libs */ = { 300 | isa = PBXGroup; 301 | children = ( 302 | B21E7E5F548EEA92F368040B /* tinyxml.h */, 303 | FC5DA1C87211D4F6377DA719 /* tinyxmlparser.cpp */, 304 | 832BDC407620CDBA568B713D /* tinyxmlerror.cpp */, 305 | 2B40EDA85BEB63E46785BC29 /* tinyxml.cpp */, 306 | ); 307 | name = libs; 308 | sourceTree = ""; 309 | }; 310 | 6ECEF0D76BC33727823EADFF /* src */ = { 311 | isa = PBXGroup; 312 | children = ( 313 | 50DF87D612C5AAE17AAFA6C0 /* ofxXmlSettings.cpp */, 314 | 01DCC0911400F9ACF5B65578 /* ofxXmlSettings.h */, 315 | ); 316 | name = src; 317 | sourceTree = ""; 318 | }; 319 | 7F3C04577424427D348B1425 /* ofxSyphon */ = { 320 | isa = PBXGroup; 321 | children = ( 322 | 49A9E39C52C2DF4DDA1E185F /* src */, 323 | 2317994671CD76BBA16927B8 /* libs */, 324 | ); 325 | name = ofxSyphon; 326 | sourceTree = ""; 327 | }; 328 | 821159A073ABA066739FD401 /* osx */ = { 329 | isa = PBXGroup; 330 | children = ( 331 | D58DCB2C0AEFDE6171E29540 /* Syphon.framework */, 332 | ); 333 | name = osx; 334 | sourceTree = ""; 335 | }; 336 | 82716BE1C4EFC36AF3DB74FA /* readme-img */ = { 337 | isa = PBXGroup; 338 | children = ( 339 | 5BF1E1022187F07E14503CFD /* ofxSmartFont.png */, 340 | ); 341 | name = "readme-img"; 342 | sourceTree = ""; 343 | }; 344 | 8870759BC9CAEA1E4E9EA3A8 /* core */ = { 345 | isa = PBXGroup; 346 | children = ( 347 | 422C4E1AAC7EC4D30B17702D /* ofxDatGuiIntObject.h */, 348 | 1A3E3B8F332A1A3C7EDF4998 /* ofxDatGuiComponent.cpp */, 349 | 9B5051062C6A871714E6F5F4 /* ofxDatGuiConstants.h */, 350 | F59384ED57A7C6A7A8B0351D /* ofxDatGuiEvents.h */, 351 | BCC84C6EB3417706F4F762F0 /* ofxDatGuiComponent.h */, 352 | ); 353 | name = core; 354 | sourceTree = ""; 355 | }; 356 | 911FE1C75E520EE70A7B4830 /* themes */ = { 357 | isa = PBXGroup; 358 | children = ( 359 | B498F0559F473CF855EF6062 /* ofxDatGuiTheme.h */, 360 | 21E1E3071CB7B11914428B62 /* ofxDatGuiThemes.h */, 361 | ); 362 | name = themes; 363 | sourceTree = ""; 364 | }; 365 | 947FCD1248D8B0A16B53C1AA /* components */ = { 366 | isa = PBXGroup; 367 | children = ( 368 | C84ED7FCC017328C6F58283D /* ofxDatGuiColorPicker.h */, 369 | D0D6A66BEBA820EA1D396889 /* ofxDatGuiSlider.h */, 370 | 64C563B8158C37E9D07AE29D /* ofxDatGuiFRM.h */, 371 | 0A42C807BEF3A18E8E105A3B /* ofxDatGuiTimeGraph.h */, 372 | 04C339FF9ADCF05DF2DA62A3 /* ofxDatGuiTextInputField.h */, 373 | FDA86F4C2F1F1964D35391C6 /* ofxDatGuiButton.h */, 374 | E100ED9DCB412957A879CD5A /* ofxDatGuiControls.h */, 375 | 744031A3E8F8DAF9FE6F3EA8 /* ofxDatGuiGroups.h */, 376 | 545BBA6F6669BED2DA497BC6 /* ofxDatGuiScrollView.h */, 377 | 3EE52579F19D9666EFBD2FB0 /* ofxDatGuiButtonImage.h */, 378 | 787315438BF1DD00C81DF413 /* ofxDatGuiLabel.h */, 379 | 902724601B82C6AD81BBCD71 /* ofxDatGui2dPad.h */, 380 | C085A33340AB0C1DB647AC2F /* ofxDatGuiTextInput.h */, 381 | CDF7278CB636137FE7BF91A5 /* ofxDatGuiMatrix.h */, 382 | ); 383 | name = components; 384 | sourceTree = ""; 385 | }; 386 | BB4B014C10F69532006C3DED /* addons */ = { 387 | isa = PBXGroup; 388 | children = ( 389 | D8DD1043C333F6F63C8685E6 /* ofxDatGui */, 390 | E6ED21CCD1B2EFAC48715C87 /* ofxLedMapper */, 391 | 18240ECCE4076FB0833A8578 /* ofxNetwork */, 392 | 7F3C04577424427D348B1425 /* ofxSyphon */, 393 | 1F4FB5C423662B96ADFDCC0B /* ofxXmlSettings */, 394 | ); 395 | name = addons; 396 | sourceTree = ""; 397 | }; 398 | D8DD1043C333F6F63C8685E6 /* ofxDatGui */ = { 399 | isa = PBXGroup; 400 | children = ( 401 | E9B32C117486580389FAFF01 /* src */, 402 | ); 403 | name = ofxDatGui; 404 | sourceTree = ""; 405 | }; 406 | E4328144138ABC890047C5CB /* Products */ = { 407 | isa = PBXGroup; 408 | children = ( 409 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */, 410 | ); 411 | name = Products; 412 | sourceTree = ""; 413 | }; 414 | E4B69B4A0A3A1720003C02F2 = { 415 | isa = PBXGroup; 416 | children = ( 417 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */, 418 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */, 419 | E4B69E1C0A3A1BDC003C02F2 /* src */, 420 | E4EEC9E9138DF44700A80321 /* openFrameworks */, 421 | BB4B014C10F69532006C3DED /* addons */, 422 | 6948EE371B920CB800B5AC1A /* local_addons */, 423 | E4B69B5B0A3A1756003C02F2 /* ledMapperDebug.app */, 424 | ); 425 | sourceTree = ""; 426 | }; 427 | E4B69E1C0A3A1BDC003C02F2 /* src */ = { 428 | isa = PBXGroup; 429 | children = ( 430 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */, 431 | A7B46A3AD8E3B2B2B99C0D3D /* Player.cpp */, 432 | A837538A506CA52AF2214190 /* Player.h */, 433 | 946FF9210F175C3956CB16B6 /* ledMapperApp.h */, 434 | 7EBBFE8BF9D851CEAB1AF783 /* ledMapperApp.cpp */, 435 | ); 436 | path = src; 437 | sourceTree = SOURCE_ROOT; 438 | }; 439 | E4EEC9E9138DF44700A80321 /* openFrameworks */ = { 440 | isa = PBXGroup; 441 | children = ( 442 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */, 443 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */, 444 | ); 445 | name = openFrameworks; 446 | sourceTree = ""; 447 | }; 448 | E6ED21CCD1B2EFAC48715C87 /* ofxLedMapper */ = { 449 | isa = PBXGroup; 450 | children = ( 451 | F96A61D407ABA9E4437A6771 /* src */, 452 | ); 453 | name = ofxLedMapper; 454 | sourceTree = ""; 455 | }; 456 | E9B32C117486580389FAFF01 /* src */ = { 457 | isa = PBXGroup; 458 | children = ( 459 | 8870759BC9CAEA1E4E9EA3A8 /* core */, 460 | 9705D66270ED89ECA6E6FECE /* ofxDatGui.h */, 461 | 26490D7CC31EF7D6ED5F925A /* ofxDatGui.cpp */, 462 | 69146F0BA46E48E576618E5E /* libs */, 463 | 947FCD1248D8B0A16B53C1AA /* components */, 464 | 911FE1C75E520EE70A7B4830 /* themes */, 465 | ); 466 | name = src; 467 | sourceTree = ""; 468 | }; 469 | F96A61D407ABA9E4437A6771 /* src */ = { 470 | isa = PBXGroup; 471 | children = ( 472 | 09D35E9640961BEC4FAAFB0D /* output */, 473 | 9DB1266C68243123FFBAB6C1 /* json.hpp */, 474 | C1278B7557E7CD889064CEB8 /* ofJson.h */, 475 | DA137B8F97182895CF34D714 /* ofxLedController.h */, 476 | 4B30F06EFD0AC0041DC16B85 /* ofxLedController.cpp */, 477 | DF371044B637F86956E83B66 /* ofxLedPixelGrab.h */, 478 | D38F3868AA05BA46C75D3C42 /* ofxLedGrabObject.h */, 479 | 4A323001EC8050B5E3B8971F /* ofxLedGrabLine.h */, 480 | 4DEC3C2F68AAF4858A6FE2B9 /* ofxLedMapper.h */, 481 | 57A5AA75AAA997CD805B12E0 /* ofxLedMapper.cpp */, 482 | ); 483 | name = src; 484 | sourceTree = ""; 485 | }; 486 | /* End PBXGroup section */ 487 | 488 | /* Begin PBXNativeTarget section */ 489 | E4B69B5A0A3A1756003C02F2 /* ledMapper */ = { 490 | isa = PBXNativeTarget; 491 | buildConfigurationList = E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "ledMapper" */; 492 | buildPhases = ( 493 | E4B69B580A3A1756003C02F2 /* Sources */, 494 | E4B69B590A3A1756003C02F2 /* Frameworks */, 495 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */, 496 | E4C2427710CC5ABF004149E2 /* CopyFiles */, 497 | 8466F1851C04CA0E00918B1C /* ShellScript */, 498 | ); 499 | buildRules = ( 500 | ); 501 | dependencies = ( 502 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */, 503 | ); 504 | name = ledMapper; 505 | productName = myOFApp; 506 | productReference = E4B69B5B0A3A1756003C02F2 /* ledMapperDebug.app */; 507 | productType = "com.apple.product-type.application"; 508 | }; 509 | /* End PBXNativeTarget section */ 510 | 511 | /* Begin PBXProject section */ 512 | E4B69B4C0A3A1720003C02F2 /* Project object */ = { 513 | isa = PBXProject; 514 | attributes = { 515 | LastUpgradeCheck = 0600; 516 | }; 517 | buildConfigurationList = E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "ledMapper" */; 518 | compatibilityVersion = "Xcode 3.2"; 519 | developmentRegion = English; 520 | hasScannedForEncodings = 0; 521 | knownRegions = ( 522 | English, 523 | Japanese, 524 | French, 525 | German, 526 | ); 527 | mainGroup = E4B69B4A0A3A1720003C02F2; 528 | productRefGroup = E4B69B4A0A3A1720003C02F2; 529 | projectDirPath = ""; 530 | projectReferences = ( 531 | { 532 | ProductGroup = E4328144138ABC890047C5CB /* Products */; 533 | ProjectRef = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 534 | }, 535 | ); 536 | projectRoot = ""; 537 | targets = ( 538 | E4B69B5A0A3A1756003C02F2 /* ledMapper */, 539 | ); 540 | }; 541 | /* End PBXProject section */ 542 | 543 | /* Begin PBXReferenceProxy section */ 544 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */ = { 545 | isa = PBXReferenceProxy; 546 | fileType = archive.ar; 547 | path = openFrameworksDebug.a; 548 | remoteRef = E4328147138ABC890047C5CB /* PBXContainerItemProxy */; 549 | sourceTree = BUILT_PRODUCTS_DIR; 550 | }; 551 | /* End PBXReferenceProxy section */ 552 | 553 | /* Begin PBXShellScriptBuildPhase section */ 554 | 8466F1851C04CA0E00918B1C /* ShellScript */ = { 555 | isa = PBXShellScriptBuildPhase; 556 | buildActionMask = 12; 557 | files = ( 558 | ); 559 | inputPaths = ( 560 | ); 561 | outputPaths = ( 562 | ); 563 | runOnlyForDeploymentPostprocessing = 0; 564 | shellPath = /bin/sh; 565 | shellScript = "echo \"$GCC_PREPROCESSOR_DEFINITIONS\";\nAPPSTORE=`expr \"$GCC_PREPROCESSOR_DEFINITIONS\" : \".*APPSTORE=\\([0-9]*\\)\"`\nif [ -z \"$APPSTORE\" ] ; then\necho \"Note: Not copying bin/data to App Package or doing App Code signing. Use AppStore target for AppStore distribution\";\nelse\n# Copy bin/data into App/Resources\nrsync -avz --exclude='.DS_Store' \"${SRCROOT}/bin/data/\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/data/\"\n\n# ---- Code Sign App Package ----\n\n# WARNING: You may have to run Clean in Xcode after changing CODE_SIGN_IDENTITY!\n\n# Verify that $CODE_SIGN_IDENTITY is set\nif [ -z \"${CODE_SIGN_IDENTITY}\" ] ; then\necho \"CODE_SIGN_IDENTITY needs to be set for framework code-signing\"\nexit 0\nfi\n\nif [ -z \"${CODE_SIGN_ENTITLEMENTS}\" ] ; then\necho \"CODE_SIGN_ENTITLEMENTS needs to be set for framework code-signing!\"\n\nif [ \"${CONFIGURATION}\" = \"Release\" ] ; then\nexit 1\nelse\n# Code-signing is optional for non-release builds.\nexit 0\nfi\nfi\n\nITEMS=\"\"\n\nFRAMEWORKS_DIR=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\necho \"$FRAMEWORKS_DIR\"\nif [ -d \"$FRAMEWORKS_DIR\" ] ; then\nFRAMEWORKS=$(find \"${FRAMEWORKS_DIR}\" -depth -type d -name \"*.framework\" -or -name \"*.dylib\" -or -name \"*.bundle\" | sed -e \"s/\\(.*framework\\)/\\1\\/Versions\\/A\\//\")\nRESULT=$?\nif [[ $RESULT != 0 ]] ; then\nexit 1\nfi\n\nITEMS=\"${FRAMEWORKS}\"\nfi\n\nLOGINITEMS_DIR=\"${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Library/LoginItems/\"\nif [ -d \"$LOGINITEMS_DIR\" ] ; then\nLOGINITEMS=$(find \"${LOGINITEMS_DIR}\" -depth -type d -name \"*.app\")\nRESULT=$?\nif [[ $RESULT != 0 ]] ; then\nexit 1\nfi\n\nITEMS=\"${ITEMS}\"$'\\n'\"${LOGINITEMS}\"\nfi\n\n# Prefer the expanded name, if available.\nCODE_SIGN_IDENTITY_FOR_ITEMS=\"${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\nif [ \"${CODE_SIGN_IDENTITY_FOR_ITEMS}\" = \"\" ] ; then\n# Fall back to old behavior.\nCODE_SIGN_IDENTITY_FOR_ITEMS=\"${CODE_SIGN_IDENTITY}\"\nfi\n\necho \"Identity:\"\necho \"${CODE_SIGN_IDENTITY_FOR_ITEMS}\"\n\necho \"Entitlements:\"\necho \"${CODE_SIGN_ENTITLEMENTS}\"\n\necho \"Found:\"\necho \"${ITEMS}\"\n\n# Change the Internal Field Separator (IFS) so that spaces in paths will not cause problems below.\nSAVED_IFS=$IFS\nIFS=$(echo -en \"\\n\\b\")\n\n# Loop through all items.\nfor ITEM in $ITEMS;\ndo\necho \"Signing '${ITEM}'\"\ncodesign --force --verbose --sign \"${CODE_SIGN_IDENTITY_FOR_ITEMS}\" --entitlements \"${CODE_SIGN_ENTITLEMENTS}\" \"${ITEM}\"\nRESULT=$?\nif [[ $RESULT != 0 ]] ; then\necho \"Failed to sign '${ITEM}'.\"\nIFS=$SAVED_IFS\nexit 1\nfi\ndone\n\n# Restore $IFS.\nIFS=$SAVED_IFS\n\nfi\n\n# Copy bin/data into App/Resources\nrsync -avz --exclude='.DS_Store' \"${SRCROOT}/bin/data/\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/\"\n\n"; 566 | }; 567 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */ = { 568 | isa = PBXShellScriptBuildPhase; 569 | buildActionMask = 2147483647; 570 | files = ( 571 | ); 572 | inputPaths = ( 573 | ); 574 | outputPaths = ( 575 | ); 576 | runOnlyForDeploymentPostprocessing = 0; 577 | shellPath = /bin/sh; 578 | shellScript = "mkdir -p \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/\"\n# Copy default icon file into App/Resources\nrsync -aved \"$ICON_FILE\" \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/\"\n# Copy libfmod and change install directory for fmod to run\nrsync -aved \"$OF_PATH/libs/fmodex/lib/osx/libfmodex.dylib\" \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks/\";\ninstall_name_tool -change @executable_path/libfmodex.dylib @executable_path/../Frameworks/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME\";\n\necho \"$GCC_PREPROCESSOR_DEFINITIONS\";\n"; 579 | }; 580 | /* End PBXShellScriptBuildPhase section */ 581 | 582 | /* Begin PBXSourcesBuildPhase section */ 583 | E4B69B580A3A1756003C02F2 /* Sources */ = { 584 | isa = PBXSourcesBuildPhase; 585 | buildActionMask = 2147483647; 586 | files = ( 587 | E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */, 588 | CB70B178311B16CC26AC0B3E /* Player.cpp in Sources */, 589 | 2C0BFEEEA8FC74648567F8D0 /* ledMapperApp.cpp in Sources */, 590 | D3C1C48E59CAA2D68C0DD477 /* ofxDatGuiComponent.cpp in Sources */, 591 | C9466C434D1CF8AB968D298D /* ofxDatGui.cpp in Sources */, 592 | C1F59DBDF31035FEDBDE8018 /* readme.md in Sources */, 593 | E09536E345D4B6B8E303FAC3 /* ofxSmartFont.png in Sources */, 594 | 0294CC40A9B329B0BC2E56EA /* ofxSmartFont.cpp in Sources */, 595 | FBF33B1A4D323955BA965F7B /* ofxLedController.cpp in Sources */, 596 | F7A0454B4E90992C5F26200E /* ofxLedDmx.cpp in Sources */, 597 | 286029986107AE7D1E316D5F /* ofxLedRpi.cpp in Sources */, 598 | 3A68D60BBC83A9B2916DD444 /* ofxLedMapper.cpp in Sources */, 599 | E2564CF7DDB3713772BB682E /* ofxUDPManager.cpp in Sources */, 600 | 66CA411C5A9664E27326BF36 /* ofxTCPServer.cpp in Sources */, 601 | 125506CD3E5F428AAFE5CC65 /* ofxTCPManager.cpp in Sources */, 602 | 960D20B191346612D5C05A6A /* ofxTCPClient.cpp in Sources */, 603 | 661A1991F5CE4CCC2919D8E7 /* ofxNetworkUtils.cpp in Sources */, 604 | 8D60C222CBD3F869382832E9 /* ofxSyphonServer.mm in Sources */, 605 | 1F558B76FB3412843DDAA031 /* ofxSyphonClient.mm in Sources */, 606 | 11DF9AB1B4EAA63E3B190CA0 /* ofxSyphonServerDirectory.mm in Sources */, 607 | C9109422648B170B07A778CF /* SyphonNameboundClient.m in Sources */, 608 | 63B57AC5BF4EF088491E0317 /* ofxXmlSettings.cpp in Sources */, 609 | 5A4349E9754D6FA14C0F2A3A /* tinyxmlparser.cpp in Sources */, 610 | 9D44DC88EF9E7991B4A09951 /* tinyxmlerror.cpp in Sources */, 611 | 933A2227713C720CEFF80FD9 /* tinyxml.cpp in Sources */, 612 | ); 613 | runOnlyForDeploymentPostprocessing = 0; 614 | }; 615 | /* End PBXSourcesBuildPhase section */ 616 | 617 | /* Begin PBXTargetDependency section */ 618 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */ = { 619 | isa = PBXTargetDependency; 620 | name = openFrameworks; 621 | targetProxy = E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */; 622 | }; 623 | /* End PBXTargetDependency section */ 624 | 625 | /* Begin XCBuildConfiguration section */ 626 | 99FA3DBB1C7456C400CFA0EE /* AppStore */ = { 627 | isa = XCBuildConfiguration; 628 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 629 | buildSettings = { 630 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 631 | COPY_PHASE_STRIP = YES; 632 | DEAD_CODE_STRIPPING = YES; 633 | GCC_AUTO_VECTORIZATION = YES; 634 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 635 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 636 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 637 | GCC_OPTIMIZATION_LEVEL = 3; 638 | "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = "DISTRIBUTION=1"; 639 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 640 | GCC_UNROLL_LOOPS = YES; 641 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 642 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 643 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 644 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 645 | GCC_WARN_UNUSED_VALUE = NO; 646 | GCC_WARN_UNUSED_VARIABLE = NO; 647 | HEADER_SEARCH_PATHS = ( 648 | "$(OF_CORE_HEADERS)", 649 | src, 650 | ../../../addons/ofxDatGui/src, 651 | ../../../addons/ofxDatGui/src/components, 652 | ../../../addons/ofxDatGui/src/core, 653 | ../../../addons/ofxDatGui/src/libs, 654 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont, 655 | "../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme-img", 656 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src, 657 | ../../../addons/ofxDatGui/src/themes, 658 | ../../../addons/ofxLedMapper/src, 659 | ../../../addons/ofxLedMapper/src/grab, 660 | ../../../addons/ofxLedMapper/src/output, 661 | ../../../addons/ofxNetwork/src, 662 | ../../../addons/ofxSyphon/libs, 663 | ../../../addons/ofxSyphon/libs/Syphon, 664 | ../../../addons/ofxSyphon/libs/Syphon/lib, 665 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 666 | ../../../addons/ofxSyphon/libs/Syphon/src, 667 | ../../../addons/ofxSyphon/src, 668 | ../../../addons/ofxXmlSettings/libs, 669 | ../../../addons/ofxXmlSettings/src, 670 | ); 671 | MACOSX_DEPLOYMENT_TARGET = 10.9; 672 | OTHER_CPLUSPLUSFLAGS = ( 673 | "-D__MACOSX_CORE__", 674 | "-mtune=native", 675 | ); 676 | SDKROOT = macosx; 677 | }; 678 | name = AppStore; 679 | }; 680 | 99FA3DBC1C7456C400CFA0EE /* AppStore */ = { 681 | isa = XCBuildConfiguration; 682 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 683 | buildSettings = { 684 | "CLANG_CXX_LANGUAGE_STANDARD[arch=i386]" = "c++14"; 685 | "CLANG_CXX_LANGUAGE_STANDARD[arch=x86_64]" = "c++14"; 686 | COMBINE_HIDPI_IMAGES = YES; 687 | COPY_PHASE_STRIP = YES; 688 | FRAMEWORK_SEARCH_PATHS = ( 689 | "$(inherited)", 690 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 691 | ); 692 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 693 | GCC_MODEL_TUNING = NONE; 694 | "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = "APPSTORE=1"; 695 | HEADER_SEARCH_PATHS = ( 696 | "$(OF_CORE_HEADERS)", 697 | src, 698 | ../../../addons/ofxDatGui/src, 699 | ../../../addons/ofxDatGui/src/components, 700 | ../../../addons/ofxDatGui/src/core, 701 | ../../../addons/ofxDatGui/src/libs, 702 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont, 703 | "../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme-img", 704 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src, 705 | ../../../addons/ofxDatGui/src/themes, 706 | ../../../addons/ofxLedMapper/src, 707 | ../../../addons/ofxLedMapper/src/grab, 708 | ../../../addons/ofxLedMapper/src/output, 709 | ../../../addons/ofxNetwork/src, 710 | ../../../addons/ofxSyphon/libs, 711 | ../../../addons/ofxSyphon/libs/Syphon, 712 | ../../../addons/ofxSyphon/libs/Syphon/lib, 713 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 714 | ../../../addons/ofxSyphon/libs/Syphon/src, 715 | ../../../addons/ofxSyphon/src, 716 | ../../../addons/ofxXmlSettings/libs, 717 | ../../../addons/ofxXmlSettings/src, 718 | ); 719 | ICON = "$(ICON_NAME_RELEASE)"; 720 | ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; 721 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 722 | INSTALL_PATH = /Applications; 723 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 724 | PRODUCT_NAME = "$(TARGET_NAME)"; 725 | WRAPPER_EXTENSION = app; 726 | baseConfigurationReference = E4EB6923138AFD0F00A09F29; 727 | }; 728 | name = AppStore; 729 | }; 730 | E4B69B4E0A3A1720003C02F2 /* Debug */ = { 731 | isa = XCBuildConfiguration; 732 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 733 | buildSettings = { 734 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 735 | COPY_PHASE_STRIP = NO; 736 | DEAD_CODE_STRIPPING = YES; 737 | GCC_AUTO_VECTORIZATION = YES; 738 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 739 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 740 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 741 | GCC_OPTIMIZATION_LEVEL = 0; 742 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 743 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 744 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 745 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 746 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 747 | GCC_WARN_UNUSED_VALUE = NO; 748 | GCC_WARN_UNUSED_VARIABLE = NO; 749 | HEADER_SEARCH_PATHS = ( 750 | "$(OF_CORE_HEADERS)", 751 | src, 752 | ../../../addons/ofxDatGui/src, 753 | ../../../addons/ofxDatGui/src/components, 754 | ../../../addons/ofxDatGui/src/core, 755 | ../../../addons/ofxDatGui/src/libs, 756 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont, 757 | "../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme-img", 758 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src, 759 | ../../../addons/ofxDatGui/src/themes, 760 | ../../../addons/ofxLedMapper/src, 761 | ../../../addons/ofxLedMapper/src/grab, 762 | ../../../addons/ofxLedMapper/src/output, 763 | ../../../addons/ofxNetwork/src, 764 | ../../../addons/ofxSyphon/libs, 765 | ../../../addons/ofxSyphon/libs/Syphon, 766 | ../../../addons/ofxSyphon/libs/Syphon/lib, 767 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 768 | ../../../addons/ofxSyphon/libs/Syphon/src, 769 | ../../../addons/ofxSyphon/src, 770 | ../../../addons/ofxXmlSettings/libs, 771 | ../../../addons/ofxXmlSettings/src, 772 | ); 773 | MACOSX_DEPLOYMENT_TARGET = 10.9; 774 | ONLY_ACTIVE_ARCH = YES; 775 | OTHER_CPLUSPLUSFLAGS = ( 776 | "-D__MACOSX_CORE__", 777 | "-mtune=native", 778 | ); 779 | SDKROOT = macosx; 780 | }; 781 | name = Debug; 782 | }; 783 | E4B69B4F0A3A1720003C02F2 /* Release */ = { 784 | isa = XCBuildConfiguration; 785 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 786 | buildSettings = { 787 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 788 | COPY_PHASE_STRIP = YES; 789 | DEAD_CODE_STRIPPING = YES; 790 | GCC_AUTO_VECTORIZATION = YES; 791 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 792 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 793 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 794 | GCC_OPTIMIZATION_LEVEL = 3; 795 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 796 | GCC_UNROLL_LOOPS = YES; 797 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 798 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 799 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 800 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 801 | GCC_WARN_UNUSED_VALUE = NO; 802 | GCC_WARN_UNUSED_VARIABLE = NO; 803 | HEADER_SEARCH_PATHS = ( 804 | "$(OF_CORE_HEADERS)", 805 | src, 806 | ../../../addons/ofxDatGui/src, 807 | ../../../addons/ofxDatGui/src/components, 808 | ../../../addons/ofxDatGui/src/core, 809 | ../../../addons/ofxDatGui/src/libs, 810 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont, 811 | "../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme-img", 812 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src, 813 | ../../../addons/ofxDatGui/src/themes, 814 | ../../../addons/ofxLedMapper/src, 815 | ../../../addons/ofxLedMapper/src/grab, 816 | ../../../addons/ofxLedMapper/src/output, 817 | ../../../addons/ofxNetwork/src, 818 | ../../../addons/ofxSyphon/libs, 819 | ../../../addons/ofxSyphon/libs/Syphon, 820 | ../../../addons/ofxSyphon/libs/Syphon/lib, 821 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 822 | ../../../addons/ofxSyphon/libs/Syphon/src, 823 | ../../../addons/ofxSyphon/src, 824 | ../../../addons/ofxXmlSettings/libs, 825 | ../../../addons/ofxXmlSettings/src, 826 | ); 827 | MACOSX_DEPLOYMENT_TARGET = 10.9; 828 | OTHER_CPLUSPLUSFLAGS = ( 829 | "-D__MACOSX_CORE__", 830 | "-mtune=native", 831 | ); 832 | SDKROOT = macosx; 833 | }; 834 | name = Release; 835 | }; 836 | E4B69B600A3A1757003C02F2 /* Debug */ = { 837 | isa = XCBuildConfiguration; 838 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 839 | buildSettings = { 840 | CLANG_CXX_LANGUAGE_STANDARD = "c++14"; 841 | COMBINE_HIDPI_IMAGES = YES; 842 | COPY_PHASE_STRIP = NO; 843 | FRAMEWORK_SEARCH_PATHS = ( 844 | "$(inherited)", 845 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 846 | ); 847 | GCC_DYNAMIC_NO_PIC = NO; 848 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 849 | GCC_MODEL_TUNING = NONE; 850 | HEADER_SEARCH_PATHS = ( 851 | "$(OF_CORE_HEADERS)", 852 | src, 853 | ../../../addons/ofxDatGui/src, 854 | ../../../addons/ofxDatGui/src/components, 855 | ../../../addons/ofxDatGui/src/core, 856 | ../../../addons/ofxDatGui/src/libs, 857 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont, 858 | "../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme-img", 859 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src, 860 | ../../../addons/ofxDatGui/src/themes, 861 | ../../../addons/ofxLedMapper/src, 862 | ../../../addons/ofxLedMapper/src/grab, 863 | ../../../addons/ofxLedMapper/src/output, 864 | ../../../addons/ofxNetwork/src, 865 | ../../../addons/ofxSyphon/libs, 866 | ../../../addons/ofxSyphon/libs/Syphon, 867 | ../../../addons/ofxSyphon/libs/Syphon/lib, 868 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 869 | ../../../addons/ofxSyphon/libs/Syphon/src, 870 | ../../../addons/ofxSyphon/src, 871 | ../../../addons/ofxXmlSettings/libs, 872 | ../../../addons/ofxXmlSettings/src, 873 | ); 874 | ICON = "$(ICON_NAME_DEBUG)"; 875 | ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; 876 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 877 | INSTALL_PATH = /Applications; 878 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 879 | PRODUCT_NAME = "$(TARGET_NAME)Debug"; 880 | WRAPPER_EXTENSION = app; 881 | }; 882 | name = Debug; 883 | }; 884 | E4B69B610A3A1757003C02F2 /* Release */ = { 885 | isa = XCBuildConfiguration; 886 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 887 | buildSettings = { 888 | CLANG_CXX_LANGUAGE_STANDARD = "c++14"; 889 | COMBINE_HIDPI_IMAGES = YES; 890 | COPY_PHASE_STRIP = YES; 891 | FRAMEWORK_SEARCH_PATHS = ( 892 | "$(inherited)", 893 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 894 | ); 895 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 896 | GCC_MODEL_TUNING = NONE; 897 | "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = "NDEBUG=1"; 898 | HEADER_SEARCH_PATHS = ( 899 | "$(OF_CORE_HEADERS)", 900 | src, 901 | ../../../addons/ofxDatGui/src, 902 | ../../../addons/ofxDatGui/src/components, 903 | ../../../addons/ofxDatGui/src/core, 904 | ../../../addons/ofxDatGui/src/libs, 905 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont, 906 | "../../../addons/ofxDatGui/src/libs/ofxSmartFont/readme-img", 907 | ../../../addons/ofxDatGui/src/libs/ofxSmartFont/src, 908 | ../../../addons/ofxDatGui/src/themes, 909 | ../../../addons/ofxLedMapper/src, 910 | ../../../addons/ofxLedMapper/src/grab, 911 | ../../../addons/ofxLedMapper/src/output, 912 | ../../../addons/ofxNetwork/src, 913 | ../../../addons/ofxSyphon/libs, 914 | ../../../addons/ofxSyphon/libs/Syphon, 915 | ../../../addons/ofxSyphon/libs/Syphon/lib, 916 | ../../../addons/ofxSyphon/libs/Syphon/lib/osx, 917 | ../../../addons/ofxSyphon/libs/Syphon/src, 918 | ../../../addons/ofxSyphon/src, 919 | ../../../addons/ofxXmlSettings/libs, 920 | ../../../addons/ofxXmlSettings/src, 921 | ); 922 | ICON = "$(ICON_NAME_RELEASE)"; 923 | ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; 924 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 925 | INSTALL_PATH = /Applications; 926 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 927 | PRODUCT_NAME = "$(TARGET_NAME)"; 928 | WRAPPER_EXTENSION = app; 929 | baseConfigurationReference = E4EB6923138AFD0F00A09F29; 930 | }; 931 | name = Release; 932 | }; 933 | /* End XCBuildConfiguration section */ 934 | 935 | /* Begin XCConfigurationList section */ 936 | E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "ledMapper" */ = { 937 | isa = XCConfigurationList; 938 | buildConfigurations = ( 939 | E4B69B4E0A3A1720003C02F2 /* Debug */, 940 | E4B69B4F0A3A1720003C02F2 /* Release */, 941 | 99FA3DBB1C7456C400CFA0EE /* AppStore */, 942 | ); 943 | defaultConfigurationIsVisible = 0; 944 | defaultConfigurationName = Release; 945 | }; 946 | E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "ledMapper" */ = { 947 | isa = XCConfigurationList; 948 | buildConfigurations = ( 949 | E4B69B600A3A1757003C02F2 /* Debug */, 950 | E4B69B610A3A1757003C02F2 /* Release */, 951 | 99FA3DBC1C7456C400CFA0EE /* AppStore */, 952 | ); 953 | defaultConfigurationIsVisible = 0; 954 | defaultConfigurationName = Release; 955 | }; 956 | /* End XCConfigurationList section */ 957 | }; 958 | rootObject = E4B69B4C0A3A1720003C02F2 /* Project object */; 959 | } 960 | -------------------------------------------------------------------------------- /ledMapper.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ledMapper.xcodeproj/xcshareddata/xcschemes/ledMapper Debug.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /ledMapper.xcodeproj/xcshareddata/xcschemes/ledMapper Release.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /ledmapper_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techtim/ledMapper/8e5733b3fc57302f28893e9111154bd79debaf52/ledmapper_icon.ico -------------------------------------------------------------------------------- /openFrameworks-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | cc.openFrameworks.ofapp 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | APPL 15 | CFBundleSignature 16 | ???? 17 | CFBundleVersion 18 | 1.0 19 | CFBundleIconFile 20 | ${ICON} 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/Player.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Player.cpp 3 | // ledMapper 4 | // 5 | // Created by Tim Tvl on 7/15/18. 6 | // 7 | // 8 | 9 | #include "Player.h" 10 | 11 | static string s_playerConfName = "playerConf.json"; 12 | 13 | ostream &operator<<(ostream &os, const Content &c) 14 | { 15 | os << "content id=" << c.id << ", " << c.path << ", durationMs=" << c.durationMs 16 | << ", startMs=" << c.startMs; 17 | return os; 18 | } 19 | 20 | Player::Player() 21 | : m_playing(true) 22 | , m_curContent("") 23 | , m_prevContent("") 24 | , m_fadeMs(3000) 25 | , m_configPath(LedMapper::LM_CONFIG_PATH) 26 | #ifndef LED_MAPPER_NO_GUI 27 | , m_gui(nullptr) 28 | , m_listVideos(nullptr) 29 | #endif 30 | { 31 | setupGui(); 32 | } 33 | 34 | Player::~Player() { ; } 35 | 36 | void Player::setupGui() 37 | { 38 | #ifndef LED_MAPPER_NO_GUI 39 | m_gui = make_unique(ofxDatGuiAnchor::TOP_RIGHT); 40 | m_guiTheme = make_unique(); 41 | 42 | m_gui->addHeader(LMGUIPlayer); 43 | 44 | auto togglePlay = m_gui->addToggle(LMGUITogglePlay, true); 45 | togglePlay->bind(m_playing); 46 | togglePlay->onButtonEvent(this, &Player::onButtonClick); 47 | 48 | auto slider = m_gui->addSlider(LMGUISliderFadeTime, 0, 10); 49 | slider->setPrecision(2); 50 | slider->onSliderEvent(this, &Player::onSliderEvent); 51 | 52 | auto button = m_gui->addButton(LMGUIButtonSave); 53 | button->onButtonEvent(this, &Player::onButtonClick); 54 | button->setLabelAlignment(ofxDatGuiAlignment::CENTER); 55 | button = m_gui->addButton(LMGUIButtonLoad); 56 | button->onButtonEvent(this, &Player::onButtonClick); 57 | button->setLabelAlignment(ofxDatGuiAlignment::CENTER); 58 | 59 | /// TODO fix for unique_ptr, need to move DatGui to smart ptrs for that 60 | m_listVideos = new ofxDatGuiScrollView(LMGUIListPlaylist, 10); 61 | m_listVideos->onScrollViewEvent(this, &Player::onScrollViewEvent); 62 | m_listVideos->setBackgroundColor(ofColor(10)); 63 | m_listVideos->setTheme(m_guiTheme.get()); 64 | 65 | button = m_gui->addButton(LMGUIListPlaylistDelete); 66 | button->onButtonEvent(this, &Player::onButtonClick); 67 | button->setLabelAlignment(ofxDatGuiAlignment::CENTER); 68 | 69 | auto folder = m_gui->addFolder(LMGUIListPlaylist); 70 | folder->attachItem(m_listVideos); 71 | folder->expand(); 72 | 73 | m_gui->setTheme(m_guiTheme.get(), true); 74 | m_gui->setWidth(LM_GUI_WIDTH); 75 | m_gui->setAutoDraw(false); 76 | #endif 77 | } 78 | 79 | void Player::draw(float x, float y, float w, float h) 80 | { 81 | if (m_contentPlayers.empty() || !m_playing || m_curContent == "") 82 | return; 83 | 84 | auto nowMs = ofGetElapsedTimeMillis(); 85 | auto &cur = m_contentPlayers[m_curContent]; 86 | auto &prev = m_contentPlayers[m_prevContent]; 87 | 88 | /// Duration and position return in seconds, check if it's time to show next video 89 | if (nowMs > cur.endMs - cur.fadeMs) { 90 | auto nextC = getNextContent(m_curContent); 91 | setCurrentContent(getNextContent(m_curContent)); 92 | } 93 | 94 | ofSetColor(m_colorize); 95 | cur.draw(x, y, w, h); 96 | 97 | if (m_prevContent != "" && nowMs <= prev.endMs && nowMs > prev.endMs - prev.fadeMs) { 98 | float fadeColor = ofMap(prev.endMs - nowMs, prev.fadeMs, 0, 1.f, 0.f); 99 | ofSetColor(m_colorize.r, m_colorize.g, m_colorize.b, m_colorize.a * fadeColor); 100 | prev.draw(x, y, w, h); 101 | } 102 | } 103 | 104 | void Player::setGuiPosition(int x, int y) { m_gui->setPosition(x, y); } 105 | 106 | ofxDatGui *Player::getGui() { return m_gui.get(); }; 107 | 108 | void Player::drawGui() 109 | { 110 | if (m_gui == nullptr) 111 | return; 112 | 113 | m_gui->update(); 114 | m_listVideos->update(); 115 | m_gui->draw(); 116 | } 117 | 118 | #include 119 | template inline string checkUniqueName(const string _name, map &mapToCheck) 120 | { 121 | auto it = mapToCheck.lower_bound(_name); 122 | if (it == mapToCheck.end()) { 123 | ofLogVerbose() << "this name is unique=" << _name; 124 | return _name; 125 | } 126 | 127 | regex clean_from_num(" [0-9]+$"); 128 | 129 | string newName = regex_replace(_name, clean_from_num, ""); 130 | regex check_for_integer(newName + " ([0-9]+)"); 131 | 132 | smatch base_match; 133 | string num = "0"; 134 | 135 | while (it != mapToCheck.end() && regex_match(it->first, base_match, check_for_integer)) { 136 | if (base_match.size() > 1) { 137 | string tmp_num = base_match[1].str(); 138 | if (ofToInt(tmp_num) > ofToInt(num)) 139 | num = tmp_num; // find out how to sort right 140 | ofLogVerbose() << _name << " has a num " << num << '\n'; 141 | } 142 | ++it; 143 | } 144 | 145 | newName += ofToString(ofToInt(num) + 1); 146 | ofLogVerbose("FINAL unique name=" + newName); 147 | return newName + " " + ofToString(ofToInt(num) + 1); 148 | } 149 | 150 | void Player::addContent(const string &path) 151 | { 152 | std::filesystem::path pth(path); 153 | if (!pth.has_filename()) 154 | return; 155 | 156 | ofVideoPlayer newVideo; 157 | newVideo.setPixelFormat(OF_PIXELS_BGRA); // BGRA fix incorrect video texture on win 158 | newVideo.setLoopState(OF_LOOP_NONE); 159 | 160 | if (!newVideo.load(path)) 161 | return; 162 | 163 | newVideo.setVolume(0.0f); 164 | string id = checkUniqueName(pth.filename().string(), m_contentPlayers); 165 | Content cont; 166 | cont.id = id; 167 | cont.path = path; 168 | cont.durationMs = newVideo.getDuration() * 1000; 169 | cont.type = "video"; 170 | cont.video = move(newVideo); 171 | ofLogVerbose() << "Add " << cont; 172 | 173 | m_listVideos->add(cont.id); 174 | m_contentCue.push_back(cont.id); 175 | m_contentPlayers[cont.id] = move(cont); 176 | 177 | setCurrentContent(id); 178 | } 179 | 180 | void Player::deleteContent(const string &id) 181 | { 182 | auto it = find_if(begin(m_contentCue), end(m_contentCue), 183 | [&id](const string &cueId) { return cueId == id; }); 184 | if (it == end(m_contentCue)) 185 | return; 186 | 187 | /// if deleting current set next content 188 | m_listVideos->remove(it - begin(m_contentCue)); 189 | m_contentCue.erase(it); 190 | m_contentPlayers.erase(id); 191 | 192 | ofLogVerbose(m_prevContent == id ? "m_prevContent=" + m_prevContent + " was Deleted" : ""); 193 | 194 | /// if deleting last set empty current and prev videos 195 | if (m_contentCue.size() == 1) { 196 | ofLogVerbose() << "[Player] Removing last content id=" << id; 197 | m_curContent = ""; 198 | m_prevContent = ""; 199 | } 200 | else if (id == m_curContent) 201 | setCurrentContent(getNextContent(m_curContent)); 202 | 203 | updateListView(); 204 | } 205 | 206 | void Player::setCurrentContent(const string &id) 207 | { 208 | if (m_contentPlayers.empty() || m_contentPlayers.count(id) == 0) 209 | return; 210 | 211 | ofLogNotice() << "set current Content to id=" << id; 212 | 213 | auto nowMs = ofGetElapsedTimeMillis(); 214 | 215 | if (m_contentPlayers.count(m_prevContent) && m_contentPlayers[m_prevContent].type == "video" 216 | && nowMs > m_contentPlayers[m_prevContent].endMs) 217 | m_contentPlayers[m_prevContent].video.stop(); 218 | 219 | if (m_curContent == id) { 220 | m_contentPlayers[m_curContent].endMs = nowMs + m_contentPlayers[m_curContent].durationMs; 221 | if (m_contentPlayers[m_prevContent].type == "video") { 222 | m_contentPlayers[m_prevContent].video.play(); 223 | } 224 | return; 225 | } 226 | 227 | /// if content deleted set prev content to empty 228 | m_prevContent = m_contentPlayers.count(m_curContent) ? m_curContent : ""; 229 | 230 | ofLogVerbose(m_prevContent == id ? "m_prevContent=" + m_prevContent + " was Deleted" : ""); 231 | 232 | m_curContent = id; 233 | m_contentPlayers[m_curContent].startMs = nowMs; 234 | m_contentPlayers[m_curContent].endMs = nowMs + m_contentPlayers[m_curContent].durationMs; 235 | /// fade longer than duration - set fade to duration/3 236 | m_contentPlayers[m_curContent].fadeMs = m_fadeMs > m_contentPlayers[m_curContent].durationMs 237 | ? m_contentPlayers[m_curContent].durationMs * 0.33 238 | : m_fadeMs; 239 | 240 | if (m_contentPlayers[m_curContent].type == "video") 241 | m_contentPlayers[m_curContent].video.play(); 242 | 243 | updateListView(); 244 | } 245 | 246 | const string Player::getNextContent(const string &id) 247 | { 248 | if (m_contentCue.empty()) 249 | return ""; 250 | 251 | auto it = find_if(begin(m_contentCue), end(m_contentCue), 252 | [&id](const string &cueId) { return cueId == id; }); 253 | ofLogVerbose() << "[Player] getNextContent id=" << *it; 254 | /// if id not found or is last one return first in cue 255 | return (it == m_contentCue.end() || (it + 1) == m_contentCue.end()) ? m_contentCue.front() 256 | : *(it + 1); 257 | } 258 | 259 | void Player::setColorize(int r, int g, int b, int a) { m_colorize.set(r, g, b, a); } 260 | 261 | void Player::updateListView() 262 | { 263 | #ifndef LED_MAPPER_NO_GUI 264 | for (auto &id : m_contentCue) { 265 | assert(m_listVideos->get(id)); 266 | if (m_listVideos->get(id) != nullptr) 267 | m_listVideos->get(id)->setBackgroundColor(ofColor(30)); 268 | } 269 | 270 | if (m_curContent != "") { 271 | assert(m_listVideos->get(m_curContent)); 272 | m_listVideos->get(m_curContent) 273 | ->setBackgroundColor(ofColor::fromHex(LedMapper::LM_COLOR_GREEN_DARK)); 274 | } 275 | #endif 276 | } 277 | 278 | /// --------------------------- GUI EVENTS ---------------------------- 279 | #ifndef LED_MAPPER_NO_GUI 280 | void Player::onScrollViewEvent(ofxDatGuiScrollViewEvent e) 281 | { 282 | if (e.parent->getName() == LMGUIListPlaylist) { 283 | // check if item from list selected 284 | ofLogNotice() << LMGUIListPlaylist << " clicked content id=" << e.target->getLabel(); 285 | setCurrentContent(e.target->getLabel()); 286 | } 287 | } 288 | 289 | void Player::onButtonClick(ofxDatGuiButtonEvent e) 290 | { 291 | if (e.target->getName() == LMGUIListPlaylistDelete) { 292 | deleteContent(m_curContent); 293 | return; 294 | } 295 | if (e.target->getName() == LMGUIButtonSave) { 296 | save(m_configPath); 297 | return; 298 | } 299 | if (e.target->getName() == LMGUIButtonLoad) { 300 | load(m_configPath); 301 | return; 302 | } 303 | } 304 | 305 | void Player::onSliderEvent(ofxDatGuiSliderEvent e) 306 | { 307 | if (e.target->getName() == LMGUISliderFadeTime) 308 | m_fadeMs = e.target->getValue() * 1000; /// slide sets fade in seconds 309 | } 310 | 311 | #endif 312 | 313 | /// --------------------------- LOAD / SAVE / RESET ----------------------- 314 | 315 | void Player::save(const string &path) 316 | { 317 | m_configPath = path; 318 | ofJson conf; 319 | conf["isPlaying"] = m_playing; 320 | conf["fadeMs"] = m_fadeMs; 321 | 322 | /// Store contents in right order 323 | vector tmp; 324 | for (const auto &id : m_contentCue) 325 | tmp.push_back(m_contentPlayers[id]); 326 | conf["contents"] = tmp; 327 | 328 | ofSavePrettyJson(path + s_playerConfName, conf); 329 | } 330 | 331 | void Player::load(const string &path) 332 | { 333 | m_configPath = path; 334 | auto json = ofLoadJson(path + s_playerConfName); 335 | 336 | if (json.empty()) 337 | return; 338 | 339 | if (json.count("contents")) { 340 | /// clear current content 341 | reset(); 342 | 343 | try { 344 | vector contents = json.at("contents").get>(); 345 | for (const auto &c : contents) { 346 | addContent(c.path); 347 | } 348 | } 349 | catch (...) { 350 | ofLogError() << "invalid json for Player"; 351 | } 352 | } 353 | 354 | m_playing = json.at("isPlaying") ? json.at("isPlaying").get() : true; 355 | m_fadeMs = json.count("fadeMs") ? json.at("fadeMs").get() : 1000; 356 | } 357 | 358 | void Player::reset() 359 | { 360 | m_contentPlayers.clear(); 361 | m_contentCue.clear(); 362 | #ifndef LED_MAPPER_NO_GUI 363 | m_listVideos->clear(); 364 | #endif 365 | } 366 | -------------------------------------------------------------------------------- /src/Player.h: -------------------------------------------------------------------------------- 1 | // 2 | // Player.hpp 3 | // ledMapper 4 | // 5 | // Created by Tim Tvl on 7/15/18. 6 | // 7 | // 8 | #pragma once 9 | 10 | #include "Common.h" 11 | #include "ofMain.h" 12 | #include "ofxDatGui.h" 13 | 14 | struct Content { 15 | string id; 16 | string path; 17 | string type; 18 | uint64_t durationMs, startMs, endMs, fadeMs; 19 | ofVideoPlayer video; 20 | void draw(float x, float y, float w, float h) 21 | { 22 | video.update(); 23 | video.draw(x, y, w, h); 24 | } 25 | }; 26 | 27 | static void to_json(ofJson &j, const Content &c) 28 | { 29 | j = ofJson{ { "id", c.id }, { "path", c.path }, { "type", c.type } }; 30 | } 31 | 32 | static void from_json(const ofJson &j, Content &c) 33 | { 34 | c.id = j.at("id").get(); 35 | c.path = j.at("path").get(); 36 | c.type = j.at("type").get(); 37 | } 38 | 39 | class Player { 40 | std::map m_contentPlayers; 41 | std::vector m_contentCue; 42 | string m_curContent, m_prevContent; 43 | uint64_t m_fadeMs, m_fadeStart; 44 | long m_curVideoStart; /// hack aroung VideoPlayer.getPosition that don't work 45 | bool m_playing; 46 | string m_configPath; 47 | ofColor m_colorize; 48 | #ifndef LED_MAPPER_NO_GUI 49 | unique_ptr m_gui; 50 | ofxDatGuiScrollView *m_listVideos; 51 | unique_ptr m_guiTheme; 52 | #endif 53 | 54 | public: 55 | Player(); 56 | ~Player(); 57 | 58 | void load(const string &path); 59 | void save(const string &path); 60 | void reset(); 61 | void setColorize(int r, int g, int b, int a); 62 | void setupGui(); 63 | 64 | void setGuiPosition(int x, int y); 65 | void draw(float x, float y, float w, float h); 66 | void drawGui(); 67 | ofxDatGui *getGui(); 68 | void addContent(const string &path); 69 | void deleteContent(const string &id); 70 | void setCurrentContent(const string &id); 71 | const string getNextContent(const string &id); 72 | 73 | void updateListView(); 74 | 75 | #ifndef LED_MAPPER_NO_GUI 76 | void onButtonClick(ofxDatGuiButtonEvent e); 77 | void onScrollViewEvent(ofxDatGuiScrollViewEvent e); 78 | void onSliderEvent(ofxDatGuiSliderEvent e); 79 | #endif 80 | }; 81 | -------------------------------------------------------------------------------- /src/ledMapperApp.cpp: -------------------------------------------------------------------------------- 1 | #include "ledMapperApp.h" 2 | 3 | #define SYPHON_W 1920 4 | #define SYPHON_H 1080 5 | 6 | static const string s_configName = "config" + LedMapper::LM_CONFIG_EXTENSION; 7 | static const string s_playerFolderPath = "Player"; 8 | 9 | static const vector s_menuItems{ "Input", "Control", "Player" }; 10 | 11 | using namespace LedMapper; 12 | 13 | //-------------------------------------------------------------- 14 | void ledMapperApp::setup() 15 | { 16 | 17 | #ifndef NDEBUG 18 | ofSetLogLevel(OF_LOG_VERBOSE); 19 | #else 20 | ofSetLogLevel(OF_LOG_ERROR); 21 | 22 | #ifdef WIN32 23 | // no-op 24 | #elif defined(__APPLE__) 25 | ofSetDataPathRoot("../Resources/"); 26 | #elif defined(TARGET_LINUX) 27 | // no-op 28 | #endif 29 | 30 | #endif 31 | 32 | ofSetFrameRate(60); 33 | ofSetEscapeQuitsApp(false); 34 | ofSetVerticalSync(true); 35 | 36 | ofEnableAntiAliasing(); 37 | ofSetCircleResolution(60); 38 | 39 | syphonW = 600; 40 | syphonH = 400; 41 | syphonX = 310; 42 | syphonY = 210; 43 | 44 | m_configPath = LM_CONFIG_PATH; 45 | m_configName = s_configName; 46 | 47 | bMenuExpanded = true; 48 | bSetupGui = false; 49 | bTestImage = false; 50 | bTestImageAnimate = false; 51 | animateHue = 0.0; 52 | 53 | m_menuSelected = s_menuItems.front(); 54 | 55 | /// Init ofxLedMapper and Player instances before load 56 | m_ledMapper = make_unique(); 57 | m_player = make_unique(); 58 | 59 | load(m_configPath); 60 | 61 | #ifdef TARGET_WIN32 62 | m_spoutIn.setup(); 63 | #elif defined(TARGET_OSX) 64 | SyphonDir.setup(); 65 | Syphon1.setup(); 66 | #endif 67 | 68 | prev_dirIdx = -1; 69 | dirIdx = 0; 70 | 71 | m_fbo.allocate(SYPHON_W, SYPHON_H, GL_RGB); 72 | m_fbo.begin(); 73 | ofClear(0, 0, 0); 74 | m_fbo.end(); 75 | 76 | ofSetWindowTitle("ledMapper TVL"); 77 | 78 | textHelp = " Hold '1' / '2' / '3' + Left Click - add 'line' / 'circle' / 'region' grab object " 79 | "in active controller \n Hold BKSPS + Left Click - on line edges to delete line \n " 80 | "UP/DOWN keys - switch between controllers \n 's' - save , 'l' - load \n When turn " 81 | "on 'Debug controller' you can switch between all controlles to solo each and map " 82 | "easily"; 83 | } 84 | 85 | void ledMapperApp::setupGui() 86 | { 87 | m_guiTheme = make_unique(); 88 | 89 | /// setup menu gui 90 | m_guiMenu 91 | = make_unique("Menu", ofColor::fromHex(LedMapper::LM_COLOR_GREEN_DARK)); 92 | for (const auto &it : s_menuItems) { 93 | auto but = m_guiMenu->addButton(it); 94 | but->onButtonEvent(this, &ledMapperApp::onButtonClick); 95 | but->setLabelAlignment(ofxDatGuiAlignment::CENTER); 96 | } 97 | auto topTheme = make_unique(); 98 | m_guiMenu->setTheme(topTheme.get()); 99 | bMenuExpanded ? m_guiMenu->expand() : m_guiMenu->collapse(); 100 | m_guiMenu->horizontal(); 101 | 102 | /// setup gui responsible for video input 103 | m_guiInput->setAssetPath(""); 104 | m_guiInput = make_unique(ofxDatGuiAnchor::TOP_RIGHT); 105 | m_guiInput->setTheme(m_guiTheme.get()); 106 | m_guiInput->setWidth(LM_GUI_WIDTH); 107 | m_guiInput->setAutoDraw(false); 108 | m_guiInput->addHeader("Input"); 109 | 110 | m_syphonList = m_guiInput->addDropdown("source", vector()); 111 | m_syphonList->onDropdownEvent(this, &ledMapperApp::onDropdownEvent); 112 | updateVideoServers(); 113 | 114 | m_guiInput->addSlider("width", 100, 1920)->bind(syphonW); 115 | m_guiInput->addSlider("height", 100, 1920)->bind(syphonH); 116 | m_guiInput->addSlider("X offset", 0, 1000)->bind(syphonX); 117 | m_guiInput->addSlider("Y offset", 0, 1000)->bind(syphonY); 118 | 119 | m_guiInput->addSlider("bright", 0, 255)->bind(filterA); 120 | m_guiInput->addSlider("red", 0, 255)->bind(filterR); 121 | m_guiInput->addSlider("green", 0, 255)->bind(filterG); 122 | m_guiInput->addSlider("blue", 0, 255)->bind(filterB); 123 | 124 | m_guiInput->addToggle("test image")->bind(bTestImage); 125 | m_guiInput->addToggle("animate image")->bind(bTestImageAnimate); 126 | 127 | bSetupGui = true; 128 | updateGuiPosition(); 129 | } 130 | 131 | void ledMapperApp::updateGuiPosition() 132 | { 133 | if (!bSetupGui) 134 | return; 135 | 136 | m_guiMenu->setPosition(ofGetWidth() - m_guiMenu->getWidth(), 0); 137 | m_guiInput->setPosition(ofGetWidth() - LM_GUI_WIDTH, LM_GUI_TOP_BAR); 138 | m_ledMapper->setGuiPosition(ofGetWidth() - LM_GUI_WIDTH, LM_GUI_TOP_BAR); 139 | m_player->setGuiPosition(ofGetWidth() - LM_GUI_WIDTH, LM_GUI_TOP_BAR); 140 | } 141 | 142 | /// on menu item selection focus on needed gui and set needed lambda to draw items gui 143 | void ledMapperApp::selectMenuItem(const string &item) 144 | { 145 | /// because this guis are in one place first make invisible so they don't react when inavtive 146 | m_guiInput->setVisible(false); 147 | m_player->getGui()->setVisible(false); 148 | m_ledMapper->setGuiActive(false); 149 | 150 | if (m_menuSelected == "Control") { 151 | m_ledMapper->setGuiActive(true); 152 | m_drawMenuGuiFunc = [this]() { m_ledMapper->drawGui(); }; 153 | } 154 | else if (m_menuSelected == "Input") { 155 | m_guiInput->setVisible(true); 156 | m_drawMenuGuiFunc = [this]() { 157 | m_guiInput->update(); 158 | m_guiInput->draw(); 159 | }; 160 | } 161 | else if (m_menuSelected == "Player") { 162 | m_player->getGui()->setVisible(true); 163 | m_drawMenuGuiFunc = [this]() { m_player->drawGui(); }; 164 | } 165 | } 166 | 167 | //-------------------------------------------------------------- 168 | void ledMapperApp::update() 169 | { 170 | updateGuiPosition(); 171 | m_guiMenu->update(); 172 | 173 | updateVideoServers(); 174 | #ifdef TARGET_WIN32 175 | // receive Spout texture 176 | m_spoutIn.updateTexture(); 177 | #endif 178 | 179 | m_fbo.begin(); 180 | 181 | ofClear(0, 0, 0); 182 | 183 | ofTranslate(syphonX, syphonY); 184 | 185 | ofFill(); 186 | ofSetColor(filterR, filterG, filterB, filterA); 187 | 188 | /// Platform specific video stream input draw 189 | #ifdef TARGET_WIN32 190 | if (m_spoutIn.getTexture().isAllocated()) 191 | m_spoutIn.getTexture().draw(-syphonW / 2, -syphonH / 2, syphonW, syphonH); 192 | #elif defined(TARGET_OSX) 193 | if (Syphon1.getApplicationName() != "") { 194 | Syphon1.draw(-syphonW / 2, -syphonH / 2, syphonW, syphonH); 195 | } 196 | #endif 197 | 198 | if (bTestImage) { 199 | if (bTestImageAnimate) { 200 | ofColor col; 201 | col.setHsb(animateHue++, 255, filterA); 202 | ofSetColor(col); 203 | if (animateHue > 255) 204 | animateHue = 0.0; 205 | } 206 | ofDrawRectangle(-syphonW / 2, -syphonH / 2, syphonW, syphonH); 207 | } 208 | 209 | /// update color filter settings and draw playing video if has one 210 | m_player->setColorize(filterR, filterG, filterB, filterA); 211 | m_player->draw(-syphonW / 2, -syphonH / 2, syphonW, syphonH); 212 | 213 | m_fbo.end(); 214 | 215 | m_ledMapper->update(); 216 | } 217 | 218 | //-------------------------------------------------------------- 219 | void ledMapperApp::draw() 220 | { 221 | ofSetBackgroundColor(0); 222 | 223 | ofSetColor(255); 224 | m_fbo.draw(0, 0); 225 | 226 | /// update LM with grabbed pixels to send them 227 | m_ledMapper->send(m_fbo.getTexture()); 228 | /// draw LM grab objects 229 | m_ledMapper->draw(); 230 | 231 | /// GUI stuff 232 | if (bMenuExpanded != m_guiMenu->getIsExpanded()) { 233 | bMenuExpanded = m_guiMenu->getIsExpanded(); 234 | ofLogVerbose() << "Toggle menu to " << bMenuExpanded; 235 | } 236 | 237 | m_guiMenu->draw(); 238 | 239 | if (m_guiMenu->getIsExpanded() && bSetupGui) { 240 | m_drawMenuGuiFunc(); 241 | } 242 | 243 | ofSetWindowTitle("ledMapper TVL (fps: " + ofToString(static_cast(ofGetFrameRate())) + ")"); 244 | } 245 | 246 | void ledMapperApp::updateVideoServers() 247 | { 248 | #ifdef TARGET_WIN32 249 | /*if (bSetupGui && m_syphonList->size() != Spout.getSenderCount()) { 250 | vector list; 251 | for (int i = 0; i < Spout.getSenderCount(); i++) { 252 | list.push_back(Spout.getSenderName(i)); 253 | } 254 | m_syphonList->setDropdownList(list); 255 | if (prev_dirIdx == -1 && !list.empty()) { 256 | dirIdx = prev_dirIdx = 0; 257 | } 258 | 259 | }*/ 260 | #elif defined(TARGET_OSX) 261 | 262 | if (bSetupGui && m_syphonList->size() != SyphonDir.size()) { 263 | vector list; 264 | for (auto &serv : SyphonDir.getServerList()) { 265 | list.push_back(serv.serverName + ": " + serv.appName); 266 | } 267 | m_syphonList->setDropdownList(list); 268 | // -1 initial value 269 | if (Syphon1.getApplicationName() == "" && !list.empty()) { 270 | dirIdx = prev_dirIdx = 0; 271 | Syphon1.set(SyphonDir.getDescription(dirIdx)); 272 | } 273 | } 274 | 275 | #endif 276 | } 277 | 278 | void ledMapperApp::save(const string &folderPath) 279 | { 280 | ofJson conf; 281 | 282 | XML.clear(); 283 | 284 | conf["screenPosX"] = ofGetWindowPositionX(); 285 | conf["screenPosY"] = ofGetWindowPositionY(); 286 | conf["screenWidth"] = ofGetWidth(); 287 | conf["screenHeight"] = ofGetHeight(); 288 | 289 | conf["bMenuExpanded"] = bMenuExpanded; 290 | conf["menuSelected"] = m_menuSelected; 291 | 292 | conf["syphonW"] = syphonW; 293 | conf["syphonH"] = syphonH; 294 | conf["syphonX"] = syphonX; 295 | conf["syphonY"] = syphonY; 296 | conf["brightness"] = filterA; 297 | conf["filterR"] = filterR; 298 | conf["filterG"] = filterG; 299 | conf["filterB"] = filterB; 300 | conf["bTestImage"] = bTestImage; 301 | conf["bTestImageAnimate"] = bTestImageAnimate; 302 | 303 | ofSavePrettyJson(folderPath + s_configName, conf); 304 | 305 | m_ledMapper->save(folderPath); 306 | m_player->save(folderPath); 307 | } 308 | 309 | bool ledMapperApp::load(const string &folderPath) 310 | { 311 | /// if empty set default 312 | m_configPath = folderPath != "" ? folderPath : LM_CONFIG_PATH; 313 | 314 | auto conf = ofLoadJson(m_configPath + m_configName); 315 | 316 | /// if conf empty fill with defaults 317 | ofSetWindowPosition(conf.count("screenPosX") ? conf.at("screenPosX").get() : 100, 318 | conf.count("screenPosY") ? conf.at("screenPosY").get() : 100); 319 | ofSetWindowShape(conf.count("screenWidth") ? conf.at("screenWidth").get() : 1024, 320 | conf.count("screenHeight") ? conf.at("screenHeight").get() : 768); 321 | 322 | bMenuExpanded = conf.count("bMenuExpanded") ? conf.at("bMenuExpanded").get() : true; 323 | m_menuSelected 324 | = conf.count("menuSelected") ? conf.at("menuSelected").get() : s_menuItems.front(); 325 | 326 | syphonW = conf.count("syphonW") ? conf.at("syphonW").get() : 600; 327 | syphonH = conf.count("syphonH") ? conf.at("syphonH").get() : 400; 328 | syphonX = conf.count("syphonX") ? conf.at("syphonX").get() : 300; 329 | syphonY = conf.count("syphonY") ? conf.at("syphonY").get() : 200; 330 | filterA = conf.count("brightness") ? conf.at("brightness").get() : 150; 331 | filterR = conf.count("filterR") ? conf.at("filterR").get() : 255; 332 | filterG = conf.count("filterG") ? conf.at("filterG").get() : 255; 333 | filterB = conf.count("filterB") ? conf.at("filterB").get() : 255; 334 | bTestImage = conf.count("bTestImage") ? conf.at("bTestImage").get() : true; 335 | bTestImageAnimate 336 | = conf.count("bTestImageAnimate") ? conf.at("bTestImageAnimate").get() : true; 337 | 338 | m_ledMapper->load(folderPath); 339 | m_player->load(folderPath); 340 | 341 | setupGui(); 342 | selectMenuItem(m_menuSelected); 343 | 344 | return true; 345 | } 346 | 347 | //-------------------------------------------------------------- 348 | void ledMapperApp::onDropdownEvent(ofxDatGuiDropdownEvent e) 349 | { 350 | #ifdef TARGET_OSX 351 | if (e.child >= SyphonDir.size()) 352 | return; 353 | dirIdx = e.child; 354 | Syphon1.set(SyphonDir.getDescription(dirIdx)); 355 | #endif 356 | } 357 | 358 | void ledMapperApp::onButtonClick(ofxDatGuiButtonEvent e) 359 | { 360 | string name = e.target->getName(); 361 | 362 | /// check for Menu items click 363 | if (find_if(begin(s_menuItems), end(s_menuItems), 364 | [&name](const string &it) { return name == it; }) 365 | != end(s_menuItems)) { 366 | ofLogVerbose() << "Switch Menu to " << e.target->getName(); 367 | m_menuSelected = e.target->getName(); 368 | selectMenuItem(m_menuSelected); 369 | } 370 | } 371 | 372 | //-------------------------------------------------------------- 373 | void ledMapperApp::keyPressed(int key) 374 | { 375 | 376 | switch (key) { 377 | case 's': 378 | save(m_configPath); 379 | break; 380 | case 'l': 381 | load(m_configPath); 382 | break; 383 | case 'h': 384 | bHelp = !bHelp; 385 | break; 386 | #ifdef TARGET_WIN32 387 | case 'i': 388 | m_spoutIn.showSenders(); 389 | break; 390 | #endif 391 | default: 392 | break; 393 | } 394 | } 395 | 396 | //-------------------------------------------------------------- 397 | void ledMapperApp::keyReleased(int key) {} 398 | //-------------------------------------------------------------- 399 | void ledMapperApp::mouseMoved(int x, int y) {} 400 | //-------------------------------------------------------------- 401 | void ledMapperApp::mouseDragged(int x, int y, int button) {} 402 | //-------------------------------------------------------------- 403 | void ledMapperApp::mousePressed(int x, int y, int button) {} 404 | //-------------------------------------------------------------- 405 | void ledMapperApp::windowResized(int w, int h) { updateGuiPosition(); } 406 | 407 | void ledMapperApp::dragEvent(ofDragInfo info) 408 | { 409 | if (info.files.empty()) 410 | return; 411 | 412 | auto dragPt = info.position; 413 | 414 | // draggedImages.assign( info.files.size(), ofImage() ); 415 | for (const auto &filePath : info.files) { 416 | 417 | /// Check for config file in folder, if found load it and folder it contains 418 | if (filePath.compare(filePath.size() - LM_CONFIG_EXTENSION.size(), 419 | LM_CONFIG_EXTENSION.size(), LM_CONFIG_EXTENSION) 420 | == 0) { 421 | ofLogVerbose() << "!!!!!!! LedMapper CONFIG Path=" << filePath; 422 | std::filesystem::path pth(filePath); 423 | 424 | /// Update config name from default and load folder 425 | m_configName = pth.filename().string(); 426 | string containingFolder = pth.parent_path().string(); 427 | containingFolder.push_back(pth.preferred_separator); 428 | load(containingFolder); 429 | continue; 430 | } 431 | 432 | ofLogVerbose() << "DRAG FILE=" << filePath; 433 | /// Try import file to Player 434 | m_player->addContent(filePath); 435 | } 436 | } 437 | 438 | void ledMapperApp::exit() 439 | { 440 | #ifdef TARGET_WIN32 441 | m_spoutIn.exit(); 442 | #endif 443 | } 444 | -------------------------------------------------------------------------------- /src/ledMapperApp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ofMain.h" 4 | #include "ofxDatGui.h" 5 | #include "ofxLedMapper.h" 6 | #include "Player.h" 7 | 8 | #ifdef TARGET_WIN32 9 | #include "ofxSpout2Receiver.h" 10 | #elif defined(TARGET_OSX) 11 | #include "ofxSyphon.h" 12 | #endif 13 | 14 | class ledMapperApp : public ofBaseApp{ 15 | 16 | public: 17 | void setup(); 18 | void setupGui(); 19 | 20 | void update(); 21 | void updateGuiPosition(); 22 | void selectMenuItem(const string &item); 23 | void updateVideoServers(); 24 | void save(const string & folderPath = ""); 25 | bool load(const string & folderPath = ""); 26 | 27 | void draw(); 28 | void exit(); 29 | 30 | void onDropdownEvent(ofxDatGuiDropdownEvent e); 31 | void onButtonClick(ofxDatGuiButtonEvent e); 32 | void keyPressed(int key); 33 | void keyReleased(int key); 34 | void mouseMoved(int x, int y ); 35 | void mouseDragged(int x, int y, int button); 36 | void mousePressed(int x, int y, int button); 37 | void windowResized(int w, int h); 38 | void dragEvent(ofDragInfo info); 39 | 40 | string m_configPath, m_configName; 41 | 42 | unique_ptr m_ledMapper; 43 | unique_ptr m_player; 44 | ofFbo m_fbo; 45 | 46 | ofPixels m_pixels; 47 | ofTexture tex; 48 | 49 | unique_ptr m_guiMenu; 50 | unique_ptr m_guiInput; 51 | unique_ptr m_guiTheme; 52 | ofxDatGuiDropdown* m_syphonList; 53 | 54 | std::function m_drawMenuGuiFunc; 55 | string m_menuSelected; 56 | 57 | #ifdef TARGET_WIN32 58 | //ofxSpout::Receiver Spout; 59 | ofxSpout2::Receiver m_spoutIn; 60 | #elif defined(TARGET_OSX) 61 | ofxSyphonClient Syphon1, Syphon2; 62 | ofxSyphonServerDirectory SyphonDir; 63 | #endif 64 | int prev_dirIdx, dirIdx; 65 | 66 | int idSyphonServer, syphonW, syphonH, syphonX, syphonY; 67 | int filterA, filterR, filterG, filterB; 68 | bool bRotate; 69 | float rotate; 70 | int rotatePos; 71 | 72 | ofxXmlSettings XML; 73 | 74 | bool bHelp = false, bSetupGui, bTestImage, bTestImageAnimate, bMenuExpanded; 75 | float animateHue; 76 | string textHelp; 77 | }; 78 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | 3 | #include "ledMapperApp.h" 4 | 5 | #ifdef WIN32 6 | #pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") 7 | #endif 8 | 9 | //======================================================================== 10 | int main() 11 | { 12 | ofGLWindowSettings settings; 13 | settings.setGLVersion(3, 2); // <--- GL Programmable Renderer 14 | settings.setSize(1024, 768); 15 | ofCreateWindow(settings); // <-------- setup the GL context 16 | 17 | // this kicks off the running of my app 18 | // can be OF_WINDOW or OF_FULLSCREEN 19 | // pass in width and height too: 20 | ofRunApp(new ledMapperApp()); 21 | } 22 | --------------------------------------------------------------------------------