├── .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 |
--------------------------------------------------------------------------------