diff --git a/build/build.xml b/build/build.xml
index 53daaa2d4..fe80505cc 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -36,16 +36,7 @@
-
-
-
-
-
-
-
-
-
-
+
@@ -940,6 +931,8 @@
+
+
+
+
+
+
+
+
diff --git a/build/linux/processing.desktop b/build/linux/processing.desktop
index 1e5bde573..b7c0ef9b1 100644
--- a/build/linux/processing.desktop
+++ b/build/linux/processing.desktop
@@ -1,7 +1,7 @@
[Desktop Entry]
Version=@version@
Name=Processing
-Comment=graphics and animation language
+Comment=Software sketchbook
Exec=processing %F
Icon=/opt/processing/lib/icons/pde-256.png
Terminal=false
diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java
index 5ff1c7a39..4740cd535 100644
--- a/core/src/processing/core/PApplet.java
+++ b/core/src/processing/core/PApplet.java
@@ -1870,8 +1870,9 @@ public class PApplet implements PConstants {
/**
- * @param display the screen to run the sketch on (1, 2, 3, etc.)
+ * @param display the screen to run the sketch on (1, 2, 3, etc. or on multiple screens using SPAN)
*/
+
public void fullScreen(String renderer, int display) {
if (!fullScreen ||
!renderer.equals(this.renderer) ||
diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java
index ac0bc729d..1147f4675 100644
--- a/core/src/processing/opengl/PGraphicsOpenGL.java
+++ b/core/src/processing/opengl/PGraphicsOpenGL.java
@@ -5171,7 +5171,7 @@ public class PGraphicsOpenGL extends PGraphics {
x*modelview.m20 + y*modelview.m21 + z*modelview.m22 + modelview.m23;
// Used to indicate if the light is directional or not.
- lightPosition[4 * num + 3] = dir ? 1: 0;
+ lightPosition[4 * num + 3] = dir ? 0 : 1;
}
diff --git a/core/src/processing/opengl/shaders/LightVert-vc4.glsl b/core/src/processing/opengl/shaders/LightVert-vc4.glsl
index ae145a0fd..b96caa4b3 100644
--- a/core/src/processing/opengl/shaders/LightVert-vc4.glsl
+++ b/core/src/processing/opengl/shaders/LightVert-vc4.glsl
@@ -101,7 +101,7 @@ void main() {
if (lightCount == i) break;
vec3 lightPos = lightPosition[i].xyz;
- bool isDir = zero_float < lightPosition[i].w;
+ bool isDir = lightPosition[i].w < one_float;
float spotCos = lightSpot[i].x;
float spotExp = lightSpot[i].y;
diff --git a/core/src/processing/opengl/shaders/LightVert.glsl b/core/src/processing/opengl/shaders/LightVert.glsl
index 559ca6407..470fd4b23 100644
--- a/core/src/processing/opengl/shaders/LightVert.glsl
+++ b/core/src/processing/opengl/shaders/LightVert.glsl
@@ -98,7 +98,7 @@ void main() {
if (lightCount == i) break;
vec3 lightPos = lightPosition[i].xyz;
- bool isDir = zero_float < lightPosition[i].w;
+ bool isDir = lightPosition[i].w < one_float;
float spotCos = lightSpot[i].x;
float spotExp = lightSpot[i].y;
diff --git a/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl b/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl
index c23ce1539..51e88ab05 100644
--- a/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl
+++ b/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl
@@ -104,7 +104,7 @@ void main() {
if (lightCount == i) break;
vec3 lightPos = lightPosition[i].xyz;
- bool isDir = zero_float < lightPosition[i].w;
+ bool isDir = lightPosition[i].w < one_float;
float spotCos = lightSpot[i].x;
float spotExp = lightSpot[i].y;
diff --git a/core/src/processing/opengl/shaders/TexLightVert.glsl b/core/src/processing/opengl/shaders/TexLightVert.glsl
index 3bef7bf3b..6ef7d4bb7 100644
--- a/core/src/processing/opengl/shaders/TexLightVert.glsl
+++ b/core/src/processing/opengl/shaders/TexLightVert.glsl
@@ -101,7 +101,7 @@ void main() {
if (lightCount == i) break;
vec3 lightPos = lightPosition[i].xyz;
- bool isDir = zero_float < lightPosition[i].w;
+ bool isDir = lightPosition[i].w < one_float;
float spotCos = lightSpot[i].x;
float spotExp = lightSpot[i].y;
diff --git a/java/libraries/io/examples/I2CCompass/I2CCompass.pde b/java/libraries/io/examples/I2CCompass/I2CCompass.pde
index c4f9e0cc8..079a7bcc6 100644
--- a/java/libraries/io/examples/I2CCompass/I2CCompass.pde
+++ b/java/libraries/io/examples/I2CCompass/I2CCompass.pde
@@ -3,6 +3,7 @@ I2C i2c;
// HMC6352 is a digital compass module using I2C
// datasheet: https://www.sparkfun.com/datasheets/Components/HMC6352.pdf
+// see setup.png in the sketch folder for wiring details
void setup() {
//printArray(I2C.list());
diff --git a/java/libraries/io/examples/Interrupt/Interrupt.pde b/java/libraries/io/examples/Interrupt/Interrupt.pde
index b6b6185e3..15bdc4cce 100644
--- a/java/libraries/io/examples/Interrupt/Interrupt.pde
+++ b/java/libraries/io/examples/Interrupt/Interrupt.pde
@@ -3,6 +3,7 @@ color bgcolor = 0;
// GPIO numbers refer to different phyiscal pins on various boards
// On the Raspberry Pi GPIO 4 is physical pin 7 on the header
+// see setup.png in the sketch folder for wiring details
void setup() {
GPIO.pinMode(4, GPIO.INPUT);
diff --git a/java/libraries/io/examples/SPIAnalogDigital/SPIAnalogDigital.pde b/java/libraries/io/examples/SPIAnalogDigital/SPIAnalogDigital.pde
index 4e8ee3b4a..bb1311ada 100644
--- a/java/libraries/io/examples/SPIAnalogDigital/SPIAnalogDigital.pde
+++ b/java/libraries/io/examples/SPIAnalogDigital/SPIAnalogDigital.pde
@@ -3,6 +3,7 @@ SPI spi;
// MCP3001 is a Analog-to-Digital converter using SPI
// datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf
+// see setup.png in the sketch folder for wiring details
void setup() {
//printArray(SPI.list());
diff --git a/java/libraries/io/examples/SPIAnalogDigitalOOP/SPIAnalogDigitalOOP.pde b/java/libraries/io/examples/SPIAnalogDigitalOOP/SPIAnalogDigitalOOP.pde
index 85be661a6..f45f0fa5c 100644
--- a/java/libraries/io/examples/SPIAnalogDigitalOOP/SPIAnalogDigitalOOP.pde
+++ b/java/libraries/io/examples/SPIAnalogDigitalOOP/SPIAnalogDigitalOOP.pde
@@ -1,6 +1,8 @@
import processing.io.*;
MCP3001 adc;
+// see setup.png in the sketch folder for wiring details
+
void setup() {
//printArray(SPI.list());
adc = new MCP3001(SPI.list()[0]);
diff --git a/java/libraries/io/examples/SimpleInput/SimpleInput.pde b/java/libraries/io/examples/SimpleInput/SimpleInput.pde
index c6870656f..d7a420ce1 100644
--- a/java/libraries/io/examples/SimpleInput/SimpleInput.pde
+++ b/java/libraries/io/examples/SimpleInput/SimpleInput.pde
@@ -2,6 +2,7 @@ import processing.io.*;
// GPIO numbers refer to different phyiscal pins on various boards
// On the Raspberry Pi GPIO 4 is physical pin 7 on the header
+// see setup.png in the sketch folder for wiring details
void setup() {
GPIO.pinMode(4, GPIO.INPUT);
diff --git a/java/libraries/io/examples/SimpleOutput/SimpleOutput.pde b/java/libraries/io/examples/SimpleOutput/SimpleOutput.pde
index 390592f64..af5e05d05 100644
--- a/java/libraries/io/examples/SimpleOutput/SimpleOutput.pde
+++ b/java/libraries/io/examples/SimpleOutput/SimpleOutput.pde
@@ -3,6 +3,7 @@ boolean ledOn = false;
// GPIO numbers refer to different phyiscal pins on various boards
// On the Raspberry Pi GPIO 4 is physical pin 7 on the header
+// see setup.png in the sketch folder for wiring details
void setup() {
GPIO.pinMode(4, GPIO.OUTPUT);
diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java
index 178730eb4..32be87410 100644
--- a/java/src/processing/mode/java/JavaEditor.java
+++ b/java/src/processing/mode/java/JavaEditor.java
@@ -33,6 +33,7 @@ import processing.mode.java.pdex.ErrorCheckerService;
import processing.mode.java.pdex.LineMarker;
import processing.mode.java.pdex.JavaTextArea;
import processing.mode.java.pdex.Problem;
+import processing.mode.java.preproc.PdePreprocessor;
import processing.mode.java.runner.Runner;
import processing.mode.java.tweak.ColorControlBox;
import processing.mode.java.tweak.Handle;
@@ -136,17 +137,7 @@ public class JavaEditor extends Editor {
hasJavaTabs = checkForJavaTabs();
//initializeErrorChecker();
- { // Init error checker
- errorCheckerService = new ErrorCheckerService(this);
- for (SketchCode code : getSketch().getCode()) {
- Document document = code.getDocument();
- if (document != null) {
- errorCheckerService.addListener(document);
- }
- }
- errorCheckerService.start();
- errorCheckerService.request();
- }
+ initErrorChecker();
// hack to add a JPanel to the right-hand side of the text area
JPanel textAndError = new JPanel();
@@ -180,7 +171,25 @@ public class JavaEditor extends Editor {
});
}
-
+
+ public PdePreprocessor createPreprocessor(final String sketchName) {
+ return new PdePreprocessor(sketchName);
+ }
+
+
+ protected void initErrorChecker() {
+ errorCheckerService = new ErrorCheckerService(this);
+ for (SketchCode code : getSketch().getCode()) {
+ Document document = code.getDocument();
+ if (document != null) {
+ errorCheckerService.addListener(document);
+ }
+ }
+ errorCheckerService.start();
+ errorCheckerService.request();
+ }
+
+
protected JEditTextArea createTextArea() {
return new JavaTextArea(new PdeTextAreaDefaults(mode), this);
}
diff --git a/java/src/processing/mode/java/pdex/ASTGenerator.java b/java/src/processing/mode/java/pdex/ASTGenerator.java
index 469ee571c..8d6fb87b5 100644
--- a/java/src/processing/mode/java/pdex/ASTGenerator.java
+++ b/java/src/processing/mode/java/pdex/ASTGenerator.java
@@ -1296,8 +1296,16 @@ public class ASTGenerator {
for (ImportStatement impS : imports) {
String temp = impS.getPackageName();
- if (impS.isStarredImport() && className.indexOf('.') == -1) {
- temp = impS.getPackageName() + "." + className;
+ if (impS.isStarredImport()) { // case of starred import: pkg.foo.*
+ if (className.indexOf('.') == -1) {
+ temp = impS.getPackageName() + "." + className;
+ } else {
+ continue;
+ }
+ } else { // case of class import: pkg.foo.MyClass
+ if (!impS.getImportedClassName().equals(className)) {
+ continue;
+ }
}
tehClass = loadClass(temp);
if (tehClass != null) {
@@ -1309,8 +1317,16 @@ public class ASTGenerator {
for (ImportStatement impS : errorCheckerService.codeFolderImports) {
String temp = impS.getPackageName();
- if (impS.isStarredImport() && className.indexOf('.') == -1) {
- temp = impS.getPackageName() + "." + className;
+ if (impS.isStarredImport()) { // case of starred import: pkg.foo.*
+ if (className.indexOf('.') == -1) {
+ temp = impS.getPackageName() + "." + className;
+ } else {
+ continue;
+ }
+ } else { // case of class import: pkg.foo.MyClass
+ if (!impS.getImportedClassName().equals(className)) {
+ continue;
+ }
}
tehClass = loadClass(temp);
if (tehClass != null) {
@@ -1320,7 +1336,8 @@ public class ASTGenerator {
//log("Doesn't exist in (code folder) imp package: " + impS.getImportName());
}
- PdePreprocessor p = new PdePreprocessor(null);
+// PdePreprocessor p = new PdePreprocessor(null);
+ PdePreprocessor p = editor.createPreprocessor(null);
for (String impS : p.getCoreImports()) {
tehClass = loadClass(impS.substring(0,impS.length()-1) + className);
if (tehClass != null) {
diff --git a/java/src/processing/mode/java/pdex/ErrorCheckerService.java b/java/src/processing/mode/java/pdex/ErrorCheckerService.java
index bc58d43e8..45e79d7a3 100644
--- a/java/src/processing/mode/java/pdex/ErrorCheckerService.java
+++ b/java/src/processing/mode/java/pdex/ErrorCheckerService.java
@@ -779,13 +779,13 @@ public class ErrorCheckerService {
final String exclude = "exclude";
if (impName.startsWith("processing")) {
- if (JavaMode.suggestionsMap.get(include).contains(impName)) {
+ if (JavaMode.suggestionsMap.containsKey(include) && JavaMode.suggestionsMap.get(include).contains(impName)) {
return false;
- } else if (JavaMode.suggestionsMap.get(exclude).contains(impName)) {
+ } else if (JavaMode.suggestionsMap.containsKey(exclude) && JavaMode.suggestionsMap.get(exclude).contains(impName)) {
return true;
}
} else if (impName.startsWith("java")) {
- if (JavaMode.suggestionsMap.get(include).contains(impName)) {
+ if (JavaMode.suggestionsMap.containsKey(include) && JavaMode.suggestionsMap.get(include).contains(impName)) {
return false;
}
}
diff --git a/java/src/processing/mode/java/pdex/ImportStatement.java b/java/src/processing/mode/java/pdex/ImportStatement.java
index d64b62f8c..6785519b0 100644
--- a/java/src/processing/mode/java/pdex/ImportStatement.java
+++ b/java/src/processing/mode/java/pdex/ImportStatement.java
@@ -78,9 +78,26 @@ public class ImportStatement {
}
public boolean isStarredImport() {
- String ret = new String(importName.trim());
- if(ret.endsWith(";"))
+ String ret = importName.trim();
+ if(ret.endsWith(";")) {
ret = ret.substring(0, ret.length() - 1).trim();
+ }
return ret.endsWith(".*");
}
+
+ public String getImportedClassName() {
+ if (isStarredImport()) {
+ return null;
+ } else {
+ String ret = importName.trim();
+ if(ret.endsWith(";")) {
+ ret = ret.substring(0, ret.length() - 1).trim();
+ }
+ if (ret.lastIndexOf('.') != -1) {
+ return ret.substring(ret.lastIndexOf('.') + 1);
+ } else {
+ return null;
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/java/src/processing/mode/java/pdex/XQPreprocessor.java b/java/src/processing/mode/java/pdex/XQPreprocessor.java
index bb8a83d13..582c1d50c 100644
--- a/java/src/processing/mode/java/pdex/XQPreprocessor.java
+++ b/java/src/processing/mode/java/pdex/XQPreprocessor.java
@@ -54,9 +54,10 @@ public class XQPreprocessor {
public XQPreprocessor(ErrorCheckerService ecs) {
this.ecs = ecs;
-
+
// get parameters from the main preproc
- PdePreprocessor p = new PdePreprocessor(null);
+// PdePreprocessor p = new PdePreprocessor(null);
+ PdePreprocessor p = ecs.editor.createPreprocessor(null);
defaultImports = p.getDefaultImports();
coreImports = p.getCoreImports();
}