Merge branch 'processing:master' into p4-new_pshape_api-stream_copy

This commit is contained in:
codeanticode
2021-12-11 13:30:33 -08:00
committed by GitHub
25 changed files with 617 additions and 33 deletions
-2
View File
@@ -1,13 +1,11 @@
.DS_Store
.AppleDouble
*.iml
._*
*~
/build/shared/reference.zip
*.x
# temporary, until we complete the move to IntelliJ
#*.iml
#/.idea
+60
View File
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<libelement value="jar://$MODULE_DIR$/lib/jna.jar!/" />
<libelement value="jar://$MODULE_DIR$/lib/jna-platform.jar!/" />
<libelement value="jar://$MODULE_DIR$/lib/ant.jar!/" />
<libelement value="jar://$MODULE_DIR$/lib/ant-launcher.jar!/" />
<libelement value="file:///processing4-core/library-test/junit-4.8.1.jar" />
<libelement value="jar://$MODULE_DIR$/lib/VAqua7.jar!/" />
<src_description expected_position="0">
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library name="jna.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/jna.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="jna-platform.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/jna-platform.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" exported="">
<library name="ant.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/ant.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" exported="">
<library name="ant-launcher.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/ant-launcher.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module" module-name="processing4-core" />
</component>
</module>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-app" />
</component>
</module>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<libelement value="jar://$MODULE_DIR$/tool/jai_imageio.jar!/" />
<src_description expected_position="0">
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="inheritedJdk" />
<orderEntry type="module" module-name="processing4-app" />
<orderEntry type="module-library">
<library name="jai_imageio.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/tool/jai_imageio.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<libelement value="jar://$MODULE_DIR$/tool/ThemeEngine.jar!/" />
<src_description expected_position="1">
<src_folder value="file://$MODULE_DIR$/src" expected_position="1" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-app" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="file://$MODULE_DIR$/../../../../java/libraries/javafx/library/macosx/modules" />
</CLASSES>
<JAVADOC />
<SOURCES />
<jarDirectory url="file://$MODULE_DIR$/../../../../java/libraries/javafx/library/macosx/modules" recursive="false" />
</library>
</orderEntry>
</component>
</module>
-1
View File
@@ -1,6 +1,5 @@
bin
bin-test
.idea
/library/gluegen-rt*.jar
/library/jogl-all*.jar
+3
View File
@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AntConfiguration">
<buildFile url="file://$PROJECT_DIR$/build.xml" />
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/processing4-core.iml" filepath="$PROJECT_DIR$/processing4-core.iml" />
<module fileurl="file://$PROJECT_DIR$/methods/processing4-core-preproc.iml" filepath="$PROJECT_DIR$/methods/processing4-core-preproc.iml" />
</modules>
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
+27
View File
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<libelement value="file://$MODULE_DIR/../../app/lib/ant.jar" />
<src_description expected_position="0">
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="inheritedJdk" />
<orderEntry type="module-library">
<library name="ant.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../app/lib/ant.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="jogl" level="project" />
</component>
</module>
+3 -1
View File
@@ -3024,9 +3024,11 @@ public class PShape implements PConstants {
/**
* Return true if this x, y coordinate is part of this shape. Only works
* with PATH shapes or GROUP shapes that contain other GROUPs or PATHs.
* This method is not imperfect and doesn't account for all cases
* (not all complex shapes: concave shapes or holes may have issues).
*/
public boolean contains(float x, float y) {
if (family == PATH) {
if (family == PATH || family == GEOMETRY) {
PVector p = new PVector(x, y);
if (matrix != null) {
// apply the inverse transformation matrix to the point coordinates
+8
View File
@@ -51,6 +51,7 @@ import com.jogamp.opengl.GLCapabilitiesImmutable;
import com.jogamp.opengl.GLContext;
import com.jogamp.opengl.GLDrawable;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
import com.jogamp.opengl.GLRendererQuirks;
import com.jogamp.opengl.glu.GLU;
import com.jogamp.opengl.glu.GLUtessellator;
import com.jogamp.opengl.glu.GLUtessellatorCallbackAdapter;
@@ -128,6 +129,8 @@ public class PJOGL extends PGL {
}
private static boolean forceSharedObjectSync = true;
///////////////////////////////////////////////////////////////
// Initialization, finalization
@@ -183,6 +186,11 @@ public class PJOGL extends PGL {
}
public boolean needSharedObjectSync() {
return forceSharedObjectSync || gl.getContext().hasRendererQuirk(GLRendererQuirks.NeedSharedObjectSync);
}
public void setFps(float fps) {
if (!setFps || targetFps != fps) {
if (60 < fps) {
+8 -4
View File
@@ -3447,12 +3447,16 @@ public class PShapeOpenGL extends PShape {
//
// Geometry utils
// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
/**
* Return true if this x, y coordinate is part of this shape. Only works
* with PATH shapes or GROUP shapes that contain other GROUPs or PATHs.
* This method is not imperfect and doesn't account for all cases
* (not all complex shapes: concave shapes or holes may have issues).
*/
@Override
public boolean contains(float x, float y) {
if (family == PATH) {
if (family == PATH || family == GEOMETRY) {
// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
boolean c = false;
for (int i = 0, j = inGeo.vertexCount-1; i < inGeo.vertexCount; j = i++) {
if (((inGeo.vertices[3 * i + 1] > y) != (inGeo.vertices[3 * j + 1] > y)) &&
+81 -25
View File
@@ -39,6 +39,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -56,6 +57,7 @@ import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLException;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.GLDrawableFactory;
import com.jogamp.nativewindow.MutableGraphicsConfiguration;
import com.jogamp.nativewindow.WindowClosingProtocol;
import com.jogamp.newt.Display;
@@ -107,6 +109,11 @@ public class PSurfaceJOGL implements PSurface {
protected NewtCanvasAWT canvas;
protected static GLAutoDrawable sharedDrawable;
protected static ArrayList<FPSAnimator> animators = new ArrayList<>();
private final static Object sharedSyncMutex = new Object();
private Object syncMutex;
protected int windowScaleFactor;
protected float[] currentPixelScale = { 0, 0 };
@@ -254,6 +261,29 @@ public class PSurfaceJOGL implements PSurface {
caps.setBackgroundOpaque(true);
caps.setOnscreen(true);
pgl.setCaps(caps);
if (sharedDrawable == null) {
// Create a shared drawable to enable context sharing across multiple GL windows
// https://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/com/jogamp/opengl/GLSharedContextSetter.html
sharedDrawable = GLDrawableFactory.getFactory(profile).createDummyAutoDrawable(null, true, caps, null);
sharedDrawable.display();
}
}
// To properly deal with synchronization when context sharing across multiple drawables (windows), we need a
// synchronization mutex object to ensure that rendering of each frame completes in their respective animator thread:
// https://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/com/jogamp/opengl/GLSharedContextSetter.html#synchronization
private Object getSyncMutex(GLAutoDrawable drawable) {
pgl.getGL(drawable);
if (pgl.needSharedObjectSync()) {
syncMutex = sharedSyncMutex;
} else {
if (syncMutex == null) {
syncMutex = new Object();
}
}
return syncMutex;
}
@@ -327,6 +357,8 @@ public class PSurfaceJOGL implements PSurface {
window.setTopLevelSize((int) displayRect.getWidth(), (int) displayRect.getHeight());
}
}
window.setSharedAutoDrawable(sharedDrawable);
}
@@ -354,6 +386,7 @@ public class PSurfaceJOGL implements PSurface {
}
animator = new FPSAnimator(window, 60);
animators.add(animator);
drawException = null;
animator.setUncaughtExceptionHandler((animator, drawable, cause) -> {
@@ -637,6 +670,10 @@ public class PSurfaceJOGL implements PSurface {
drawExceptionHandler = null;
}
if (animator != null) {
// Stops all other animators to avoid exceptions when closing a window in a multiple window configuration
for (FPSAnimator ani: animators) {
if (ani != animator) ani.stop();
}
return animator.stop();
} else {
return false;
@@ -753,9 +790,13 @@ public class PSurfaceJOGL implements PSurface {
public class DrawListener implements GLEventListener {
private boolean isInit = false;
public void display(GLAutoDrawable drawable) {
if (!isInit) return;
if (display.getEDTUtil().isCurrentThreadEDT()) {
// For an unknown reason, the first two frames of the animator run on
// For some unknown reason, a few frames of the animator run on
// the EDT. For those, we just skip this draw call to avoid badness.
return;
}
@@ -770,17 +811,19 @@ public class PSurfaceJOGL implements PSurface {
}
if (!sketch.finished) {
pgl.getGL(drawable);
int prevFrameCount = sketch.frameCount;
sketch.handleDraw();
if (prevFrameCount == sketch.frameCount || sketch.finished) {
// This hack allows the FBO layer to be swapped normally even if
// the sketch is no looping or finished because it does not call draw(),
// otherwise background artifacts may occur (depending on the hardware/drivers).
pgl.beginRender();
pgl.endRender(sketch.sketchWindowColor());
synchronized (getSyncMutex(drawable)) {
pgl.getGL(drawable);
int prevFrameCount = sketch.frameCount;
sketch.handleDraw();
if (prevFrameCount == sketch.frameCount || sketch.finished) {
// This hack allows the FBO layer to be swapped normally even if
// the sketch is no looping or finished because it does not call draw(),
// otherwise background artifacts may occur (depending on the hardware/drivers).
pgl.beginRender();
pgl.endRender(sketch.sketchWindowColor());
}
PGraphicsOpenGL.completeFinishedPixelTransfers();
}
PGraphicsOpenGL.completeFinishedPixelTransfers();
}
if (sketch.exitCalled()) {
@@ -796,24 +839,37 @@ public class PSurfaceJOGL implements PSurface {
}
public void init(GLAutoDrawable drawable) {
pgl.getGL(drawable);
pgl.init(drawable);
sketch.start();
if (display.getEDTUtil().isCurrentThreadEDT()) {
return;
}
int c = graphics.backgroundColor;
pgl.clearColor(((c >> 16) & 0xff) / 255f,
((c >> 8) & 0xff) / 255f,
(c & 0xff) / 255f,
((c >> 24) & 0xff) / 255f);
pgl.clear(PGL.COLOR_BUFFER_BIT);
synchronized (getSyncMutex(drawable)) {
pgl.init(drawable);
sketch.start();
int c = graphics.backgroundColor;
pgl.clearColor(((c >> 16) & 0xff) / 255f,
((c >> 8) & 0xff) / 255f,
(c & 0xff) / 255f,
((c >> 24) & 0xff) / 255f);
pgl.clear(PGL.COLOR_BUFFER_BIT);
isInit = true;
}
}
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
pgl.resetFBOLayer();
pgl.getGL(drawable);
float scale = PApplet.platform == PConstants.MACOS ?
getCurrentPixelScale() : getPixelScale();
setSize((int) (w / scale), (int) (h / scale));
if (!isInit) return;
if (display.getEDTUtil().isCurrentThreadEDT()) {
return;
}
synchronized (getSyncMutex(drawable)) {
pgl.resetFBOLayer();
float scale = PApplet.platform == PConstants.MACOS ?
getCurrentPixelScale() : getPixelScale();
setSize((int) (w / scale), (int) (h / scale));
}
}
}
+6
View File
@@ -3,10 +3,16 @@ X support extensions for directories with listFiles/listPaths
X otherwise asking for .jpg will return root folders (unless 'only files' specified)
X but because macOS actually puts extensions on folders (.app, etc), support it
X fix for disableStyle() with 2D shapes in P3D
X allow GEOMETRY (not just PATH) with contains() in PShape
X the method is still incomplete, but added a note about that too
X added workaround in PShapeOpenGL to get access to vertex data
_ still need to find the root cause
_ also need to check for other reports about this
X multiple windows with GL
_ https://github.com/processing/processing4/issues/312
X https://github.com/processing/processing4/pull/313
_ made DrawListener public in PSurfaceJOGL (probably change that back)
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-core" />
</component>
</module>
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<libelement value="jar://$MODULE_DIR$/library/javafx.base.jar!/" />
<libelement value="jar://$MODULE_DIR$/library/javafx.controls.jar!/" />
<libelement value="jar://$MODULE_DIR$/library/javafx.fxml.jar!/" />
<libelement value="jar://$MODULE_DIR$/library/javafx.graphics.jar!/" />
<libelement value="jar://$MODULE_DIR$/library/javafx.jar!/" />
<libelement value="jar://$MODULE_DIR$/library/javafx.media.jar!/" />
<libelement value="jar://$MODULE_DIR$/library/javafx.swing.jar!/" />
<src_description expected_position="1">
<src_folder value="file://$MODULE_DIR$/src" expected_position="1" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-core" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="file://$MODULE_DIR$/library/macosx/modules" />
</CLASSES>
<JAVADOC />
<SOURCES />
<jarDirectory url="file://$MODULE_DIR$/library/macosx/modules" recursive="false" />
</library>
</orderEntry>
</component>
</module>
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-core" />
</component>
</module>
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-core" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/library/itext.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<libelement value="jar://$MODULE_DIR$/library/jssc.jar!/" />
<src_description expected_position="0">
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library name="jssc.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/library/jssc.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module" module-name="processing4-core" />
</component>
</module>
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-core" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/library/batik.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>
+181
View File
@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<libelement value="jar://$MODULE_DIR$/mode/antlr-4.7.2-complete.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/classpath-explorer-1.0.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/com.ibm.icu.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/jdtCompilerAdapter.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/jsoup-1.7.1.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.core.contenttype.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.core.jobs.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.core.resources.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.core.runtime.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.equinox.common.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.equinox.preferences.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.jdt.core.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.osgi.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.eclipse.text.jar!/" />
<libelement value="jar://$MODULE_DIR$/mode/org.netbeans.swing.outline.jar!/" />
<libelement value="jar://$MODULE_DIR$/test/lib/junit-4.8.1.jar!/" />
<src_description expected_position="0">
<src_folder value="file://$MODULE_DIR$/generated" expected_position="0" />
<src_folder value="file://$MODULE_DIR$/src" expected_position="1" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/bin" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/generated" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="processing4-app" />
<orderEntry type="module" module-name="processing4-core" />
<orderEntry type="module-library">
<library name="antlr-4.7.2-complete.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/antlr-4.7.2-complete.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="classpath-explorer-1.0.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/classpath-explorer-1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="com.ibm.icu.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/com.ibm.icu.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="jdtCompilerAdapter.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/jdtCompilerAdapter.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="jsoup-1.7.1.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/jsoup-1.7.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.core.contenttype.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.core.contenttype.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.core.jobs.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.core.jobs.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.core.resources.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.core.resources.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.core.runtime.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.core.runtime.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.equinox.common.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.equinox.common.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.equinox.preferences.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.equinox.preferences.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.jdt.core.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.jdt.core.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.osgi.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.osgi.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.eclipse.text.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.eclipse.text.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="org.netbeans.swing.outline.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/mode/org.netbeans.swing.outline.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="junit-4.8.1.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/test/lib/junit-4.8.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>