├── .classpath ├── .gitignore ├── .project ├── .settings └── org.eclipse.jdt.core.prefs ├── README.md ├── build.xml ├── core └── Info.plist ├── keywords.txt ├── mode.properties ├── src └── processing │ └── mode │ └── esp │ ├── CCTokenMarker.java │ ├── CTokenMarker.java │ ├── ESPBuild.java │ ├── ESPEditor.java │ ├── ESPLibrary.java │ ├── ESPMode.java │ └── ESPToolbar.java └── template └── sketch.cpp /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | /bin/ 3 | .DS_Store 4 | thumbs.db 5 | local.properties 6 | /mode/ 7 | 16* 8 | *master.zip 9 | /examples/ 10 | 11 | # openFramework .zip 12 | of_*.zip 13 | 14 | # ESP and dependencies 15 | core/include/* 16 | core/library/* 17 | core/data/* 18 | 19 | # the dist files 20 | ESPMode.zip 21 | ESPMode.txt 22 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | javascript-mode-processing 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled 3 | org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore 4 | org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull 5 | org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault 6 | org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable 7 | org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled 8 | org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning 9 | org.eclipse.jdt.core.compiler.problem.autoboxing=ignore 10 | org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning 11 | org.eclipse.jdt.core.compiler.problem.deadCode=ignore 12 | org.eclipse.jdt.core.compiler.problem.deprecation=warning 13 | org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled 14 | org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled 15 | org.eclipse.jdt.core.compiler.problem.discouragedReference=warning 16 | org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore 17 | org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore 18 | org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore 19 | org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled 20 | org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore 21 | org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning 22 | org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning 23 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=error 24 | org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning 25 | org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled 26 | org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning 27 | org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning 28 | org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore 29 | org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore 30 | org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning 31 | org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore 32 | org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore 33 | org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled 34 | org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore 35 | org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning 36 | org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled 37 | org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore 38 | org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore 39 | org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning 40 | org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning 41 | org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore 42 | org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning 43 | org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error 44 | org.eclipse.jdt.core.compiler.problem.nullReference=warning 45 | org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error 46 | org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning 47 | org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning 48 | org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore 49 | org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore 50 | org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore 51 | org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning 52 | org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore 53 | org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning 54 | org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore 55 | org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore 56 | org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore 57 | org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore 58 | org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore 59 | org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled 60 | org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning 61 | org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled 62 | org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled 63 | org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled 64 | org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore 65 | org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning 66 | org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled 67 | org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning 68 | org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning 69 | org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore 70 | org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning 71 | org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore 72 | org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning 73 | org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore 74 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore 75 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled 76 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled 77 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled 78 | org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore 79 | org.eclipse.jdt.core.compiler.problem.unusedImport=warning 80 | org.eclipse.jdt.core.compiler.problem.unusedLabel=warning 81 | org.eclipse.jdt.core.compiler.problem.unusedLocal=warning 82 | org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore 83 | org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore 84 | org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled 85 | org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled 86 | org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled 87 | org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning 88 | org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore 89 | org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning 90 | org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning 91 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ESP Mode for Processing 2 | 3 | [ESP](https://github.com/damellis/ESP/) is a system for applying machine learning to real-time sensor data. With ESP, machine learning pipelines are authored in C++ using the [Gesture Recognition Toolkit (GRT)](http://nickgillian.com/grt/). The ESP interface runs the pipeline, visualizing live sensor data and allowing for the collection of training data. For more information, see the [ESP wiki](https://github.com/damellis/ESP/wiki). 4 | 5 | This repository allows ESP examples to be edited and run from with the [Processing](https://processing.org) Development Environment (PDE). 6 | 7 | ### Pre-Requisites 8 | 9 | [Download Processing](https://processing.org/download/) and install it. You'll need a recent version, probably 3.2.1 or greater. Run Processing if you haven't used it before. 10 | 11 | ### Installation: Mac OS X 12 | 13 | 1. Install the Mac Command Line Tools: [macOS 10.12 Sierra](http://adcdownload.apple.com/Developer_Tools/Command_Line_Tools_macOS_10.12_for_Xcode_8/Command_Line_Tools_macOS_10.12_for_Xcode_8.dmg) or [OS X 10.11](http://adcdownload.apple.com/Developer_Tools/Command_Line_Tools_OS_X_10.11_for_Xcode_7.3.1/Command_Line_Tools_OS_X_10.11_for_Xcode_7.3.1.dmg). 14 | 2. Download [ESPMode-macosx.zip](https://github.com/damellis/processing-esp-mode/releases/download/v1.0.1/ESPMode-macosx.zip). 15 | 3. Unzip to the `modes` sub-folder of your Processing sketchbook folder (probably `~/Documents/Processing3` or `~/Documents/Processing`). 16 | 17 | ### Installation: Windows 18 | 19 | 1. Download and install the [Visual C++ Build Tools](http://landinghub.visualstudio.com/visual-cpp-build-tools). 20 | 2. Download [ESPMode-windows.zip](https://github.com/damellis/processing-esp-mode/releases/download/v1.0.1/ESPMode-windows.zip). 21 | 3. Unzip to the `modes` sub-directory of your Processing sketchbook directory (probably `Documents\Processing` or `Documents\Processing3`. 22 | 23 | ### Using ESP Mode 24 | 25 | Launch or restart Processing. Select "ESP" from the mode selection drop-down in the upper-right corner (which defaults to "Java"). See the examples window for some starting points for using ESP. 26 | -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 174 | 176 | 179 | 180 | 181 | 182 | 183 | 184 | 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 | -------------------------------------------------------------------------------- /core/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ESP 9 | CFBundleIconFile 10 | icon-debug.icns 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | APPL 15 | CFBundleSignature 16 | ???? 17 | 18 | 19 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | # keywords for ESP mode 2 | -------------------------------------------------------------------------------- /mode.properties: -------------------------------------------------------------------------------- 1 | name=ESP Mode 2 | category=Unknown 3 | authorList=David Mellis 4 | url=https://github.com/damellis/processing-esp-mode 5 | sentence=Adds a simple editor for ESP code examples 6 | paragraph=ESP is a system for applying machine learning to real-time sensor data. With ESP, machine learning pipelines are specified in C++ code, edited in the PDE. Hitting "play" launches the ESP GUI, which applies the pipeline to real-time sensor data and allows for the collection of training data. ESP builds on the Gesture Recognition Toolkit (GRT), a C++ machine learning library, and openFrameworks. 7 | version=1 8 | prettyVersion=1.0.1 9 | minRevision=252 10 | maxRevision=0 11 | imports=processing.mode.java.JavaMode 12 | -------------------------------------------------------------------------------- /src/processing/mode/esp/CCTokenMarker.java: -------------------------------------------------------------------------------- 1 | /* 2 | * CCTokenMarker.java - C++ token marker 3 | * Copyright (C) 1999 Slava Pestov 4 | * 5 | * You may use and modify this package for any purpose. Redistribution is 6 | * permitted, in both source and binary form, provided that this notice 7 | * remains intact in all source distributions of this package. 8 | */ 9 | 10 | package processing.mode.esp; 11 | 12 | import javax.swing.text.Segment; 13 | 14 | import processing.app.syntax.KeywordMap; 15 | import processing.app.syntax.Token; 16 | import processing.app.syntax.TokenMarker; 17 | 18 | /** 19 | * C++ token marker. 20 | * 21 | * @author Slava Pestov 22 | * @version $Id: CCTokenMarker.java,v 1.6 1999/12/13 03:40:29 sp Exp $ 23 | */ 24 | public class CCTokenMarker extends CTokenMarker 25 | { 26 | public CCTokenMarker() 27 | { 28 | super(true,getKeywords()); 29 | } 30 | 31 | public static KeywordMap getKeywords() 32 | { 33 | if(ccKeywords == null) 34 | { 35 | ccKeywords = new KeywordMap(false); 36 | 37 | ccKeywords.add("and", Token.KEYWORD3, false); 38 | ccKeywords.add("and_eq", Token.KEYWORD3, false); 39 | ccKeywords.add("asm", Token.KEYWORD2, false); // 40 | ccKeywords.add("auto", Token.KEYWORD1, false); // 41 | ccKeywords.add("bitand", Token.KEYWORD3, false); 42 | ccKeywords.add("bitor", Token.KEYWORD3, false); 43 | ccKeywords.add("bool",Token.KEYWORD3, false); 44 | ccKeywords.add("break", Token.KEYWORD1, false); // 45 | ccKeywords.add("case", Token.KEYWORD1, false); // 46 | ccKeywords.add("catch", Token.KEYWORD1, false); 47 | ccKeywords.add("char", Token.KEYWORD3, false); // 48 | ccKeywords.add("class", Token.KEYWORD3, false); 49 | ccKeywords.add("compl", Token.KEYWORD3, false); 50 | ccKeywords.add("const", Token.KEYWORD1, false); // 51 | ccKeywords.add("const_cast", Token.KEYWORD3, false); 52 | ccKeywords.add("continue", Token.KEYWORD1, false); // 53 | ccKeywords.add("default", Token.KEYWORD1, false); // 54 | ccKeywords.add("delete", Token.KEYWORD1, false); 55 | ccKeywords.add("do",Token.KEYWORD1, false); // 56 | ccKeywords.add("double" ,Token.KEYWORD3, false); // 57 | ccKeywords.add("dynamic_cast", Token.KEYWORD3, false); 58 | ccKeywords.add("else", Token.KEYWORD1, false); // 59 | ccKeywords.add("enum", Token.KEYWORD3, false); // 60 | ccKeywords.add("explicit", Token.KEYWORD1, false); 61 | ccKeywords.add("export", Token.KEYWORD2, false); 62 | ccKeywords.add("extern", Token.KEYWORD2, false); // 63 | ccKeywords.add("false", Token.LITERAL2, false); 64 | ccKeywords.add("float", Token.KEYWORD3, false); // 65 | ccKeywords.add("for", Token.KEYWORD1, false); // 66 | ccKeywords.add("friend", Token.KEYWORD1, false); 67 | ccKeywords.add("goto", Token.KEYWORD1, false); // 68 | ccKeywords.add("if", Token.KEYWORD1, false); // 69 | ccKeywords.add("inline", Token.KEYWORD1, false); 70 | ccKeywords.add("int", Token.KEYWORD3, false); // 71 | ccKeywords.add("long", Token.KEYWORD3, false); // 72 | ccKeywords.add("mutable", Token.KEYWORD3, false); 73 | ccKeywords.add("namespace", Token.KEYWORD2, false); 74 | ccKeywords.add("new", Token.KEYWORD1, false); 75 | ccKeywords.add("not", Token.KEYWORD3, false); 76 | ccKeywords.add("not_eq", Token.KEYWORD3, false); 77 | ccKeywords.add("operator", Token.KEYWORD3, false); 78 | ccKeywords.add("or", Token.KEYWORD3, false); 79 | ccKeywords.add("or_eq", Token.KEYWORD3, false); 80 | ccKeywords.add("private", Token.KEYWORD1, false); 81 | ccKeywords.add("protected", Token.KEYWORD1, false); 82 | ccKeywords.add("public", Token.KEYWORD1, false); 83 | ccKeywords.add("register", Token.KEYWORD1, false); 84 | ccKeywords.add("reinterpret_cast", Token.KEYWORD3, false); 85 | ccKeywords.add("return", Token.KEYWORD1, false); // 86 | ccKeywords.add("short", Token.KEYWORD3, false); // 87 | ccKeywords.add("signed", Token.KEYWORD3, false); // 88 | ccKeywords.add("sizeof", Token.KEYWORD1, false); // 89 | ccKeywords.add("static", Token.KEYWORD1, false); // 90 | ccKeywords.add("static_cast", Token.KEYWORD3, false); 91 | ccKeywords.add("struct", Token.KEYWORD3, false); // 92 | ccKeywords.add("switch", Token.KEYWORD1, false); // 93 | ccKeywords.add("template", Token.KEYWORD3, false); 94 | ccKeywords.add("this", Token.LITERAL2, false); 95 | ccKeywords.add("throw", Token.KEYWORD1, false); 96 | ccKeywords.add("true", Token.LITERAL2, false); 97 | ccKeywords.add("try", Token.KEYWORD1, false); 98 | ccKeywords.add("typedef", Token.KEYWORD3, false); // 99 | ccKeywords.add("typeid", Token.KEYWORD3, false); 100 | ccKeywords.add("typename", Token.KEYWORD3, false); 101 | ccKeywords.add("union", Token.KEYWORD3, false); // 102 | ccKeywords.add("unsigned", Token.KEYWORD3, false); // 103 | ccKeywords.add("using", Token.KEYWORD2, false); 104 | ccKeywords.add("virtual", Token.KEYWORD1, false); 105 | ccKeywords.add("void", Token.KEYWORD1, false); // 106 | ccKeywords.add("volatile", Token.KEYWORD1, false); // 107 | ccKeywords.add("wchar_t", Token.KEYWORD3, false); 108 | ccKeywords.add("while", Token.KEYWORD1, false); // 109 | ccKeywords.add("xor", Token.KEYWORD3, false); 110 | ccKeywords.add("xor_eq", Token.KEYWORD3, false); 111 | 112 | // non ANSI keywords 113 | ccKeywords.add("NULL", Token.LITERAL2, false); 114 | } 115 | return ccKeywords; 116 | } 117 | 118 | // private members 119 | private static KeywordMap ccKeywords; 120 | } 121 | -------------------------------------------------------------------------------- /src/processing/mode/esp/CTokenMarker.java: -------------------------------------------------------------------------------- 1 | /* 2 | * CTokenMarker.java - C token marker 3 | * Copyright (C) 1998, 1999 Slava Pestov 4 | * 5 | * You may use and modify this package for any purpose. Redistribution is 6 | * permitted, in both source and binary form, provided that this notice 7 | * remains intact in all source distributions of this package. 8 | */ 9 | 10 | package processing.mode.esp; 11 | 12 | import javax.swing.text.Segment; 13 | 14 | import processing.app.syntax.KeywordMap; 15 | import processing.app.syntax.Token; 16 | import processing.app.syntax.TokenMarker; 17 | 18 | /** 19 | * C token marker. 20 | * 21 | * @author Slava Pestov 22 | * @version $Id: CTokenMarker.java,v 1.34 1999/12/13 03:40:29 sp Exp $ 23 | */ 24 | public class CTokenMarker extends TokenMarker 25 | { 26 | public CTokenMarker() 27 | { 28 | this(true,getKeywords()); 29 | } 30 | 31 | public CTokenMarker(boolean cpp, KeywordMap keywords) 32 | { 33 | this.cpp = cpp; 34 | this.keywords = keywords; 35 | } 36 | 37 | public byte markTokensImpl(byte token, Segment line, int lineIndex) 38 | { 39 | char[] array = line.array; 40 | int offset = line.offset; 41 | lastOffset = offset; 42 | lastKeyword = offset; 43 | int length = line.count + offset; 44 | boolean backslash = false; 45 | 46 | loop: for(int i = offset; i < length; i++) 47 | { 48 | int i1 = (i+1); 49 | 50 | char c = array[i]; 51 | if(c == '\\') 52 | { 53 | backslash = !backslash; 54 | continue; 55 | } 56 | 57 | switch(token) 58 | { 59 | case Token.NULL: 60 | switch(c) 61 | { 62 | case '#': 63 | if(backslash) 64 | backslash = false; 65 | else if(cpp) 66 | { 67 | if(doKeyword(line,i,c)) 68 | break; 69 | addToken(i - lastOffset,token); 70 | addToken(length - i,Token.KEYWORD2); 71 | lastOffset = lastKeyword = length; 72 | break loop; 73 | } 74 | break; 75 | case '"': 76 | doKeyword(line,i,c); 77 | if(backslash) 78 | backslash = false; 79 | else 80 | { 81 | addToken(i - lastOffset,token); 82 | token = Token.LITERAL1; 83 | lastOffset = lastKeyword = i; 84 | } 85 | break; 86 | case '\'': 87 | doKeyword(line,i,c); 88 | if(backslash) 89 | backslash = false; 90 | else 91 | { 92 | addToken(i - lastOffset,token); 93 | token = Token.LITERAL2; 94 | lastOffset = lastKeyword = i; 95 | } 96 | break; 97 | case ':': 98 | if(lastKeyword == offset) 99 | { 100 | if(doKeyword(line,i,c)) 101 | break; 102 | backslash = false; 103 | addToken(i1 - lastOffset,Token.LABEL); 104 | lastOffset = lastKeyword = i1; 105 | } 106 | else if(doKeyword(line,i,c)) 107 | break; 108 | break; 109 | case '/': 110 | backslash = false; 111 | doKeyword(line,i,c); 112 | if(length - i > 1) 113 | { 114 | switch(array[i1]) 115 | { 116 | case '*': 117 | addToken(i - lastOffset,token); 118 | lastOffset = lastKeyword = i; 119 | if(length - i > 2 && array[i+2] == '*') 120 | token = Token.COMMENT2; 121 | else 122 | token = Token.COMMENT1; 123 | break; 124 | case '/': 125 | addToken(i - lastOffset,token); 126 | addToken(length - i,Token.COMMENT1); 127 | lastOffset = lastKeyword = length; 128 | break loop; 129 | } 130 | } 131 | break; 132 | default: 133 | backslash = false; 134 | if(!Character.isLetterOrDigit(c) 135 | && c != '_') 136 | doKeyword(line,i,c); 137 | break; 138 | } 139 | break; 140 | case Token.COMMENT1: 141 | case Token.COMMENT2: 142 | backslash = false; 143 | if(c == '*' && length - i > 1) 144 | { 145 | if(array[i1] == '/') 146 | { 147 | i++; 148 | addToken((i+1) - lastOffset,token); 149 | token = Token.NULL; 150 | lastOffset = lastKeyword = i+1; 151 | } 152 | } 153 | break; 154 | case Token.LITERAL1: 155 | if(backslash) 156 | backslash = false; 157 | else if(c == '"') 158 | { 159 | addToken(i1 - lastOffset,token); 160 | token = Token.NULL; 161 | lastOffset = lastKeyword = i1; 162 | } 163 | break; 164 | case Token.LITERAL2: 165 | if(backslash) 166 | backslash = false; 167 | else if(c == '\'') 168 | { 169 | addToken(i1 - lastOffset,Token.LITERAL1); 170 | token = Token.NULL; 171 | lastOffset = lastKeyword = i1; 172 | } 173 | break; 174 | default: 175 | throw new InternalError("Invalid state: " 176 | + token); 177 | } 178 | } 179 | 180 | if(token == Token.NULL) 181 | doKeyword(line,length,'\0'); 182 | 183 | switch(token) 184 | { 185 | case Token.LITERAL1: 186 | case Token.LITERAL2: 187 | addToken(length - lastOffset,Token.INVALID); 188 | token = Token.NULL; 189 | break; 190 | case Token.KEYWORD2: 191 | addToken(length - lastOffset,token); 192 | if(!backslash) 193 | token = Token.NULL; 194 | default: 195 | addToken(length - lastOffset,token); 196 | break; 197 | } 198 | 199 | return token; 200 | } 201 | 202 | public static KeywordMap getKeywords() 203 | { 204 | if(cKeywords == null) 205 | { 206 | cKeywords = new KeywordMap(false); 207 | cKeywords.add("char",Token.KEYWORD3,false); 208 | cKeywords.add("double",Token.KEYWORD3,false); 209 | cKeywords.add("enum",Token.KEYWORD3,false); 210 | cKeywords.add("float",Token.KEYWORD3,false); 211 | cKeywords.add("int",Token.KEYWORD3,false); 212 | cKeywords.add("long",Token.KEYWORD3,false); 213 | cKeywords.add("short",Token.KEYWORD3,false); 214 | cKeywords.add("signed",Token.KEYWORD3,false); 215 | cKeywords.add("struct",Token.KEYWORD3,false); 216 | cKeywords.add("typedef",Token.KEYWORD3,false); 217 | cKeywords.add("union",Token.KEYWORD3,false); 218 | cKeywords.add("unsigned",Token.KEYWORD3,false); 219 | cKeywords.add("void",Token.KEYWORD3,false); 220 | cKeywords.add("auto",Token.KEYWORD1,false); 221 | cKeywords.add("const",Token.KEYWORD1,false); 222 | cKeywords.add("extern",Token.KEYWORD1,false); 223 | cKeywords.add("register",Token.KEYWORD1,false); 224 | cKeywords.add("static",Token.KEYWORD1,false); 225 | cKeywords.add("volatile",Token.KEYWORD1,false); 226 | cKeywords.add("break",Token.KEYWORD1,false); 227 | cKeywords.add("case",Token.KEYWORD1,false); 228 | cKeywords.add("continue",Token.KEYWORD1,false); 229 | cKeywords.add("default",Token.KEYWORD1,false); 230 | cKeywords.add("do",Token.KEYWORD1,false); 231 | cKeywords.add("else",Token.KEYWORD1,false); 232 | cKeywords.add("for",Token.KEYWORD1,false); 233 | cKeywords.add("goto",Token.KEYWORD1,false); 234 | cKeywords.add("if",Token.KEYWORD1,false); 235 | cKeywords.add("return",Token.KEYWORD1,false); 236 | cKeywords.add("sizeof",Token.KEYWORD1,false); 237 | cKeywords.add("switch",Token.KEYWORD1,false); 238 | cKeywords.add("while",Token.KEYWORD1,false); 239 | cKeywords.add("asm",Token.KEYWORD2,false); 240 | cKeywords.add("asmlinkage",Token.KEYWORD2,false); 241 | cKeywords.add("far",Token.KEYWORD2,false); 242 | cKeywords.add("huge",Token.KEYWORD2,false); 243 | cKeywords.add("inline",Token.KEYWORD2,false); 244 | cKeywords.add("near",Token.KEYWORD2,false); 245 | cKeywords.add("pascal",Token.KEYWORD2,false); 246 | cKeywords.add("true",Token.LITERAL2,false); 247 | cKeywords.add("false",Token.LITERAL2,false); 248 | cKeywords.add("NULL",Token.LITERAL2,false); 249 | } 250 | return cKeywords; 251 | } 252 | 253 | // private members 254 | private static KeywordMap cKeywords; 255 | 256 | private boolean cpp; 257 | private KeywordMap keywords; 258 | private int lastOffset; 259 | private int lastKeyword; 260 | 261 | private boolean doKeyword(Segment line, int i, char c) 262 | { 263 | int i1 = i+1; 264 | 265 | int len = i - lastKeyword; 266 | byte id = keywords.lookup(line,lastKeyword,len,false); 267 | if(id != Token.NULL) 268 | { 269 | if(lastKeyword != lastOffset) 270 | addToken(lastKeyword - lastOffset,Token.NULL); 271 | addToken(len,id); 272 | lastOffset = i; 273 | } 274 | lastKeyword = i1; 275 | return false; 276 | } 277 | 278 | @Override 279 | public void addColoring(String keyword, String coloring) { 280 | System.out.format("addColoring(%s, %s) called in HtmlTokenMarker%n"); 281 | } 282 | } 283 | -------------------------------------------------------------------------------- /src/processing/mode/esp/ESPBuild.java: -------------------------------------------------------------------------------- 1 | package processing.mode.esp; 2 | 3 | import java.util.*; 4 | import java.io.*; 5 | 6 | import processing.app.Base; 7 | import processing.app.Platform; 8 | import processing.app.Sketch; 9 | import processing.app.SketchCode; 10 | import processing.app.SketchException; 11 | import processing.app.Util; 12 | import processing.app.exec.SystemOutSiphon; 13 | 14 | public class ESPBuild { 15 | public ESPBuild(Sketch sketch, File modeFolder) { 16 | File coreFolder = new File(modeFolder, "core"); 17 | File coreLibraryFolder = new File(coreFolder, "library"); 18 | File outputFolder = sketch.makeTempFolder(); 19 | File codeFile = new File(outputFolder, sketch.getCode()[0].getFile().getName()); 20 | 21 | try { 22 | Util.saveFile(sketch.getCode()[0].getProgram(), codeFile); 23 | } catch (IOException e) { 24 | e.printStackTrace(); 25 | return; 26 | } 27 | 28 | String command = ""; 29 | 30 | String[] includes = { 31 | "", // the root "include" directory 32 | "ESP", 33 | "ofxDatGui", 34 | "ofxDatGui/components", 35 | "ofxDatGui/core", 36 | "ofxDatGui/libs/ofxSmartFont", 37 | "ofxDatGui/themes", 38 | "ofxGrt", 39 | "ofxParagraph", 40 | }; 41 | 42 | String[] libraryIncludes = { 43 | "openFrameworks/libs/openFrameworks", 44 | "openFrameworks/libs/openFrameworks/3d", 45 | "openFrameworks/libs/openFrameworks/app", 46 | "openFrameworks/libs/openFrameworks/communication", 47 | "openFrameworks/libs/openFrameworks/events", 48 | "openFrameworks/libs/openFrameworks/gl", 49 | "openFrameworks/libs/openFrameworks/graphics", 50 | "openFrameworks/libs/openFrameworks/math", 51 | "openFrameworks/libs/openFrameworks/sound", 52 | "openFrameworks/libs/openFrameworks/types", 53 | "openFrameworks/libs/openFrameworks/utils", 54 | "openFrameworks/libs/openFrameworks/video", 55 | "openFrameworks/libs/poco/include", 56 | "openFrameworks/libs/freetype/include", 57 | "openFrameworks/libs/freetype/include/freetype2", 58 | "openFrameworks/libs/fmodex/include", 59 | "openFrameworks/libs/glew/include", 60 | "openFrameworks/libs/FreeImage/include", 61 | "openFrameworks/libs/tess2/include", 62 | "openFrameworks/libs/cairo/include/cairo", 63 | "openFrameworks/libs/rtAudio/include", 64 | "openFrameworks/libs/glfw/include", 65 | "openFrameworks/libs/boost/include", 66 | "openFrameworks/libs/utf8cpp/include", 67 | "openFrameworks/libs/openssl/include", 68 | "openFrameworks/addons/ofxOsc/src", 69 | "openFrameworks/addons/ofxOsc/libs/oscpack/src/ip", 70 | "openFrameworks/addons/ofxOsc/libs/oscpack/src/osc" 71 | }; 72 | 73 | if (Platform.isMacOS()) { 74 | File appFolder = new File(outputFolder, "ESP.app"); appFolder.mkdir(); 75 | File contentsFolder = new File(appFolder, "Contents"); contentsFolder.mkdir(); 76 | File frameworksFolder = new File(contentsFolder, "Frameworks"); frameworksFolder.mkdir(); 77 | File binFolder = new File(contentsFolder, "MacOS"); binFolder.mkdir(); 78 | 79 | // Assemble .app contents. 80 | try { 81 | Util.copyDir(new File(coreFolder, "data"), new File(new File(contentsFolder, "Resources"), "data")); 82 | Util.copyFile(new File(coreFolder, "Info.plist"), new File(contentsFolder, "Info.plist")); 83 | Util.copyFile(new File(coreLibraryFolder, "libgrt.dylib"), new File(frameworksFolder, "libgrt.dylib")); 84 | Util.copyFile(new File(coreLibraryFolder, "openFrameworks/libs/fmodex/lib/osx/libfmodex.dylib"), new File(binFolder, "libfmodex.dylib")); 85 | Util.copyFile(new File(coreLibraryFolder, "openFrameworks/libs/openFrameworksCompiled/project/osx/icon-debug.icns"), new File(new File(contentsFolder, "Resources"), "icon-debug.icns")); 86 | } catch (IOException e) { 87 | e.printStackTrace(); 88 | return; 89 | } 90 | 91 | String[] libs = { 92 | "openFrameworks/libs/tess2/lib/osx/tess2.a", 93 | "openFrameworks/libs/glew/lib/osx/glew.a", 94 | "openFrameworks/libs/boost/lib/osx/boost_filesystem.a", 95 | "openFrameworks/libs/boost/lib/osx/boost_system.a", 96 | "openFrameworks/libs/boost/lib/osx/boost.a", 97 | "openFrameworks/libs/poco/lib/osx/PocoCrypto.a", 98 | "openFrameworks/libs/poco/lib/osx/PocoData.a", 99 | "openFrameworks/libs/poco/lib/osx/PocoDataSQLite.a", 100 | "openFrameworks/libs/poco/lib/osx/PocoFoundation.a", 101 | "openFrameworks/libs/poco/lib/osx/PocoJSON.a", 102 | "openFrameworks/libs/poco/lib/osx/PocoMongoDB.a", 103 | "openFrameworks/libs/poco/lib/osx/PocoNet.a", 104 | "openFrameworks/libs/poco/lib/osx/PocoNetSSL.a", 105 | "openFrameworks/libs/poco/lib/osx/PocoUtil.a", 106 | "openFrameworks/libs/poco/lib/osx/PocoXML.a", 107 | "openFrameworks/libs/poco/lib/osx/PocoZip.a", 108 | "openFrameworks/libs/openssl/lib/osx/ssl.a", 109 | "openFrameworks/libs/openssl/lib/osx/crypto.a", 110 | "openFrameworks/libs/cairo/lib/osx/cairo-script-interpreter.a", 111 | "openFrameworks/libs/cairo/lib/osx/cairo.a", 112 | "openFrameworks/libs/cairo/lib/osx/pixman-1.a", 113 | "openFrameworks/libs/cairo/lib/osx/png.a", 114 | "openFrameworks/libs/FreeImage/lib/osx/freeimage.a", 115 | "openFrameworks/libs/freetype/lib/osx/freetype.a", 116 | "openFrameworks/libs/glfw/lib/osx/glfw3.a", 117 | "openFrameworks/libs/rtAudio/lib/osx/rtAudio.a" 118 | }; 119 | 120 | String[] dylibs = { 121 | "grt", 122 | "esp", 123 | "fmodex", 124 | "objc" 125 | }; 126 | 127 | String[] frameworks = { 128 | "OpenGL", 129 | "GLUT", 130 | "CoreServices", 131 | "Foundation", 132 | "CoreGraphics", 133 | "Cocoa", 134 | "CoreVideo", 135 | "IOKit", 136 | "CoreAudio", 137 | "Accelerate" 138 | }; 139 | 140 | String[] libdirs = { 141 | "", // the root "library" directory 142 | "openFrameworks/libs/fmodex/lib/osx", 143 | "openFrameworks/libs/glut/lib/osx" 144 | }; 145 | 146 | // Suppress warnings about OSAtomicIncrement32() and OSAtomicDecrement32() in poco/include/Poco/AtomicCounter.h 147 | command="g++ -std=c++11 -Wno-deprecated-declarations"; 148 | for (String include : includes) command += " -Iinclude/" + include; 149 | for (String include : libraryIncludes) command += " -Ilibrary/" + include; 150 | for (String libdir : libdirs) command += " -Llibrary/" + libdir; 151 | for (String dylib : dylibs) command += " -l" + dylib; 152 | for (String framework : frameworks) command += " -framework " + framework; 153 | for (String lib : libs) command += " library/" + lib; 154 | command += " " + codeFile.getAbsolutePath() + " -o " + binFolder.getAbsolutePath() + "/ESP"; 155 | } 156 | 157 | if (Platform.isLinux()) { 158 | try { 159 | Util.copyDir(new File(coreFolder, "data"), new File(outputFolder, "data")); 160 | Util.copyFile(new File(coreLibraryFolder, "libgrt.so"), new File(outputFolder, "libgrt.so")); 161 | } catch (IOException e) { 162 | e.printStackTrace(); 163 | return; 164 | } 165 | 166 | String[] libs = { 167 | //"libesp.a", 168 | "libopenFrameworksDebug.a", 169 | "openFrameworks/libs/glfw/lib/linux64/libglfw3.a", 170 | "openFrameworks/libs/poco/lib/linux64/libPocoCrypto.a", 171 | "openFrameworks/libs/poco/lib/linux64/libPocoData.a", 172 | "openFrameworks/libs/poco/lib/linux64/libPocoFoundation.a", 173 | "openFrameworks/libs/poco/lib/linux64/libPocoJSON.a", 174 | "openFrameworks/libs/poco/lib/linux64/libPocoNet.a", 175 | "openFrameworks/libs/poco/lib/linux64/libPocoNetSSL.a", 176 | "openFrameworks/libs/poco/lib/linux64/libPocoUtil.a", 177 | "openFrameworks/libs/poco/lib/linux64/libPocoXML.a", 178 | "openFrameworks/libs/poco/lib/linux64/libPocoZip.a", 179 | "openFrameworks/libs/kiss/lib/linux64/libkiss.a", 180 | "openFrameworks/libs/tess2/lib/linux64/libtess2.a", 181 | "openFrameworks/libs/tess2/lib/linux64/libtess2.a", 182 | "openFrameworks/libs/kiss/lib/linux64/libkiss.a", 183 | }; 184 | 185 | String[] dylibs = { 186 | "cairo", 187 | "freeimage", 188 | "freetype", 189 | "GLEW", 190 | "glib-2.0", 191 | "gstapp-1.0", 192 | "gstbase-1.0", 193 | "gstreamer-1.0", 194 | "gstvideo-1.0", 195 | "crypto", 196 | "ssl", 197 | "rtaudio", 198 | "fontconfig", 199 | "gobject-2.0", 200 | "gmodule-2.0", 201 | "gthread-2.0", 202 | "openal", 203 | "pthread", 204 | "atk-1.0", 205 | "gio-2.0", 206 | "gdk_pixbuf-2.0", 207 | "cairo", 208 | "freeimage", 209 | "freetype", 210 | "GLEW", 211 | "glib-2.0", 212 | "gstapp-1.0", 213 | "gstbase-1.0", 214 | "gstreamer-1.0", 215 | "gstvideo-1.0", 216 | "crypto", 217 | "ssl", 218 | "rtaudio", 219 | "fontconfig", 220 | "gobject-2.0", 221 | "gmodule-2.0", 222 | "gthread-2.0", 223 | "openal", 224 | "pthread", 225 | "atk-1.0", 226 | "gio-2.0", 227 | "gdk_pixbuf-2.0", 228 | "pango-1.0", 229 | "pangocairo-1.0", 230 | "pangoft2-1.0", 231 | "pangoxft-1.0", 232 | "gdk-x11-2.0", 233 | "gtk-x11-2.0", 234 | "X11", 235 | "GL", 236 | "GLU", 237 | "glut", 238 | "Xxf86vm", 239 | "Xrandr", 240 | "Xi", 241 | "Xcursor", 242 | "sndfile", 243 | "grt", 244 | "boost_filesystem", 245 | "boost_system", 246 | "PocoCrypto", 247 | "PocoData", 248 | "PocoFoundation", 249 | "PocoJSON", 250 | "PocoNet", 251 | "PocoUtil", 252 | "PocoXML", 253 | "PocoZip", 254 | }; 255 | command = "g++ -std=gnu++11 -Wno-deprecated-declarations"; 256 | command += " " + codeFile.getAbsolutePath(); 257 | command += " -Llibrary -Llibrary/openFrameworks/libs/poco/lib/linux64 -lesp"; 258 | for (String include : includes) command += " -Iinclude/" + include; 259 | for (String include : libraryIncludes) command += " -Ilibrary/" + include; 260 | command += " -Ilibrary/openFrameworks/libs/kiss/include -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gstreamer-1.0 -I/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include -I/home/mellis/ESP/third-party/grt"; 261 | for (String lib : libs) command += " library/" + lib; 262 | for (String lib : dylibs) command += " -l" + lib; 263 | command += " -Wl,-rpath,. -o " + outputFolder.getAbsolutePath() + "/ESP"; 264 | } 265 | 266 | if (Platform.isWindows()) { 267 | File objFolder = new File(outputFolder, "obj"); objFolder.mkdir(); 268 | File binFolder = new File(outputFolder, "bin"); 269 | 270 | try { 271 | Util.copyDir(new File(coreFolder, "library\\openFrameworks\\export\\vs\\Win32"), binFolder); 272 | Util.copyDir(new File(coreFolder, "data"), new File(binFolder, "data")); 273 | } catch (IOException e) { 274 | e.printStackTrace(); 275 | return; 276 | } 277 | 278 | String[] windowsLibraryIncludes = { 279 | "openFrameworks/libs/glu/include", 280 | "openFrameworks/libs/videoInput/include" 281 | }; 282 | 283 | String[] libs = { 284 | "openframeworksLib_debug.lib", 285 | "ESPlib_debug.lib", 286 | "grt.lib", 287 | "\"cairo-static.lib\"", 288 | "\"pixman-1.lib\"", 289 | "libpng.lib", 290 | "msimg32.lib", 291 | "OpenGL32.lib", 292 | "GLu32.lib", 293 | "kernel32.lib", 294 | "setupapi.lib", 295 | "Vfw32.lib", 296 | "comctl32.lib", 297 | "glut32.lib", 298 | "rtAudioD.lib", 299 | "videoInputD.lib", 300 | "libfreetype.lib", 301 | "FreeImage.lib", 302 | "qtmlClient.lib", 303 | "dsound.lib", 304 | "user32.lib", 305 | "gdi32.lib", 306 | "winspool.lib", 307 | "comdlg32.lib", 308 | "advapi32.lib", 309 | "shell32.lib", 310 | "ole32.lib", 311 | "oleaut32.lib", 312 | "uuid.lib", 313 | "glew32s.lib", 314 | "fmodex_vc.lib", 315 | "glu32.lib", 316 | "ssleay32MD.lib", 317 | "libeay32MD.lib", 318 | "crypt32.lib", 319 | "PocoFoundationmdd.lib", 320 | "PocoNetmdd.lib", 321 | "PocoUtilmdd.lib", 322 | "PocoXMLmdd.lib", 323 | "Ws2_32.lib", 324 | "tess2.lib", 325 | "glfw3.lib", 326 | "winmm.lib", 327 | "kernel32.lib", 328 | "user32.lib", 329 | "gdi32.lib", 330 | "winspool.lib", 331 | "comdlg32.lib", 332 | "advapi32.lib", 333 | "shell32.lib", 334 | "ole32.lib", 335 | "oleaut32.lib", 336 | "uuid.lib", 337 | "odbc32.lib", 338 | "odbccp32.lib", 339 | }; 340 | 341 | String[] excludeLibraries = { 342 | "PocoFoundationmdd.lib", 343 | "atlthunk.lib", 344 | "msvcrt", 345 | "libcmt", 346 | "LIBC", 347 | "LIBCMTD" 348 | }; 349 | 350 | String[] libdirs = { 351 | "", 352 | "openFrameworks/libs/glut/lib/vs/Win32", 353 | "openFrameworks/libs/glfw/lib/vs/Win32", 354 | "openFrameworks/libs/rtAudio/lib/vs/Win32", 355 | "openFrameworks/libs/FreeImage/lib/vs/Win32", 356 | "openFrameworks/libs/freetype/lib/vs/Win32", 357 | "openFrameworks/libs/quicktime/lib/vs/Win32", 358 | "openFrameworks/libs/fmodex/lib/vs/Win32", 359 | "openFrameworks/libs/videoInput/lib/vs/Win32", 360 | "openFrameworks/libs/cairo/lib/vs/Win32", 361 | "openFrameworks/libs/glew/lib/vs/Win32", 362 | "openFrameworks/libs/glu/lib/vs/Win32", 363 | "openFrameworks/libs/openssl/lib/vs/Win32", 364 | "openFrameworks/libs/Poco/lib/vs/Win32", 365 | "openFrameworks/libs/tess2/lib/vs/Win32", 366 | "openFrameworks/libs/boost/lib/vs/Win32", 367 | }; 368 | 369 | String compileCommand = "cl.exe /c"; 370 | for (String include : includes) compileCommand += " /Iinclude/" + include; 371 | for (String include : libraryIncludes) compileCommand += " /Ilibrary/" + include; 372 | for (String include : windowsLibraryIncludes) compileCommand += " /Ilibrary/" + include; 373 | compileCommand += " /Zi /W3 /WX- /MP /Od /Oy- /D WIN32 /D _DEBUG /D _CONSOLE /D POCO_STATIC /D CAIRO_WIN32_STATIC_BUILD /D DISABLE_SOME_FLOATING_POINT /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo" + '"' + new File(objFolder, "user.obj").getAbsolutePath() + '"' + " /Fd" + '"' + new File(objFolder, "vc140.pdb").getAbsolutePath() + '"' + " /Gd /TP /analyze- /errorReport:prompt"; 374 | compileCommand += " " + '"'+ codeFile.getAbsolutePath() + '"'; 375 | 376 | String linkCommand = "link.exe /ERRORREPORT:PROMPT /OUT:" + '"' + new File(binFolder, "ESP_debug.exe").getAbsolutePath() + '"' + " /INCREMENTAL /NOLOGO "; 377 | for (String lib : libs) linkCommand += " " + lib; 378 | for (String libdir : libdirs) linkCommand += " /LIBPATH:library/" + libdir; 379 | for (String lib : excludeLibraries) linkCommand += " /NODEFAULTLIB:" + lib; 380 | linkCommand += " /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /DEBUG /PDB:" + '"' + new File(binFolder, "ESP_debug.pdb").getAbsolutePath() + '"' + 381 | " /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT /IMPLIB:" + '"' + new File(binFolder, "ESP_debug.lib").getAbsolutePath() + '"' + " /MACHINE:X86 /SAFESEH /ignore:4099 " + '"' + new File(objFolder, "user.obj").getAbsolutePath() + '"'; // obj\\Debug\\icon.res 382 | 383 | try { 384 | PrintWriter pw = new PrintWriter(new File(outputFolder, "compile.bat")); 385 | pw.println("CALL \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat\""); 386 | pw.println("COPY \"%UniversalCRTSdkDir%\\bin\\x86\\ucrt\\ucrtbased.dll\" " + '"' + outputFolder.getAbsolutePath() + "\\bin" + '"'); 387 | pw.println(compileCommand); 388 | pw.println(linkCommand); 389 | pw.close(); 390 | } catch (FileNotFoundException e) { 391 | e.printStackTrace(); 392 | return; 393 | } 394 | 395 | command = "cmd /c " + '"' + new File(outputFolder, "compile.bat").getAbsolutePath() + '"'; 396 | } 397 | 398 | System.out.println(command); 399 | final String cmd = command; 400 | Thread t = new Thread() { 401 | public void run() { 402 | try { 403 | Process process = Runtime.getRuntime().exec(cmd, null, coreFolder); 404 | new SystemOutSiphon(process.getInputStream()); 405 | new SystemOutSiphon(process.getErrorStream()); 406 | int result = process.waitFor(); 407 | System.out.println("Exited with: " + result); 408 | if (result != 0) return; 409 | } catch (Exception e) { 410 | e.printStackTrace(); 411 | } 412 | try { 413 | String runCommand = ""; 414 | File runFolder = null; 415 | if (Platform.isMacOS()) { 416 | File appFolder = new File(outputFolder, "ESP.app"); 417 | runCommand = "open " + appFolder.getAbsolutePath(); 418 | } 419 | if (Platform.isLinux()) { 420 | runCommand = new File(outputFolder, "ESP").getAbsolutePath(); 421 | runFolder = outputFolder; 422 | } 423 | if (Platform.isWindows()) { 424 | File binFolder = new File(outputFolder, "bin"); 425 | runCommand = new File(binFolder, "ESP_debug.exe").getAbsolutePath(); 426 | runFolder = binFolder; 427 | } 428 | Process process = Runtime.getRuntime().exec(runCommand, null, runFolder); 429 | new SystemOutSiphon(process.getInputStream()); 430 | new SystemOutSiphon(process.getErrorStream()); 431 | System.out.println("Exited with: " + process.waitFor()); 432 | } catch (Exception e) { 433 | e.printStackTrace(); 434 | } 435 | } 436 | }; 437 | t.start(); 438 | } 439 | } 440 | -------------------------------------------------------------------------------- /src/processing/mode/esp/ESPEditor.java: -------------------------------------------------------------------------------- 1 | package processing.mode.esp; 2 | 3 | import java.awt.Desktop; 4 | import java.awt.EventQueue; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.net.URI; 10 | import java.util.Arrays; 11 | 12 | import javax.swing.JMenu; 13 | import javax.swing.JMenuItem; 14 | 15 | import processing.app.Base; 16 | import processing.app.Formatter; 17 | import processing.app.Library; 18 | import processing.app.Mode; 19 | import processing.app.Platform; 20 | import processing.app.Problem; 21 | import processing.app.SketchException; 22 | import processing.app.Util; 23 | import processing.app.syntax.JEditTextArea; 24 | import processing.app.syntax.PdeTextArea; 25 | import processing.app.syntax.PdeTextAreaDefaults; 26 | import processing.app.ui.Editor; 27 | import processing.app.ui.EditorException; 28 | import processing.app.ui.EditorFooter; 29 | import processing.app.ui.EditorState; 30 | import processing.app.ui.EditorToolbar; 31 | import processing.app.ui.Toolkit; 32 | import processing.mode.java.AutoFormat; 33 | import processing.mode.java.JavaInputHandler; 34 | 35 | 36 | public class ESPEditor extends Editor { 37 | boolean showSizeWarning = true; 38 | 39 | 40 | protected ESPEditor(Base base, String path, 41 | EditorState state, Mode mode) throws EditorException { 42 | super(base, path, state, mode); 43 | } 44 | 45 | 46 | @Override 47 | protected JEditTextArea createTextArea() { 48 | return new PdeTextArea(new PdeTextAreaDefaults(mode), 49 | new JavaInputHandler(this), this); 50 | } 51 | 52 | 53 | /** 54 | * Create and return the toolbar (tools above text area), 55 | * implements abstract Editor.createToolbar(), 56 | * called in Editor constructor to add the toolbar to the window. 57 | * 58 | * @return an EditorToolbar, in our case an ESPToolbar 59 | * @see processing.mode.esp.ESPToolbar 60 | */ 61 | @Override 62 | public EditorToolbar createToolbar() { 63 | return new ESPToolbar(this); 64 | } 65 | 66 | 67 | @Override 68 | public EditorFooter createFooter() { 69 | EditorFooter footer = super.createFooter(); 70 | addErrorTable(footer); 71 | return footer; 72 | } 73 | 74 | 75 | /** 76 | * Create a formatter to prettify code, 77 | * implements abstract Editor.createFormatter(), 78 | * called by Editor.handleAutoFormat() to handle menu item or shortcut 79 | * 80 | * @return the formatter to handle formatting of code. 81 | */ 82 | @Override 83 | public Formatter createFormatter() { 84 | return new AutoFormat(); 85 | } 86 | 87 | 88 | /** 89 | * Build the "File" menu, 90 | * implements abstract Editor.buildFileMenu(), 91 | * called by Editor.buildMenuBar() to generate the app menu for the editor window 92 | * 93 | * @return JMenu containing the menu items for "File" menu 94 | */ 95 | @Override 96 | public JMenu buildFileMenu() { 97 | /* 98 | JMenuItem exportItem = Toolkit.newJMenuItem("Export", 'E'); 99 | exportItem.addActionListener(new ActionListener() { 100 | @Override 101 | public void actionPerformed(ActionEvent e) { 102 | handleExport(true); 103 | } 104 | }); 105 | return buildFileMenu(new JMenuItem[] { exportItem }); 106 | */ 107 | return buildFileMenu(null); 108 | } 109 | 110 | 111 | /** 112 | * Build the "Sketch" menu, implements abstract Editor.buildSketchMenu(), 113 | * called by Editor.buildMenuBar(). 114 | * @return JMenu containing the menu items for "Sketch" menu 115 | */ 116 | @Override 117 | public JMenu buildSketchMenu() { 118 | JMenuItem runItem = Toolkit.newJMenuItem("Run", 'R'); 119 | runItem.addActionListener(new ActionListener() { 120 | @Override 121 | public void actionPerformed(ActionEvent e) { 122 | handleRun(); 123 | } 124 | }); 125 | 126 | JMenuItem stopItem = new JMenuItem("Stop"); 127 | stopItem.addActionListener(new ActionListener() { 128 | @Override 129 | public void actionPerformed(ActionEvent e) { 130 | handleStop(); 131 | } 132 | }); 133 | 134 | return buildSketchMenu(new JMenuItem[] { runItem, stopItem }); 135 | } 136 | 137 | 138 | /** 139 | * Build the "Help" menu, implements abstract Editor.buildHelpMenu() 140 | * @return JMenu containing the menu items for "Help" menu 141 | */ 142 | @Override 143 | public JMenu buildHelpMenu() { 144 | JMenu menu = new JMenu("Help"); 145 | JMenuItem item; 146 | 147 | item = new JMenuItem("About"); 148 | item.addActionListener(new ActionListener() { 149 | @Override 150 | public void actionPerformed(ActionEvent e) { 151 | Platform.openURL("https://github.com/damellis/ESP/wiki"); 152 | } 153 | }); 154 | menu.add(item); 155 | 156 | item = new JMenuItem("Reference"); 157 | item.addActionListener(new ActionListener() { 158 | @Override 159 | public void actionPerformed(ActionEvent e) { 160 | Platform.openURL("http://damellis.github.io/ESP/"); 161 | } 162 | }); 163 | menu.add(item); 164 | 165 | item = new JMenuItem("View ESP on Github"); 166 | item.addActionListener(new ActionListener() { 167 | @Override 168 | public void actionPerformed(ActionEvent e) { 169 | Platform.openURL("https://github.com/damellis/ESP"); 170 | } 171 | }); 172 | menu.add(item); 173 | 174 | return menu; 175 | } 176 | 177 | 178 | /** 179 | * Returns the default commenting prefix for comment/uncomment command, 180 | * called from Editor.handleCommentUncomment() 181 | */ 182 | @Override 183 | public String getCommentPrefix() { 184 | return "//"; 185 | } 186 | 187 | 188 | /** 189 | * Stop the runner, in our case this is the server, 190 | * implements abstract Editor.internalCloseRunner(), 191 | * called from Editor.prepareRun() 192 | * 193 | * Called when the window is going to be reused for another sketch. 194 | */ 195 | @Override 196 | public void internalCloseRunner() { 197 | handleStop(); 198 | } 199 | 200 | 201 | /** 202 | * Implements abstract Editor.deactivateRun() 203 | */ 204 | @Override 205 | public void deactivateRun() { 206 | toolbar.deactivateRun(); 207 | } 208 | 209 | 210 | /* 211 | public File getTemplateFolder() { 212 | return getMode().getContentFile("template"); 213 | } 214 | 215 | 216 | public File getLibrariesFolder() { 217 | return new File(mode.getTemplateFolder(), "libraries"); 218 | } 219 | */ 220 | 221 | 222 | public void handleRun() { 223 | toolbar.activateRun(); 224 | 225 | try { 226 | // Make sure the sketch folder still exists, and the SketchCode objects 227 | // are updated to include any text changes from the Editor. 228 | prepareRun(); 229 | new ESPBuild(sketch, getMode().getFolder()); 230 | // // write the HTML here in case we need temp files 231 | // p5jsBuild.updateHtml(sketch); 232 | } catch (Exception e) { 233 | statusError(e); 234 | } 235 | if (checkErrors(true)) { 236 | toolbar.deactivateRun(); 237 | 238 | } else { 239 | statusNotice("Running example."); 240 | // if (server == null || server.isDead()) { 241 | // restartServer(); 242 | // } 243 | // statusNotice("Server running at " + server.getAddress()); 244 | // //Platform.openURL(server.getAddress()); 245 | // 246 | // try { 247 | // Desktop.getDesktop().browse(new URI(server.getAddress())); 248 | // } catch (Exception e) { 249 | // statusError(e); 250 | // } 251 | } 252 | } 253 | 254 | 255 | /** 256 | * Menu item callback, replacement for STOP: stop server. 257 | */ 258 | public void handleStop() { 259 | // try { 260 | // p5jsBuild.cleanTempFiles(sketch); 261 | // } catch (IOException e) { 262 | // e.printStackTrace(); // TODO ignore? 263 | // } 264 | // stopServer(); 265 | statusNotice("Example stopped."); 266 | toolbar.deactivateRun(); 267 | } 268 | 269 | 270 | //public boolean handleExport(boolean openFolder) { 271 | protected boolean checkErrors(boolean fatal) { 272 | // try { 273 | // new p5jsBuild(sketch); 274 | // } catch (SketchException se) { 275 | // if (fatal) { 276 | // statusError(se); 277 | // } else { 278 | // setProblemList(Arrays.asList(new Problem() { 279 | // 280 | // @Override 281 | // public boolean isError() { 282 | // return true; 283 | // } 284 | // 285 | // @Override 286 | // public boolean isWarning() { 287 | // return false; 288 | // } 289 | // 290 | // @Override 291 | // public int getTabIndex() { 292 | // return se.getCodeIndex(); 293 | // } 294 | // 295 | // @Override 296 | // public int getLineNumber() { 297 | // return se.getCodeLine(); 298 | // } 299 | // 300 | // @Override 301 | // public String getMessage() { 302 | // return se.getMessage(); 303 | // } 304 | // 305 | // @Override 306 | // public int getStartOffset() { 307 | // return se.getCodeColumn(); 308 | // } 309 | // 310 | // @Override 311 | // public int getStopOffset() { 312 | // return se.getCodeColumn() + 10; 313 | // } 314 | // })); 315 | // } 316 | // return true; 317 | // } 318 | return false; 319 | } 320 | 321 | 322 | @Override 323 | public boolean handleSaveAs() { 324 | if (super.handleSaveAs()) { 325 | EventQueue.invokeLater(new Runnable() { 326 | @Override 327 | public void run() { 328 | while (sketch.isSaving()) { // wait until Save As completes 329 | try { 330 | Thread.sleep(5); 331 | } catch (InterruptedException e) { } 332 | } 333 | } 334 | }); 335 | return true; // kind of a farce 336 | } 337 | return false; 338 | } 339 | 340 | 341 | /** 342 | * Create or get the sketch's properties file 343 | * @return the sketch properties file or null 344 | */ 345 | protected File getSketchPropertiesFile() { 346 | File sketchPropsFile = 347 | new File(getSketch().getFolder(), "sketch.properties"); 348 | if (!sketchPropsFile.exists()) { 349 | try { 350 | sketchPropsFile.createNewFile(); 351 | } catch (IOException ioe) { 352 | ioe.printStackTrace(); 353 | statusError("Unable to create sketch properties file!"); 354 | return null; 355 | } 356 | } 357 | return sketchPropsFile; 358 | } 359 | 360 | 361 | @Override 362 | public void handleImportLibrary(String name) { 363 | // unlike the other Modes, this is actually adding the library code 364 | //System.out.println("import library " + name); 365 | Library library = mode.findLibraryByName(name); 366 | File folder = new File(library.getFolder(), "library"); 367 | try { 368 | Util.copyDir(folder, new File(sketch.getFolder(), "libraries")); 369 | statusNotice("Copied " + name + " to the libraries folder of this sketch."); 370 | 371 | /* 372 | try { 373 | // write the HTML here in case we need temp files 374 | p5jsBuild.updateHtml(sketch); 375 | } catch (Exception e) { 376 | statusError(e); 377 | } 378 | */ 379 | 380 | } catch (IOException e) { 381 | statusError(e); 382 | } 383 | } 384 | } 385 | -------------------------------------------------------------------------------- /src/processing/mode/esp/ESPLibrary.java: -------------------------------------------------------------------------------- 1 | package processing.mode.esp; 2 | 3 | import java.io.File; 4 | 5 | import processing.app.Library; 6 | 7 | 8 | public class ESPLibrary extends Library { 9 | 10 | public ESPLibrary(File folder) { 11 | super(folder); 12 | } 13 | 14 | 15 | @Override 16 | protected void handle() { 17 | // no platform-specific stuff to do here; clear out the superclass 18 | // parsing of the .jar file and whatnot 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/processing/mode/esp/ESPMode.java: -------------------------------------------------------------------------------- 1 | package processing.mode.esp; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.ArrayList; 6 | 7 | import processing.app.*; 8 | import processing.app.syntax.TokenMarker; 9 | import processing.app.ui.*; 10 | import processing.core.PApplet; 11 | 12 | 13 | public class ESPMode extends Mode { 14 | private ESPEditor espEditor; 15 | 16 | 17 | public ESPMode (Base base, File folder) { 18 | super(base, folder); 19 | } 20 | 21 | 22 | /** 23 | * Called to create the actual editor when needed (once per Sketch) 24 | */ 25 | @Override 26 | public Editor createEditor(Base base, String path, 27 | EditorState state) throws EditorException { 28 | espEditor = new ESPEditor(base, path, state, this); 29 | return espEditor; 30 | } 31 | 32 | 33 | /** 34 | * Called from Base to get the Editor for this mode. 35 | */ 36 | public Editor getEditor() { 37 | return espEditor; 38 | } 39 | 40 | 41 | /* 42 | public JavaMode getJavaMode() { 43 | if (defaultJavaMode == null) { 44 | for (Mode m : base.getModeList() ) { 45 | if (m.getClass() == JavaMode.class) { 46 | defaultJavaMode = (JavaMode) m; 47 | break; 48 | } 49 | } 50 | } 51 | return defaultJavaMode; 52 | } 53 | */ 54 | 55 | 56 | @Override 57 | public File[] getKeywordFiles() { 58 | return new File[] { 59 | //Platform.getContentFile("modes/java/keywords.txt"), 60 | new File(folder, "keywords.txt") 61 | }; 62 | } 63 | 64 | 65 | @Override 66 | public TokenMarker getTokenMarker(SketchCode code) { 67 | String ext = code.getExtension(); 68 | 69 | if (ext.equals("cpp") || ext.equals("h")) { 70 | return new CCTokenMarker(); 71 | } else if (ext.equals("c")) { 72 | return new CTokenMarker(); 73 | } 74 | 75 | return null; // no styling 76 | } 77 | 78 | 79 | /** 80 | * Return pretty title of this mode for menu listing and such 81 | */ 82 | @Override 83 | public String getTitle() { 84 | return "ESP"; 85 | } 86 | 87 | 88 | // public EditorToolbar createToolbar(Editor editor) { } 89 | 90 | 91 | // public Formatter createFormatter() { } 92 | 93 | 94 | // public Editor createEditor(Base ibase, String path, int[] location) { } 95 | 96 | 97 | /** 98 | * Get a list of folders that contain examples, ordered by the way they 99 | * should show up in the window or menu. 100 | */ 101 | @Override 102 | public File[] getExampleCategoryFolders() { 103 | final String[] titles = { 104 | "ESP", 105 | }; 106 | 107 | File[] outgoing = new File[titles.length]; 108 | for (int i = 0; i < titles.length; i++) { 109 | outgoing[i] = new File(examplesFolder, titles[i]); 110 | } 111 | return outgoing; 112 | } 113 | 114 | 115 | @Override 116 | public void rebuildLibraryList() { 117 | //super.rebuildLibraryList(); 118 | 119 | coreLibraries = new ArrayList<>(); 120 | // Library domLibrary = 121 | // new p5jsLibrary(new File(getLibrariesFolder(), "p5.dom")); 122 | // coreLibraries.add(domLibrary); 123 | // Library soundLibrary = 124 | // new p5jsLibrary(new File(getLibrariesFolder(), "p5.sound")); 125 | // coreLibraries.add(soundLibrary); 126 | 127 | // no contribs for now, figure this out later 128 | contribLibraries = new ArrayList<>(); 129 | } 130 | 131 | 132 | @Override 133 | public boolean requireExampleCompatibility() { 134 | return true; 135 | } 136 | 137 | 138 | /** 139 | * Return the default extension for this mode. 140 | */ 141 | @Override 142 | public String getDefaultExtension() { 143 | return "cpp"; 144 | } 145 | 146 | 147 | /** 148 | * The list of extensions that should show up as tabs. 149 | */ 150 | @Override 151 | public String[] getExtensions () { 152 | return new String[] { "cpp", "c", "h" }; 153 | } 154 | 155 | 156 | /** 157 | * Return list of file and folder names that should be ignored on Save As. 158 | * Starting in Processing 3.2, this can return null (otherwise it should be 159 | * a zero length String array if there's nothing to ignore). 160 | */ 161 | @Override 162 | public String[] getIgnorable() { 163 | return null; 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /src/processing/mode/esp/ESPToolbar.java: -------------------------------------------------------------------------------- 1 | package processing.mode.esp; 2 | 3 | import java.awt.event.MouseEvent; 4 | 5 | import javax.swing.JPopupMenu; 6 | 7 | import processing.app.ui.Editor; 8 | import processing.app.ui.EditorToolbar; 9 | 10 | 11 | public class ESPToolbar extends EditorToolbar { 12 | static protected final int RUN = 0; 13 | static protected final int STOP = 1; 14 | 15 | static protected final int NEW = 2; 16 | static protected final int OPEN = 3; 17 | static protected final int SAVE = 4; 18 | static protected final int EXPORT = 5; 19 | 20 | 21 | public ESPToolbar(Editor editor) { 22 | super(editor); 23 | } 24 | 25 | 26 | public void init() { } 27 | 28 | 29 | @Override 30 | public void handleRun(int modifiers) { 31 | ESPEditor espEditor = (ESPEditor) editor; 32 | espEditor.handleRun(); 33 | } 34 | 35 | 36 | @Override 37 | public void handleStop() { 38 | ESPEditor espEditor = (ESPEditor) editor; 39 | espEditor.handleStop(); 40 | } 41 | 42 | 43 | public void handlePressed(MouseEvent e, int index) { 44 | switch (index) { 45 | 46 | case RUN: 47 | handleRun(e.getModifiers()); 48 | break; 49 | 50 | case STOP: 51 | handleStop(); 52 | break; 53 | 54 | case OPEN: 55 | JPopupMenu popup = editor.getMode().getToolbarMenu().getPopupMenu(); 56 | popup.show(this, e.getX(), e.getY()); 57 | break; 58 | 59 | case NEW: 60 | base.handleNew(); 61 | break; 62 | 63 | case SAVE: 64 | editor.handleSave(false); 65 | break; 66 | 67 | /* 68 | case EXPORT: 69 | jsEditor.handleExport( true ); 70 | break; 71 | */ 72 | } 73 | } 74 | 75 | 76 | static public String getTitle (int index, boolean shift) { 77 | switch (index) { 78 | case RUN: return "Start"; 79 | case STOP: return "Stop"; 80 | case NEW: return "New"; 81 | case OPEN: return "Open"; 82 | case SAVE: return "Save"; 83 | case EXPORT: return "Export"; 84 | } 85 | return null; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /template/sketch.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void setup() 4 | { 5 | 6 | } 7 | --------------------------------------------------------------------------------