propane 3.4.2-java → 3.8.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -1
  3. data/.mvn/wrapper/MavenWrapperDownloader.java +2 -2
  4. data/.mvn/wrapper/maven-wrapper.properties +2 -2
  5. data/.travis.yml +1 -1
  6. data/CHANGELOG.md +9 -1
  7. data/Gemfile +2 -0
  8. data/README.md +7 -10
  9. data/Rakefile +10 -11
  10. data/bin/propane +3 -1
  11. data/lib/propane.rb +4 -2
  12. data/lib/propane/app.rb +5 -1
  13. data/lib/propane/creators/sketch_class.rb +7 -1
  14. data/lib/propane/creators/sketch_factory.rb +4 -2
  15. data/lib/propane/creators/sketch_writer.rb +1 -0
  16. data/lib/propane/helper_methods.rb +22 -23
  17. data/lib/propane/helpers/numeric.rb +2 -0
  18. data/lib/propane/helpers/version_error.rb +1 -0
  19. data/lib/propane/library.rb +5 -1
  20. data/lib/propane/library_loader.rb +2 -0
  21. data/lib/propane/native_folder.rb +10 -9
  22. data/lib/propane/native_loader.rb +3 -0
  23. data/lib/propane/runner.rb +20 -14
  24. data/lib/propane/version.rb +2 -1
  25. data/library/boids/boids.rb +21 -11
  26. data/library/color_group/color_group.rb +2 -0
  27. data/library/control_panel/control_panel.rb +8 -5
  28. data/library/dxf/dxf.rb +2 -0
  29. data/library/file_chooser/chooser.rb +10 -9
  30. data/library/file_chooser/file_chooser.rb +10 -9
  31. data/library/library_proxy/library_proxy.rb +2 -0
  32. data/library/net/net.rb +2 -0
  33. data/library/slider/slider.rb +23 -22
  34. data/library/vector_utils/vector_utils.rb +4 -0
  35. data/library/video_event/video_event.rb +2 -0
  36. data/pom.rb +37 -36
  37. data/pom.xml +7 -7
  38. data/propane.gemspec +13 -9
  39. data/src/main/java/japplemenubar/JAppleMenuBar.java +3 -3
  40. data/src/main/java/monkstone/ColorUtil.java +1 -3
  41. data/src/main/java/monkstone/MathToolModule.java +1 -1
  42. data/src/main/java/monkstone/PropaneLibrary.java +2 -2
  43. data/src/main/java/monkstone/fastmath/DegLutTables.java +111 -0
  44. data/src/main/java/monkstone/fastmath/Deglut.java +6 -56
  45. data/src/main/java/monkstone/filechooser/Chooser.java +1 -1
  46. data/src/main/java/monkstone/noise/Noise.java +116 -0
  47. data/src/main/java/monkstone/noise/NoiseGenerator.java +63 -0
  48. data/src/main/java/monkstone/noise/NoiseMode.java +15 -0
  49. data/src/main/java/monkstone/noise/SimplexNoise.java +137 -103
  50. data/src/main/java/monkstone/noise/ValueNoise.java +170 -0
  51. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +1 -1
  52. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
  53. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +1 -1
  54. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +1 -1
  55. data/src/main/java/monkstone/slider/SliderBar.java +1 -1
  56. data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
  57. data/src/main/java/monkstone/slider/WheelHandler.java +1 -1
  58. data/src/main/java/monkstone/vecmath/package-info.java +1 -1
  59. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +1 -1
  60. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -2
  61. data/src/main/java/monkstone/videoevent/CaptureEvent.java +1 -1
  62. data/src/main/java/monkstone/videoevent/MovieEvent.java +1 -1
  63. data/src/main/java/monkstone/videoevent/package-info.java +1 -1
  64. data/src/main/java/processing/awt/PGraphicsJava2D.java +781 -285
  65. data/src/main/java/processing/awt/PImageAWT.java +377 -0
  66. data/src/main/java/processing/awt/PShapeJava2D.java +56 -52
  67. data/src/main/java/processing/awt/PSurfaceAWT.java +308 -208
  68. data/src/main/java/processing/awt/ShimAWT.java +581 -0
  69. data/src/main/java/processing/core/PApplet.java +13142 -13883
  70. data/src/main/java/processing/core/PConstants.java +477 -447
  71. data/src/main/java/processing/core/PFont.java +914 -880
  72. data/src/main/java/processing/core/PGraphics.java +152 -136
  73. data/src/main/java/processing/core/PImage.java +275 -372
  74. data/src/main/java/processing/core/PMatrix.java +172 -159
  75. data/src/main/java/processing/core/PMatrix2D.java +478 -415
  76. data/src/main/java/processing/core/PMatrix3D.java +762 -735
  77. data/src/main/java/processing/core/PShape.java +2887 -2651
  78. data/src/main/java/processing/core/PShapeOBJ.java +97 -92
  79. data/src/main/java/processing/core/PShapeSVG.java +1705 -1490
  80. data/src/main/java/processing/core/PStyle.java +40 -37
  81. data/src/main/java/processing/core/PSurface.java +139 -97
  82. data/src/main/java/processing/core/PSurfaceNone.java +296 -218
  83. data/src/main/java/processing/core/PVector.java +995 -963
  84. data/src/main/java/processing/core/ThinkDifferent.java +12 -8
  85. data/src/main/java/processing/data/DoubleDict.java +756 -710
  86. data/src/main/java/processing/data/DoubleList.java +749 -696
  87. data/src/main/java/processing/data/FloatDict.java +748 -702
  88. data/src/main/java/processing/data/FloatList.java +751 -697
  89. data/src/main/java/processing/data/IntDict.java +720 -673
  90. data/src/main/java/processing/data/IntList.java +699 -633
  91. data/src/main/java/processing/data/JSONArray.java +931 -873
  92. data/src/main/java/processing/data/JSONObject.java +1262 -1165
  93. data/src/main/java/processing/data/JSONTokener.java +351 -341
  94. data/src/main/java/processing/data/LongDict.java +710 -663
  95. data/src/main/java/processing/data/LongList.java +701 -635
  96. data/src/main/java/processing/data/Sort.java +37 -41
  97. data/src/main/java/processing/data/StringDict.java +525 -486
  98. data/src/main/java/processing/data/StringList.java +626 -580
  99. data/src/main/java/processing/data/Table.java +3690 -3510
  100. data/src/main/java/processing/data/TableRow.java +182 -183
  101. data/src/main/java/processing/data/XML.java +957 -883
  102. data/src/main/java/processing/event/Event.java +87 -67
  103. data/src/main/java/processing/event/KeyEvent.java +48 -41
  104. data/src/main/java/processing/event/MouseEvent.java +88 -113
  105. data/src/main/java/processing/event/TouchEvent.java +10 -6
  106. data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
  107. data/src/main/java/processing/javafx/PSurfaceFX.java +149 -121
  108. data/src/main/java/processing/net/Client.java +20 -20
  109. data/src/main/java/processing/net/Server.java +9 -9
  110. data/src/main/java/processing/opengl/FontTexture.java +286 -266
  111. data/src/main/java/processing/opengl/FrameBuffer.java +389 -377
  112. data/src/main/java/processing/opengl/LinePath.java +132 -89
  113. data/src/main/java/processing/opengl/LineStroker.java +588 -581
  114. data/src/main/java/processing/opengl/PGL.java +660 -567
  115. data/src/main/java/processing/opengl/PGraphics2D.java +408 -315
  116. data/src/main/java/processing/opengl/PGraphics3D.java +107 -72
  117. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12378 -12075
  118. data/src/main/java/processing/opengl/PJOGL.java +1753 -1670
  119. data/src/main/java/processing/opengl/PShader.java +369 -461
  120. data/src/main/java/processing/opengl/PShapeOpenGL.java +4678 -4580
  121. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1114 -1027
  122. data/src/main/java/processing/opengl/Texture.java +1492 -1401
  123. data/src/main/java/processing/opengl/VertexBuffer.java +57 -55
  124. data/test/create_test.rb +21 -20
  125. data/test/deglut_spec_test.rb +4 -2
  126. data/test/helper_methods_test.rb +49 -20
  127. data/test/math_tool_test.rb +39 -32
  128. data/test/native_folder.rb +47 -0
  129. data/test/respond_to_test.rb +3 -2
  130. data/test/sketches/key_event.rb +2 -2
  131. data/test/sketches/library/my_library/my_library.rb +3 -0
  132. data/test/test_helper.rb +2 -0
  133. data/test/vecmath_spec_test.rb +35 -22
  134. data/vendors/Rakefile +35 -40
  135. metadata +47 -23
  136. data/library/simplex_noise/simplex_noise.rb +0 -3
  137. data/src/main/java/processing/opengl/shaders/LightVert-brcm.glsl +0 -154
  138. data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +0 -154
  139. data/src/main/java/processing/opengl/shaders/TexLightVert-brcm.glsl +0 -160
  140. data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +0 -160
@@ -1,3 +1,5 @@
1
+ /* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+
1
3
  /*
2
4
  Part of the Processing project - http://processing.org
3
5
 
@@ -18,7 +20,8 @@
18
20
  Public License along with this library; if not, write to the
19
21
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20
22
  Boston, MA 02111-1307 USA
21
- */
23
+ */
24
+
22
25
  package processing.opengl;
23
26
 
24
27
  import java.io.IOException;
@@ -35,6 +38,8 @@ import java.util.regex.Pattern;
35
38
  import processing.core.PApplet;
36
39
  import processing.core.PConstants;
37
40
  import processing.core.PGraphics;
41
+ import processing.core.PImage;
42
+
38
43
 
39
44
  /**
40
45
  * Processing-OpenGL abstraction layer. Needs to be implemented by subclasses
@@ -47,112 +52,94 @@ public abstract class PGL {
47
52
  // ........................................................
48
53
 
49
54
  // Basic fields
50
- /**
51
- * The PGraphics and PApplet objects using this interface
52
- */
55
+
56
+ /** The PGraphics and PApplet objects using this interface */
53
57
  protected PGraphicsOpenGL graphics;
54
58
  protected PApplet sketch;
59
+ protected RenderCallback renderCallback;
55
60
 
56
- /**
57
- * OpenGL thread
58
- */
61
+ /** OpenGL thread */
59
62
  protected Thread glThread;
60
63
 
61
- /**
62
- * ID of the GL context associated to the surface *
63
- */
64
+ /** ID of the GL context associated to the surface **/
64
65
  protected int glContext;
65
66
 
66
- /**
67
- * true if this is the GL interface for a primary surface PGraphics
68
- */
67
+ /** true if this is the GL interface for a primary surface PGraphics */
69
68
  public boolean primaryPGL;
70
69
 
71
70
  // ........................................................
71
+
72
72
  // Parameters
73
- public static int REQUESTED_DEPTH_BITS = 24;
73
+
74
+ public static int REQUESTED_DEPTH_BITS = 24;
74
75
  public static int REQUESTED_STENCIL_BITS = 8;
75
- public static int REQUESTED_ALPHA_BITS = 8;
76
+ public static int REQUESTED_ALPHA_BITS = 8;
76
77
 
77
- /**
78
- * Switches between the use of regular and direct buffers.
79
- */
78
+ /** Switches between the use of regular and direct buffers. */
80
79
  protected static boolean USE_DIRECT_BUFFERS = true;
81
80
  protected static int MIN_DIRECT_BUFFER_SIZE = 1;
82
81
 
83
- /**
84
- * Enables/disables mipmap use.
85
- */
82
+ /** Enables/disables mipmap use. */
86
83
  protected static boolean MIPMAPS_ENABLED = true;
87
84
 
88
- /**
89
- * Initial sizes for arrays of input and tessellated data.
90
- */
91
- protected static int DEFAULT_IN_VERTICES = 64;
92
- protected static int DEFAULT_IN_EDGES = 128;
93
- protected static int DEFAULT_IN_TEXTURES = 64;
85
+ /** Initial sizes for arrays of input and tessellated data. */
86
+ protected static int DEFAULT_IN_VERTICES = 64;
87
+ protected static int DEFAULT_IN_EDGES = 128;
88
+ protected static int DEFAULT_IN_TEXTURES = 64;
94
89
  protected static int DEFAULT_TESS_VERTICES = 64;
95
- protected static int DEFAULT_TESS_INDICES = 128;
90
+ protected static int DEFAULT_TESS_INDICES = 128;
96
91
 
97
- /**
98
- * Maximum lights by default is 8, the minimum defined by OpenGL.
99
- */
92
+ /** Maximum lights by default is 8, the minimum defined by OpenGL. */
100
93
  protected static int MAX_LIGHTS = 8;
101
94
 
102
- /**
103
- * Maximum index value of a tessellated vertex. GLES restricts the vertex
95
+ /** Maximum index value of a tessellated vertex. GLES restricts the vertex
104
96
  * indices to be of type unsigned short. Since Java only supports signed
105
97
  * shorts as primitive type we have 2^15 = 32768 as the maximum number of
106
98
  * vertices that can be referred to within a single VBO.
107
99
  */
108
- protected final static int MAX_VERTEX_INDEX = 32767;
109
- protected static int MAX_VERTEX_INDEX1 = MAX_VERTEX_INDEX + 1;
110
-
111
- /**
112
- * Count of tessellated fill, line or point vertices that will trigger a flush
113
- * in the immediate mode. It doesn't necessarily be equal to
114
- * MAX_VERTEX_INDEX1, since the number of vertices can be effectively much
115
- * large since the renderer uses offsets to refer to vertices beyond the
116
- * MAX_VERTEX_INDEX limit.
100
+ protected static final int MAX_VERTEX_INDEX = 32767;
101
+ protected static final int MAX_VERTEX_INDEX1 = MAX_VERTEX_INDEX + 1;
102
+
103
+ /** Count of tessellated fill, line or point vertices that will
104
+ * trigger a flush in the immediate mode. It doesn't necessarily
105
+ * be equal to MAX_VERTEX_INDEX1, since the number of vertices can
106
+ * be effectively much large since the renderer uses offsets to
107
+ * refer to vertices beyond the MAX_VERTEX_INDEX limit.
117
108
  */
118
109
  protected static int FLUSH_VERTEX_COUNT = MAX_VERTEX_INDEX1;
119
110
 
120
- /**
121
- * Minimum/maximum dimensions of a texture used to hold font data.
122
- */
111
+ /** Minimum/maximum dimensions of a texture used to hold font data. */
123
112
  protected static int MIN_FONT_TEX_SIZE = 256;
124
113
  protected static int MAX_FONT_TEX_SIZE = 1024;
125
114
 
126
- /**
127
- * Minimum stroke weight needed to apply the full path stroking algorithm that
128
- * properly generates caps and joins.
115
+ /** Minimum stroke weight needed to apply the full path stroking
116
+ * algorithm that properly generates caps and joins.
129
117
  */
130
118
  protected static float MIN_CAPS_JOINS_WEIGHT = 2f;
131
119
 
132
- /**
133
- * Maximum length of linear paths to be stroked with the full algorithm that
134
- * generates accurate caps and joins.
120
+ /** Maximum length of linear paths to be stroked with the
121
+ * full algorithm that generates accurate caps and joins.
135
122
  */
136
123
  protected static int MAX_CAPS_JOINS_LENGTH = 5000;
137
124
 
138
- /**
139
- * Minimum array size to use arrayCopy method().
140
- */
125
+ /** Minimum array size to use arrayCopy method(). */
141
126
  protected static int MIN_ARRAYCOPY_SIZE = 2;
142
127
 
143
- /**
144
- * Factor used to displace the stroke vertices towards the camera in order to
145
- * make sure the lines are always on top of the fill geometry
146
- */
128
+ /** Factor used to displace the stroke vertices towards the camera in
129
+ * order to make sure the lines are always on top of the fill geometry */
147
130
  protected static float STROKE_DISPLACEMENT = 0.999f;
148
131
 
149
132
  // ........................................................
133
+
150
134
  // Variables to handle single-buffered situations (i.e.: Android)
135
+
151
136
  protected IntBuffer firstFrame;
152
137
  protected static boolean SINGLE_BUFFERED = false;
153
138
 
154
139
  // ........................................................
140
+
155
141
  // FBO layer
142
+
156
143
  protected boolean fboLayerEnabled = false;
157
144
  protected boolean fboLayerCreated = false;
158
145
  protected boolean fboLayerEnabledReq = false;
@@ -176,14 +163,25 @@ public abstract class PGL {
176
163
  protected int fboWidth, fboHeight;
177
164
  protected int backTex, frontTex;
178
165
 
179
- /**
180
- * Flags used to handle the creation of a separate front texture
181
- */
166
+ /** Flags used to handle the creation of a separate front texture */
182
167
  protected boolean usingFrontTex = false;
183
168
  protected boolean needSepFrontTex = false;
184
169
 
170
+ /**
171
+ * Defines if FBO Layer is allowed in the given environment.
172
+ * Using FBO can cause a fatal error during runtime for
173
+ * Intel HD Graphics 3000 chipsets (commonly used on older MacBooks)
174
+ * <a href="https://github.com/processing/processing/issues/4104">#4104</a>.
175
+ * Changed to private because needs to be accessed via isFboAllowed().
176
+ * <a href="https://github.com/processing/processing4/pull/76">#76</a> and
177
+ * <a href="https://github.com/processing/processing4/issues/50">#50</a>
178
+ */
179
+ private Boolean fboAllowed = true;
180
+
185
181
  // ........................................................
182
+
186
183
  // Texture rendering
184
+
187
185
  protected boolean loadedTex2DShader = false;
188
186
  protected int tex2DShaderProgram;
189
187
  protected int tex2DVertShader;
@@ -213,11 +211,11 @@ public abstract class PGL {
213
211
  };
214
212
  protected FloatBuffer texData;
215
213
 
216
- protected static final String SHADER_PREPROCESSOR_DIRECTIVE
217
- = "#ifdef GL_ES\n"
218
- + "precision mediump float;\n"
219
- + "precision mediump int;\n"
220
- + "#endif\n";
214
+ protected static final String SHADER_PREPROCESSOR_DIRECTIVE =
215
+ "#ifdef GL_ES\n" +
216
+ "precision mediump float;\n" +
217
+ "precision mediump int;\n" +
218
+ "#endif\n";
221
219
 
222
220
  protected static String[] texVertShaderSource = {
223
221
  "attribute vec2 position;",
@@ -234,7 +232,7 @@ public abstract class PGL {
234
232
  "uniform sampler2D texMap;",
235
233
  "varying vec2 vertTexCoord;",
236
234
  "void main() {",
237
- " gl_FragColor = texture2D(texMap, vertTexCoord.st);",
235
+ " gl_FragColor = texture2D(texMap, vertTexCoord.st);",
238
236
  "}"
239
237
  };
240
238
 
@@ -247,26 +245,26 @@ public abstract class PGL {
247
245
  "}"
248
246
  };
249
247
 
250
- /**
251
- * Which texturing targets are enabled
252
- */
253
- protected boolean[] texturingTargets = {false, false};
248
+ /** Which texturing targets are enabled */
249
+ protected boolean[] texturingTargets = { false, false };
254
250
 
255
- /**
256
- * Used to keep track of which textures are bound to each target
257
- */
251
+ /** Used to keep track of which textures are bound to each target */
258
252
  protected int maxTexUnits;
259
253
  protected int activeTexUnit = 0;
260
254
  protected int[][] boundTextures;
261
255
 
262
256
  // ........................................................
257
+
263
258
  // Framerate handling
259
+
264
260
  protected float targetFps = 60;
265
261
  protected float currentFps = 60;
266
262
  protected boolean setFps = false;
267
263
 
268
264
  // ........................................................
265
+
269
266
  // Utility buffers
267
+
270
268
  protected ByteBuffer byteBuffer;
271
269
  protected IntBuffer intBuffer;
272
270
  protected IntBuffer viewBuffer;
@@ -276,16 +274,14 @@ public abstract class PGL {
276
274
  protected ByteBuffer stencilBuffer;
277
275
 
278
276
  //........................................................
277
+
279
278
  // Rendering information
280
- /**
281
- * Used to register amount of geometry rendered in each frame.
282
- */
279
+
280
+ /** Used to register amount of geometry rendered in each frame. */
283
281
  protected int geomCount = 0;
284
282
  protected int pgeomCount;
285
283
 
286
- /**
287
- * Used to register calls to background.
288
- */
284
+ /** Used to register calls to background. */
289
285
  protected boolean clearColor = false;
290
286
  protected boolean pclearColor;
291
287
 
@@ -295,66 +291,66 @@ public abstract class PGL {
295
291
  protected boolean clearStencil = false;
296
292
  protected boolean pclearStencil;
297
293
 
294
+
298
295
  // ........................................................
296
+
299
297
  // Error messages
300
- public static final String WIKI
301
- = " Read http://wiki.processing.org/w/OpenGL_Issues for help.";
302
298
 
303
- public static final String FRAMEBUFFER_ERROR
304
- = "Framebuffer error (%1$s), rendering will probably not work as expected" + WIKI;
299
+ public static final String WIKI =
300
+ " Read http://wiki.processing.org/w/OpenGL_Issues for help.";
301
+
302
+ public static final String FRAMEBUFFER_ERROR =
303
+ "Framebuffer error (%1$s), rendering will probably not work as expected" + WIKI;
305
304
 
306
- public static final String MISSING_FBO_ERROR
307
- = "Framebuffer objects are not supported by this hardware (or driver)" + WIKI;
305
+ public static final String MISSING_FBO_ERROR =
306
+ "Framebuffer objects are not supported by this hardware (or driver)" + WIKI;
308
307
 
309
- public static final String MISSING_GLSL_ERROR
310
- = "GLSL shaders are not supported by this hardware (or driver)" + WIKI;
308
+ public static final String MISSING_GLSL_ERROR =
309
+ "GLSL shaders are not supported by this hardware (or driver)" + WIKI;
311
310
 
312
- public static final String MISSING_GLFUNC_ERROR
313
- = "GL function %1$s is not available on this hardware (or driver)" + WIKI;
311
+ public static final String MISSING_GLFUNC_ERROR =
312
+ "GL function %1$s is not available on this hardware (or driver)" + WIKI;
314
313
 
315
- public static final String UNSUPPORTED_GLPROF_ERROR
316
- = "Unsupported OpenGL profile.";
314
+ public static final String UNSUPPORTED_GLPROF_ERROR =
315
+ "Unsupported OpenGL profile.";
317
316
 
318
- public static final String TEXUNIT_ERROR
319
- = "Number of texture units not supported by this hardware (or driver)" + WIKI;
317
+ public static final String TEXUNIT_ERROR =
318
+ "Number of texture units not supported by this hardware (or driver)" + WIKI;
320
319
 
321
- public static final String NONPRIMARY_ERROR
322
- = "The renderer is trying to call a PGL function that can only be called on a primary PGL. "
323
- + "This is most likely due to a bug in the renderer's code, please report it with an "
324
- + "issue on Processing's github page https://github.com/processing/processing/issues?state=open "
325
- + "if using any of the built-in OpenGL renderers. If you are using a contributed "
326
- + "library, contact the library's developers.";
320
+ public static final String NONPRIMARY_ERROR =
321
+ "The renderer is trying to call a PGL function that can only be called on a primary PGL. " +
322
+ "This is most likely due to a bug in the renderer's code, please report it with an " +
323
+ "issue on Processing's github page https://github.com/processing/processing/issues?state=open " +
324
+ "if using any of the built-in OpenGL renderers. If you are using a contributed " +
325
+ "library, contact the library's developers.";
327
326
 
328
- protected static final String DEPTH_READING_NOT_ENABLED_ERROR
329
- = "Reading depth and stencil values from this multisampled buffer is not enabled. "
330
- + "You can enable it by calling hint(ENABLE_DEPTH_READING) once. "
331
- + "If your sketch becomes too slow, disable multisampling with noSmooth() instead.";
327
+ protected static final String DEPTH_READING_NOT_ENABLED_ERROR =
328
+ "Reading depth and stencil values from this multisampled buffer is not enabled. " +
329
+ "You can enable it by calling hint(ENABLE_DEPTH_READING) once. " +
330
+ "If your sketch becomes too slow, disable multisampling with noSmooth() instead.";
332
331
 
333
332
  // ........................................................
333
+
334
334
  // Constants
335
- /**
336
- * Size of different types in bytes
337
- */
338
- protected static int SIZEOF_SHORT = Short.SIZE / 8;
339
- protected static int SIZEOF_INT = Integer.SIZE / 8;
335
+
336
+ /** Size of different types in bytes */
337
+ protected static final int SIZEOF_SHORT = Short.SIZE / 8;
338
+ protected static int SIZEOF_INT = Integer.SIZE / 8;
340
339
  protected static int SIZEOF_FLOAT = Float.SIZE / 8;
341
- protected static int SIZEOF_BYTE = Byte.SIZE / 8;
340
+ protected static int SIZEOF_BYTE = Byte.SIZE / 8;
342
341
  protected static int SIZEOF_INDEX = SIZEOF_SHORT;
343
- protected static int INDEX_TYPE = 0x1403; // GL_UNSIGNED_SHORT
342
+ protected static int INDEX_TYPE = 0x1403; // GL_UNSIGNED_SHORT
344
343
 
345
- /**
346
- * Machine Epsilon for float precision.
347
- */
344
+ /** Machine Epsilon for float precision. */
348
345
  protected static float FLOAT_EPS = Float.MIN_VALUE;
349
346
  // Calculation of the Machine Epsilon for float precision. From:
350
347
  // http://en.wikipedia.org/wiki/Machine_epsilon#Approximation_using_Java
351
-
352
348
  static {
353
349
  float eps = 1.0f;
354
350
 
355
351
  do {
356
352
  eps /= 2.0f;
357
- } while ((float) (1.0 + (eps / 2.0)) != 1.0);
353
+ } while ((float)(1.0 + (eps / 2.0)) != 1.0);
358
354
 
359
355
  FLOAT_EPS = eps;
360
356
  }
@@ -363,13 +359,17 @@ public abstract class PGL {
363
359
  * Set to true if the host system is big endian (PowerPC, MIPS, SPARC), false
364
360
  * if little endian (x86 Intel for Mac or PC).
365
361
  */
366
- protected static boolean BIG_ENDIAN
367
- = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
362
+ protected static boolean BIG_ENDIAN =
363
+ ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
368
364
 
369
365
  // ........................................................
366
+
370
367
  // Present mode
368
+
371
369
  // ........................................................
370
+
372
371
  // Present mode
372
+
373
373
  protected boolean presentMode = false;
374
374
  protected boolean showStopButton = true;
375
375
  public float presentX;
@@ -396,13 +396,32 @@ public abstract class PGL {
396
396
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0,
397
397
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0};
398
398
 
399
+
399
400
  ///////////////////////////////////////////////////////////////
401
+
400
402
  // Initialization, finalization
403
+
404
+
401
405
  public PGL() {
406
+ this.renderCallback = () -> {};
402
407
  }
403
408
 
409
+
404
410
  public PGL(PGraphicsOpenGL pg) {
405
411
  this.graphics = pg;
412
+ this.renderCallback = () -> {};
413
+ initGraphics();
414
+ }
415
+
416
+
417
+ public PGL(PGraphicsOpenGL pg, RenderCallback newCallback) {
418
+ this.graphics = pg;
419
+ this.renderCallback = newCallback;
420
+ initGraphics();
421
+ }
422
+
423
+
424
+ private void initGraphics() {
406
425
  if (glColorTex == null) {
407
426
  glColorFbo = allocateIntBuffer(1);
408
427
  glColorTex = allocateIntBuffer(2);
@@ -422,14 +441,17 @@ public abstract class PGL {
422
441
  viewBuffer = allocateIntBuffer(4);
423
442
  }
424
443
 
444
+
425
445
  public void dispose() {
426
446
  destroyFBOLayer();
427
447
  }
428
448
 
449
+
429
450
  public void setPrimary(boolean primary) {
430
451
  primaryPGL = primary;
431
452
  }
432
453
 
454
+
433
455
  static public int smoothToSamples(int smooth) {
434
456
  switch (smooth) {
435
457
  case 0:
@@ -444,85 +466,105 @@ public abstract class PGL {
444
466
  }
445
467
  }
446
468
 
469
+
447
470
  abstract public Object getNative();
448
471
 
472
+
449
473
  abstract protected void setFrameRate(float fps);
450
474
 
475
+
451
476
  abstract protected void initSurface(int antialias);
452
477
 
478
+
453
479
  abstract protected void reinitSurface();
454
480
 
481
+
455
482
  abstract protected void registerListeners();
456
483
 
457
- protected int getReadFramebuffer() {
484
+
485
+ abstract protected PImage screenshot();
486
+
487
+
488
+ protected int getReadFramebuffer() {
458
489
  return fboLayerEnabled ? glColorFbo.get(0) : 0;
459
490
  }
460
491
 
461
- protected int getDrawFramebuffer() {
462
- if (fboLayerEnabled) {
463
- return 1 < numSamples ? glMultiFbo.get(0)
464
- : glColorFbo.get(0);
465
- } else {
466
- return 0;
467
- }
492
+
493
+ protected int getDrawFramebuffer() {
494
+ if (fboLayerEnabled) return 1 < numSamples ? glMultiFbo.get(0) :
495
+ glColorFbo.get(0);
496
+ else return 0;
468
497
  }
469
498
 
470
- protected int getDefaultDrawBuffer() {
499
+
500
+ protected int getDefaultDrawBuffer() {
471
501
  return fboLayerEnabled ? COLOR_ATTACHMENT0 : BACK;
472
502
  }
473
503
 
474
- protected int getDefaultReadBuffer() {
504
+
505
+ protected int getDefaultReadBuffer() {
475
506
  return fboLayerEnabled ? COLOR_ATTACHMENT0 : FRONT;
476
507
  }
477
508
 
478
- protected boolean isFBOBacked() {;
509
+
510
+ protected boolean isFBOBacked() {
479
511
  return fboLayerEnabled;
480
512
  }
481
513
 
514
+
482
515
  @Deprecated
483
516
  public void requestFBOLayer() {
484
517
  enableFBOLayer();
485
518
  }
486
519
 
520
+
487
521
  public void enableFBOLayer() {
488
522
  fboLayerEnabledReq = true;
489
523
  }
490
524
 
525
+
491
526
  public void disableFBOLayer() {
492
527
  fboLayerDisableReq = true;
493
528
  }
494
529
 
530
+
495
531
  public void resetFBOLayer() {
496
532
  fbolayerResetReq = true;
497
533
  }
498
534
 
535
+
499
536
  protected boolean isMultisampled() {
500
537
  return 1 < numSamples;
501
538
  }
502
539
 
540
+
503
541
  abstract protected int getDepthBits();
504
542
 
543
+
505
544
  abstract protected int getStencilBits();
506
545
 
546
+
507
547
  protected boolean getDepthTest() {
508
548
  intBuffer.rewind();
509
549
  getBooleanv(DEPTH_TEST, intBuffer);
510
- return intBuffer.get(0) != 0;
550
+ return intBuffer.get(0) == 0 ? false : true;
511
551
  }
512
552
 
553
+
513
554
  protected boolean getDepthWriteMask() {
514
555
  intBuffer.rewind();
515
556
  getBooleanv(DEPTH_WRITEMASK, intBuffer);
516
- return intBuffer.get(0) != 0;
557
+ return intBuffer.get(0) == 0 ? false : true;
517
558
  }
518
559
 
560
+
519
561
  protected Texture wrapBackTexture(Texture texture) {
520
562
  if (texture == null) {
521
563
  texture = new Texture(graphics);
522
564
  texture.init(graphics.width, graphics.height,
523
- glColorTex.get(backTex), TEXTURE_2D, RGBA,
524
- fboWidth, fboHeight, NEAREST, NEAREST,
525
- CLAMP_TO_EDGE, CLAMP_TO_EDGE);
565
+ glColorTex.get(backTex), TEXTURE_2D, RGBA,
566
+ fboWidth, fboHeight, NEAREST, NEAREST,
567
+ CLAMP_TO_EDGE, CLAMP_TO_EDGE);
526
568
  texture.invertedY(true);
527
569
  texture.colorBuffer(true);
528
570
  graphics.setCache(graphics, texture);
@@ -532,13 +574,14 @@ public abstract class PGL {
532
574
  return texture;
533
575
  }
534
576
 
535
- protected Texture wrapFrontTexture(Texture texture) {
577
+
578
+ protected Texture wrapFrontTexture(Texture texture) {
536
579
  if (texture == null) {
537
580
  texture = new Texture(graphics);
538
581
  texture.init(graphics.width, graphics.height,
539
- glColorTex.get(frontTex), TEXTURE_2D, RGBA,
540
- fboWidth, fboHeight, NEAREST, NEAREST,
541
- CLAMP_TO_EDGE, CLAMP_TO_EDGE);
582
+ glColorTex.get(frontTex), TEXTURE_2D, RGBA,
583
+ fboWidth, fboHeight, NEAREST, NEAREST,
584
+ CLAMP_TO_EDGE, CLAMP_TO_EDGE);
542
585
  texture.invertedY(true);
543
586
  texture.colorBuffer(true);
544
587
  } else {
@@ -547,6 +590,7 @@ public abstract class PGL {
547
590
  return texture;
548
591
  }
549
592
 
593
+
550
594
  protected void bindFrontTexture() {
551
595
  usingFrontTex = true;
552
596
  if (!texturingIsEnabled(TEXTURE_2D)) {
@@ -555,6 +599,7 @@ public abstract class PGL {
555
599
  bindTexture(TEXTURE_2D, glColorTex.get(frontTex));
556
600
  }
557
601
 
602
+
558
603
  protected void unbindFrontTexture() {
559
604
  if (textureIsBound(TEXTURE_2D, glColorTex.get(frontTex))) {
560
605
  // We don't want to unbind another texture
@@ -569,10 +614,9 @@ public abstract class PGL {
569
614
  }
570
615
  }
571
616
 
617
+
572
618
  protected void syncBackTexture() {
573
- if (usingFrontTex) {
574
- needSepFrontTex = true;
575
- }
619
+ if (usingFrontTex) needSepFrontTex = true;
576
620
  if (1 < numSamples) {
577
621
  bindFramebufferImpl(READ_FRAMEBUFFER, glMultiFbo.get(0));
578
622
  bindFramebufferImpl(DRAW_FRAMEBUFFER, glColorFbo.get(0));
@@ -581,15 +625,19 @@ public abstract class PGL {
581
625
  mask |= DEPTH_BUFFER_BIT | STENCIL_BUFFER_BIT;
582
626
  }
583
627
  blitFramebuffer(0, 0, fboWidth, fboHeight,
584
- 0, 0, fboWidth, fboHeight,
585
- mask, NEAREST);
628
+ 0, 0, fboWidth, fboHeight,
629
+ mask, NEAREST);
586
630
  }
587
631
  }
588
632
 
633
+
589
634
  abstract protected float getPixelScale();
590
635
 
591
636
  ///////////////////////////////////////////////////////////
637
+
592
638
  // Present mode
639
+
640
+
593
641
  public void initPresentMode(float x, float y, int stopColor) {
594
642
  presentMode = true;
595
643
  showStopButton = stopColor != 0;
@@ -599,28 +647,34 @@ public abstract class PGL {
599
647
  enableFBOLayer();
600
648
  }
601
649
 
650
+
602
651
  public boolean presentMode() {
603
652
  return presentMode;
604
653
  }
605
654
 
655
+
606
656
  public float presentX() {
607
657
  return presentX;
608
658
  }
609
659
 
660
+
610
661
  public float presentY() {
611
662
  return presentY;
612
663
  }
613
664
 
665
+
614
666
  public boolean insideStopButton(float x, float y) {
615
- if (!showStopButton) {
616
- return false;
617
- }
618
- return stopButtonX < x && x < stopButtonX + stopButtonWidth
619
- && -(closeButtonY + stopButtonHeight) < y && y < -closeButtonY;
667
+ if (!showStopButton) return false;
668
+ return stopButtonX < x && x < stopButtonX + stopButtonWidth &&
669
+ -(closeButtonY + stopButtonHeight) < y && y < -closeButtonY;
620
670
  }
621
671
 
672
+
622
673
  ///////////////////////////////////////////////////////////
674
+
623
675
  // Frame rendering
676
+
677
+
624
678
  protected void clearDepthStencil() {
625
679
  if (!pclearDepth && !pclearStencil) {
626
680
  depthMask(true);
@@ -637,8 +691,9 @@ public abstract class PGL {
637
691
  }
638
692
  }
639
693
 
694
+
640
695
  protected void clearBackground(float r, float g, float b, float a,
641
- boolean depth, boolean stencil) {
696
+ boolean depth, boolean stencil) {
642
697
  clearColor(r, g, b, a);
643
698
  if (depth && stencil) {
644
699
  clearDepth(1);
@@ -668,6 +723,7 @@ public abstract class PGL {
668
723
  }
669
724
  }
670
725
 
726
+
671
727
  protected void beginRender() {
672
728
  if (sketch == null) {
673
729
  sketch = graphics.parent;
@@ -706,7 +762,7 @@ public abstract class PGL {
706
762
  // Draw to the back texture
707
763
  bindFramebufferImpl(FRAMEBUFFER, glColorFbo.get(0));
708
764
  framebufferTexture2D(FRAMEBUFFER, COLOR_ATTACHMENT0,
709
- TEXTURE_2D, glColorTex.get(backTex), 0);
765
+ TEXTURE_2D, glColorTex.get(backTex), 0);
710
766
 
711
767
  if (1 < numSamples) {
712
768
  bindFramebufferImpl(FRAMEBUFFER, glMultiFbo.get(0));
@@ -727,18 +783,19 @@ public abstract class PGL {
727
783
  int x = 0;
728
784
  int y = 0;
729
785
  if (presentMode) {
730
- x = (int) presentX;
731
- y = (int) presentY;
786
+ x = (int)presentX;
787
+ y = (int)presentY;
732
788
  }
733
789
  float scale = getPixelScale();
734
790
  drawTexture(TEXTURE_2D, glColorTex.get(frontTex), fboWidth, fboHeight,
735
- x, y, graphics.width, graphics.height,
736
- 0, 0, (int) (scale * graphics.width), (int) (scale * graphics.height),
737
- 0, 0, graphics.width, graphics.height);
791
+ x, y, graphics.width, graphics.height,
792
+ 0, 0, (int)(scale * graphics.width), (int)(scale * graphics.height),
793
+ 0, 0, graphics.width, graphics.height);
738
794
  }
739
795
  }
740
796
  }
741
797
 
798
+
742
799
  protected void endRender(int windowColor) {
743
800
  if (fboLayerEnabled) {
744
801
  syncBackTexture();
@@ -747,7 +804,7 @@ public abstract class PGL {
747
804
  bindFramebufferImpl(FRAMEBUFFER, 0);
748
805
 
749
806
  if (presentMode) {
750
- float wa = ((windowColor >> 24) & 0xff) / 255.0f;
807
+ float wa = ((windowColor >> 24) & 0xff) / 255.0f;
751
808
  float wr = ((windowColor >> 16) & 0xff) / 255.0f;
752
809
  float wg = ((windowColor >> 8) & 0xff) / 255.0f;
753
810
  float wb = (windowColor & 0xff) / 255.0f;
@@ -769,17 +826,18 @@ public abstract class PGL {
769
826
  int[] color = new int[closeButtonPix.length];
770
827
  PApplet.arrayCopy(closeButtonPix, color);
771
828
 
829
+
772
830
  // Multiply the texture by the button color
773
831
  float ba = ((stopButtonColor >> 24) & 0xFF) / 255f;
774
832
  float br = ((stopButtonColor >> 16) & 0xFF) / 255f;
775
- float bg = ((stopButtonColor >> 8) & 0xFF) / 255f;
833
+ float bg = ((stopButtonColor >> 8) & 0xFF) / 255f;
776
834
  float bb = ((stopButtonColor) & 0xFF) / 255f;
777
835
  for (int i = 0; i < color.length; i++) {
778
836
  int c = closeButtonPix[i];
779
- int a = (int) (ba * ((c >> 24) & 0xFF));
780
- int r = (int) (br * ((c >> 16) & 0xFF));
781
- int g = (int) (bg * ((c >> 8) & 0xFF));
782
- int b = (int) (bb * ((c) & 0xFF));
837
+ int a = (int)(ba * ((c >> 24) & 0xFF));
838
+ int r = (int)(br * ((c >> 16) & 0xFF));
839
+ int g = (int)(bg * ((c >> 8) & 0xFF));
840
+ int b = (int)(bb * ((c) & 0xFF));
783
841
  color[i] = javaToNativeARGB((a << 24) | (r << 16) | (g << 8) | b);
784
842
  }
785
843
  IntBuffer buf = allocateIntBuffer(color);
@@ -787,10 +845,10 @@ public abstract class PGL {
787
845
  bindTexture(TEXTURE_2D, 0);
788
846
  }
789
847
  drawTexture(TEXTURE_2D, closeButtonTex.get(0), stopButtonWidth, stopButtonHeight,
790
- 0, 0, stopButtonX + stopButtonWidth, closeButtonY + stopButtonHeight,
791
- 0, stopButtonHeight, stopButtonWidth, 0,
792
- stopButtonX, closeButtonY, stopButtonX + stopButtonWidth, closeButtonY + stopButtonHeight);
793
- }
848
+ 0, 0, stopButtonX + stopButtonWidth, closeButtonY + stopButtonHeight,
849
+ 0, stopButtonHeight, stopButtonWidth, 0,
850
+ stopButtonX, closeButtonY, stopButtonX + stopButtonWidth, closeButtonY + stopButtonHeight);
851
+ }
794
852
  } else {
795
853
  clearDepth(1);
796
854
  clearColor(0, 0, 0, 0);
@@ -802,15 +860,15 @@ public abstract class PGL {
802
860
  int x = 0;
803
861
  int y = 0;
804
862
  if (presentMode) {
805
- x = (int) presentX;
806
- y = (int) presentY;
863
+ x = (int)presentX;
864
+ y = (int)presentY;
807
865
  }
808
866
  float scale = getPixelScale();
809
867
  drawTexture(TEXTURE_2D, glColorTex.get(backTex),
810
- fboWidth, fboHeight,
811
- x, y, graphics.width, graphics.height,
812
- 0, 0, (int) (scale * graphics.width), (int) (scale * graphics.height),
813
- 0, 0, graphics.width, graphics.height);
868
+ fboWidth, fboHeight,
869
+ x, y, graphics.width, graphics.height,
870
+ 0, 0, (int)(scale * graphics.width), (int)(scale * graphics.height),
871
+ 0, 0, graphics.width, graphics.height);
814
872
 
815
873
  // Swapping front and back textures.
816
874
  int temp = frontTex;
@@ -826,48 +884,60 @@ public abstract class PGL {
826
884
  saveFirstFrame();
827
885
  }
828
886
 
829
- if (!clearColor && 0 < sketch.frameCount || !sketch.isLooping()) {
830
- enableFBOLayer();
831
- if (SINGLE_BUFFERED) {
832
- createFBOLayer();
887
+ if (isFboAllowed()) {
888
+ if (!clearColor && 0 < sketch.frameCount || !sketch.isLooping()) {
889
+ enableFBOLayer();
890
+ if (SINGLE_BUFFERED) {
891
+ createFBOLayer();
892
+ }
833
893
  }
834
894
  }
835
895
  }
896
+
897
+ renderCallback.onRender();
836
898
  }
837
899
 
900
+
838
901
  protected abstract void getGL(PGL pgl);
839
902
 
903
+
840
904
  protected abstract boolean canDraw();
841
905
 
906
+
842
907
  protected abstract void requestFocus();
843
908
 
909
+
844
910
  protected abstract void requestDraw();
845
911
 
912
+
846
913
  protected abstract void swapBuffers();
847
914
 
848
- public boolean threadIsCurrent() {
915
+
916
+ public boolean threadIsCurrent() {
849
917
  return Thread.currentThread() == glThread;
850
918
  }
851
919
 
920
+
852
921
  public void setThread(Thread thread) {
853
922
  glThread = thread;
854
923
  }
855
924
 
856
- protected void beginGL() {
857
- }
858
925
 
859
- protected void endGL() {
860
- }
926
+ protected void beginGL() { }
927
+
928
+
929
+ protected void endGL() { }
930
+
861
931
 
862
932
  private void createFBOLayer() {
863
933
  float scale = getPixelScale();
864
934
 
865
935
  if (hasNpotTexSupport()) {
866
- fboWidth = (int) (scale * graphics.width);
867
- fboHeight = (int) (scale * graphics.height);
936
+ fboWidth = (int)(scale * graphics.width);
937
+ fboHeight = (int)(scale * graphics.height);
868
938
  } else {
869
- fboWidth = nextPowerOfTwo((int) (scale * graphics.width));
870
- fboHeight = nextPowerOfTwo((int) (scale * graphics.height));
939
+ fboWidth = nextPowerOfTwo((int)(scale * graphics.width));
940
+ fboHeight = nextPowerOfTwo((int)(scale * graphics.height));
871
941
  }
872
942
 
873
943
  if (hasFboMultisampleSupport()) {
@@ -890,7 +960,7 @@ public abstract class PGL {
890
960
  texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);
891
961
  texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);
892
962
  texImage2D(TEXTURE_2D, 0, RGBA, fboWidth, fboHeight, 0,
893
- RGBA, UNSIGNED_BYTE, null);
963
+ RGBA, UNSIGNED_BYTE, null);
894
964
  initTexture(TEXTURE_2D, RGBA, fboWidth, fboHeight, graphics.backgroundColor);
895
965
  }
896
966
  bindTexture(TEXTURE_2D, 0);
@@ -901,7 +971,7 @@ public abstract class PGL {
901
971
  genFramebuffers(1, glColorFbo);
902
972
  bindFramebufferImpl(FRAMEBUFFER, glColorFbo.get(0));
903
973
  framebufferTexture2D(FRAMEBUFFER, COLOR_ATTACHMENT0, TEXTURE_2D,
904
- glColorTex.get(backTex), 0);
974
+ glColorTex.get(backTex), 0);
905
975
 
906
976
  if (!multisample || graphics.getHint(PConstants.ENABLE_BUFFER_READING)) {
907
977
  // If not multisampled, this is the only depth and stencil buffer.
@@ -919,9 +989,9 @@ public abstract class PGL {
919
989
  genRenderbuffers(1, glMultiColor);
920
990
  bindRenderbuffer(RENDERBUFFER, glMultiColor.get(0));
921
991
  renderbufferStorageMultisample(RENDERBUFFER, numSamples,
922
- RGBA8, fboWidth, fboHeight);
992
+ RGBA8, fboWidth, fboHeight);
923
993
  framebufferRenderbuffer(FRAMEBUFFER, COLOR_ATTACHMENT0,
924
- RENDERBUFFER, glMultiColor.get(0));
994
+ RENDERBUFFER, glMultiColor.get(0));
925
995
 
926
996
  // Creating multisampled depth and stencil buffers
927
997
  createDepthAndStencilBuffer(true, depthBits, stencilBits, packed);
@@ -957,18 +1027,16 @@ public abstract class PGL {
957
1027
 
958
1028
  protected abstract void initFBOLayer();
959
1029
 
1030
+
960
1031
  protected void saveFirstFrame() {
961
1032
  firstFrame = allocateDirectIntBuffer(graphics.width * graphics.height);
962
- if (hasReadBuffer()) {
963
- readBuffer(BACK);
964
- }
1033
+ if (hasReadBuffer()) readBuffer(BACK);
965
1034
  readPixelsImpl(0, 0, graphics.width, graphics.height, RGBA, UNSIGNED_BYTE, firstFrame);
966
1035
  }
967
1036
 
1037
+
968
1038
  protected void restoreFirstFrame() {
969
- if (firstFrame == null) {
970
- return;
971
- }
1039
+ if (firstFrame == null) return;
972
1040
 
973
1041
  IntBuffer tex = allocateIntBuffer(1);
974
1042
  genTextures(1, tex);
@@ -976,11 +1044,11 @@ public abstract class PGL {
976
1044
  int w, h;
977
1045
  float scale = getPixelScale();
978
1046
  if (hasNpotTexSupport()) {
979
- w = (int) (scale * graphics.width);
980
- h = (int) (scale * graphics.height);
1047
+ w = (int)(scale * graphics.width);
1048
+ h = (int)(scale * graphics.height);
981
1049
  } else {
982
- w = nextPowerOfTwo((int) (scale * graphics.width));
983
- h = nextPowerOfTwo((int) (scale * graphics.height));
1050
+ w = nextPowerOfTwo((int)(scale * graphics.width));
1051
+ h = nextPowerOfTwo((int)(scale * graphics.height));
984
1052
  }
985
1053
 
986
1054
  bindTexture(TEXTURE_2D, tex.get(0));
@@ -992,9 +1060,9 @@ public abstract class PGL {
992
1060
  texSubImage2D(TEXTURE_2D, 0, 0, 0, graphics.width, graphics.height, RGBA, UNSIGNED_BYTE, firstFrame);
993
1061
 
994
1062
  drawTexture(TEXTURE_2D, tex.get(0), w, h,
995
- 0, 0, graphics.width, graphics.height,
996
- 0, 0, (int) (scale * graphics.width), (int) (scale * graphics.height),
997
- 0, 0, graphics.width, graphics.height);
1063
+ 0, 0, graphics.width, graphics.height,
1064
+ 0, 0, (int)(scale * graphics.width), (int)(scale * graphics.height),
1065
+ 0, 0, graphics.width, graphics.height);
998
1066
 
999
1067
  deleteTextures(1, tex);
1000
1068
  firstFrame.clear();
@@ -1018,26 +1086,27 @@ public abstract class PGL {
1018
1086
  fboLayerCreated = false;
1019
1087
  }
1020
1088
 
1089
+
1021
1090
  private void createDepthAndStencilBuffer(boolean multisample, int depthBits,
1022
- int stencilBits, boolean packed) {
1091
+ int stencilBits, boolean packed) {
1023
1092
  // Creating depth and stencil buffers
1024
1093
  if (packed && depthBits == 24 && stencilBits == 8) {
1025
1094
  // packed depth+stencil buffer
1026
- IntBuffer depthStencilBuf
1027
- = multisample ? glMultiDepthStencil : glDepthStencil;
1095
+ IntBuffer depthStencilBuf =
1096
+ multisample ? glMultiDepthStencil : glDepthStencil;
1028
1097
  genRenderbuffers(1, depthStencilBuf);
1029
1098
  bindRenderbuffer(RENDERBUFFER, depthStencilBuf.get(0));
1030
1099
  if (multisample) {
1031
1100
  renderbufferStorageMultisample(RENDERBUFFER, numSamples,
1032
- DEPTH24_STENCIL8, fboWidth, fboHeight);
1101
+ DEPTH24_STENCIL8, fboWidth, fboHeight);
1033
1102
  } else {
1034
1103
  renderbufferStorage(RENDERBUFFER, DEPTH24_STENCIL8,
1035
- fboWidth, fboHeight);
1104
+ fboWidth, fboHeight);
1036
1105
  }
1037
1106
  framebufferRenderbuffer(FRAMEBUFFER, DEPTH_ATTACHMENT, RENDERBUFFER,
1038
- depthStencilBuf.get(0));
1107
+ depthStencilBuf.get(0));
1039
1108
  framebufferRenderbuffer(FRAMEBUFFER, STENCIL_ATTACHMENT, RENDERBUFFER,
1040
- depthStencilBuf.get(0));
1109
+ depthStencilBuf.get(0));
1041
1110
  } else {
1042
1111
  // separate depth and stencil buffers
1043
1112
  if (0 < depthBits) {
@@ -1061,13 +1130,13 @@ public abstract class PGL {
1061
1130
  bindRenderbuffer(RENDERBUFFER, depthBuf.get(0));
1062
1131
  if (multisample) {
1063
1132
  renderbufferStorageMultisample(RENDERBUFFER, numSamples,
1064
- depthComponent, fboWidth, fboHeight);
1133
+ depthComponent, fboWidth, fboHeight);
1065
1134
  } else {
1066
1135
  renderbufferStorage(RENDERBUFFER, depthComponent,
1067
- fboWidth, fboHeight);
1136
+ fboWidth, fboHeight);
1068
1137
  }
1069
1138
  framebufferRenderbuffer(FRAMEBUFFER, DEPTH_ATTACHMENT,
1070
- RENDERBUFFER, depthBuf.get(0));
1139
+ RENDERBUFFER, depthBuf.get(0));
1071
1140
  }
1072
1141
 
1073
1142
  if (0 < stencilBits) {
@@ -1091,33 +1160,43 @@ public abstract class PGL {
1091
1160
  bindRenderbuffer(RENDERBUFFER, stencilBuf.get(0));
1092
1161
  if (multisample) {
1093
1162
  renderbufferStorageMultisample(RENDERBUFFER, numSamples,
1094
- stencilIndex, fboWidth, fboHeight);
1163
+ stencilIndex, fboWidth, fboHeight);
1095
1164
  } else {
1096
1165
  renderbufferStorage(RENDERBUFFER, stencilIndex,
1097
- fboWidth, fboHeight);
1166
+ fboWidth, fboHeight);
1098
1167
  }
1099
1168
  framebufferRenderbuffer(FRAMEBUFFER, STENCIL_ATTACHMENT,
1100
- RENDERBUFFER, stencilBuf.get(0));
1169
+ RENDERBUFFER, stencilBuf.get(0));
1101
1170
  }
1102
1171
  }
1103
1172
  }
1104
1173
 
1174
+
1105
1175
  ///////////////////////////////////////////////////////////
1176
+
1106
1177
  // Context interface
1178
+
1179
+
1107
1180
  protected int createEmptyContext() {
1108
1181
  return -1;
1109
1182
  }
1110
1183
 
1184
+
1111
1185
  protected int getCurrentContext() {
1112
1186
  return glContext;
1113
1187
  }
1114
1188
 
1189
+
1115
1190
  ///////////////////////////////////////////////////////////
1191
+
1116
1192
  // Utility functions
1193
+
1194
+
1117
1195
  protected boolean contextIsCurrent(int other) {
1118
1196
  return other == -1 || other == glContext;
1119
1197
  }
1120
1198
 
1199
+
1121
1200
  protected void enableTexturing(int target) {
1122
1201
  if (target == TEXTURE_2D) {
1123
1202
  texturingTargets[0] = true;
@@ -1126,6 +1205,7 @@ public abstract class PGL {
1126
1205
  }
1127
1206
  }
1128
1207
 
1208
+
1129
1209
  protected void disableTexturing(int target) {
1130
1210
  if (target == TEXTURE_2D) {
1131
1211
  texturingTargets[0] = false;
@@ -1134,6 +1214,7 @@ public abstract class PGL {
1134
1214
  }
1135
1215
  }
1136
1216
 
1217
+
1137
1218
  protected boolean texturingIsEnabled(int target) {
1138
1219
  if (target == TEXTURE_2D) {
1139
1220
  return texturingTargets[0];
@@ -1144,10 +1225,9 @@ public abstract class PGL {
1144
1225
  }
1145
1226
  }
1146
1227
 
1228
+
1147
1229
  protected boolean textureIsBound(int target, int id) {
1148
- if (boundTextures == null) {
1149
- return false;
1150
- }
1230
+ if (boundTextures == null) return false;
1151
1231
 
1152
1232
  if (target == TEXTURE_2D) {
1153
1233
  return boundTextures[activeTexUnit][0] == id;
@@ -1158,12 +1238,14 @@ public abstract class PGL {
1158
1238
  }
1159
1239
  }
1160
1240
 
1241
+
1161
1242
  protected void initTexture(int target, int format, int width, int height) {
1162
1243
  initTexture(target, format, width, height, 0);
1163
1244
  }
1164
1245
 
1246
+
1165
1247
  protected void initTexture(int target, int format, int width, int height,
1166
- int initColor) {
1248
+ int initColor) {
1167
1249
  int[] glcolor = new int[16 * 16];
1168
1250
  Arrays.fill(glcolor, javaToNativeARGB(initColor));
1169
1251
  IntBuffer texels = allocateDirectIntBuffer(16 * 16);
@@ -1178,14 +1260,15 @@ public abstract class PGL {
1178
1260
  }
1179
1261
  }
1180
1262
 
1263
+
1181
1264
  protected void copyToTexture(int target, int format, int id, int x, int y,
1182
- int w, int h, int[] buffer) {
1265
+ int w, int h, int[] buffer) {
1183
1266
  copyToTexture(target, format, id, x, y, w, h, IntBuffer.wrap(buffer));
1184
1267
 
1185
1268
  }
1186
1269
 
1187
1270
  protected void copyToTexture(int target, int format, int id, int x, int y,
1188
- int w, int h, IntBuffer buffer) {
1271
+ int w, int h, IntBuffer buffer) {
1189
1272
  activeTexture(TEXTURE0);
1190
1273
  boolean enabledTex = false;
1191
1274
  if (!texturingIsEnabled(target)) {
@@ -1200,50 +1283,54 @@ public abstract class PGL {
1200
1283
  }
1201
1284
  }
1202
1285
 
1286
+
1203
1287
  /**
1204
1288
  * Not an approved function, this will change or be removed in the future.
1205
1289
  */
1206
1290
  public void drawTexture(int target, int id, int width, int height,
1207
- int X0, int Y0, int X1, int Y1) {
1291
+ int X0, int Y0, int X1, int Y1) {
1208
1292
  // If a texture is drawing on a viewport of the same size as its resolution,
1209
1293
  // the pixel factor is 1:1, so we override the surface's pixel factor.
1210
1294
  drawTexture(target, id, width, height,
1211
- 0, 0, width, height, 1,
1212
- X0, Y0, X1, Y1,
1213
- X0, Y0, X1, Y1);
1295
+ 0, 0, width, height, 1,
1296
+ X0, Y0, X1, Y1,
1297
+ X0, Y0, X1, Y1);
1214
1298
  }
1215
1299
 
1300
+
1216
1301
  /**
1217
1302
  * Not an approved function, this will change or be removed in the future.
1218
1303
  */
1219
- public void drawTexture(int target, int id, int texW, int texH,
1220
- int viewX, int viewY, int viewW, int viewH,
1221
- int texX0, int texY0, int texX1, int texY1,
1222
- int scrX0, int scrY0, int scrX1, int scrY1) {
1223
- int viewF = (int) getPixelScale();
1304
+ public void drawTexture(int target, int id,int texW, int texH,
1305
+ int viewX, int viewY, int viewW, int viewH,
1306
+ int texX0, int texY0, int texX1, int texY1,
1307
+ int scrX0, int scrY0, int scrX1, int scrY1) {
1308
+ int viewF = (int)getPixelScale();
1224
1309
  drawTexture(target, id, texW, texH,
1225
- viewX, viewY, viewW, viewH, viewF,
1226
- texX0, texY0, texX1, texY1,
1227
- scrX0, scrY0, scrX1, scrY1);
1310
+ viewX, viewY, viewW, viewH, viewF,
1311
+ texX0, texY0, texX1, texY1,
1312
+ scrX0, scrY0, scrX1, scrY1);
1228
1313
  }
1229
1314
 
1230
- public void drawTexture(int target, int id, int texW, int texH,
1231
- int viewX, int viewY, int viewW, int viewH, int viewF,
1232
- int texX0, int texY0, int texX1, int texY1,
1233
- int scrX0, int scrY0, int scrX1, int scrY1) {
1315
+
1316
+ public void drawTexture(int target, int id,int texW, int texH,
1317
+ int viewX, int viewY, int viewW, int viewH, int viewF,
1318
+ int texX0, int texY0, int texX1, int texY1,
1319
+ int scrX0, int scrY0, int scrX1, int scrY1) {
1234
1320
  if (target == TEXTURE_2D) {
1235
1321
  drawTexture2D(id, texW, texH,
1236
- viewX, viewY, viewW, viewH, viewF,
1237
- texX0, texY0, texX1, texY1,
1238
- scrX0, scrY0, scrX1, scrY1);
1322
+ viewX, viewY, viewW, viewH, viewF,
1323
+ texX0, texY0, texX1, texY1,
1324
+ scrX0, scrY0, scrX1, scrY1);
1239
1325
  } else if (target == TEXTURE_RECTANGLE) {
1240
1326
  drawTextureRect(id, texW, texH,
1241
- viewX, viewY, viewW, viewH, viewF,
1242
- texX0, texY0, texX1, texY1,
1243
- scrX0, scrY0, scrX1, scrY1);
1327
+ viewX, viewY, viewW, viewH, viewF,
1328
+ texX0, texY0, texX1, texY1,
1329
+ scrX0, scrY0, scrX1, scrY1);
1244
1330
  }
1245
1331
  }
1246
1332
 
1333
+
1247
1334
  protected PGL initTex2DShader() {
1248
1335
  PGL ppgl = primaryPGL ? this : graphics.getPrimaryPGL();
1249
1336
 
@@ -1278,10 +1365,11 @@ public abstract class PGL {
1278
1365
  return ppgl;
1279
1366
  }
1280
1367
 
1368
+
1281
1369
  protected void drawTexture2D(int id, int texW, int texH,
1282
- int viewX, int viewY, int viewW, int viewH, int viewF,
1283
- int texX0, int texY0, int texX1, int texY1,
1284
- int scrX0, int scrY0, int scrX1, int scrY1) {
1370
+ int viewX, int viewY, int viewW, int viewH, int viewF,
1371
+ int texX0, int texY0, int texX1, int texY1,
1372
+ int scrX0, int scrY0, int scrX1, int scrY1) {
1285
1373
  PGL ppgl = initTex2DShader();
1286
1374
 
1287
1375
  if (0 < ppgl.tex2DShaderProgram) {
@@ -1309,25 +1397,25 @@ public abstract class PGL {
1309
1397
  // Vertex coordinates of the textured quad are specified
1310
1398
  // in normalized screen space (-1, 1):
1311
1399
  // Corner 1
1312
- texCoords[0] = 2 * (float) scrX0 / viewW - 1;
1313
- texCoords[1] = 2 * (float) scrY0 / viewH - 1;
1314
- texCoords[2] = (float) texX0 / texW;
1315
- texCoords[3] = (float) texY0 / texH;
1400
+ texCoords[ 0] = 2 * (float)scrX0 / viewW - 1;
1401
+ texCoords[ 1] = 2 * (float)scrY0 / viewH - 1;
1402
+ texCoords[ 2] = (float)texX0 / texW;
1403
+ texCoords[ 3] = (float)texY0 / texH;
1316
1404
  // Corner 2
1317
- texCoords[4] = 2 * (float) scrX1 / viewW - 1;
1318
- texCoords[5] = 2 * (float) scrY0 / viewH - 1;
1319
- texCoords[6] = (float) texX1 / texW;
1320
- texCoords[7] = (float) texY0 / texH;
1405
+ texCoords[ 4] = 2 * (float)scrX1 / viewW - 1;
1406
+ texCoords[ 5] = 2 * (float)scrY0 / viewH - 1;
1407
+ texCoords[ 6] = (float)texX1 / texW;
1408
+ texCoords[ 7] = (float)texY0 / texH;
1321
1409
  // Corner 3
1322
- texCoords[8] = 2 * (float) scrX0 / viewW - 1;
1323
- texCoords[9] = 2 * (float) scrY1 / viewH - 1;
1324
- texCoords[10] = (float) texX0 / texW;
1325
- texCoords[11] = (float) texY1 / texH;
1410
+ texCoords[ 8] = 2 * (float)scrX0 / viewW - 1;
1411
+ texCoords[ 9] = 2 * (float)scrY1 / viewH - 1;
1412
+ texCoords[10] = (float)texX0 / texW;
1413
+ texCoords[11] = (float)texY1 / texH;
1326
1414
  // Corner 4
1327
- texCoords[12] = 2 * (float) scrX1 / viewW - 1;
1328
- texCoords[13] = 2 * (float) scrY1 / viewH - 1;
1329
- texCoords[14] = (float) texX1 / texW;
1330
- texCoords[15] = (float) texY1 / texH;
1415
+ texCoords[12] = 2 * (float)scrX1 / viewW - 1;
1416
+ texCoords[13] = 2 * (float)scrY1 / viewH - 1;
1417
+ texCoords[14] = (float)texX1 / texW;
1418
+ texCoords[15] = (float)texY1 / texH;
1331
1419
 
1332
1420
  texData.rewind();
1333
1421
  texData.put(texCoords);
@@ -1370,10 +1458,11 @@ public abstract class PGL {
1370
1458
  depthMask(depthMask);
1371
1459
 
1372
1460
  viewportImpl(viewBuffer.get(0), viewBuffer.get(1),
1373
- viewBuffer.get(2), viewBuffer.get(3));
1461
+ viewBuffer.get(2), viewBuffer.get(3));
1374
1462
  }
1375
1463
  }
1376
1464
 
1465
+
1377
1466
  protected PGL initTexRectShader() {
1378
1467
  PGL ppgl = primaryPGL ? this : graphics.getPrimaryPGL();
1379
1468
 
@@ -1386,7 +1475,7 @@ public abstract class PGL {
1386
1475
  ppgl.texRectFragShader = createShader(FRAGMENT_SHADER, fragSource);
1387
1476
  if (0 < ppgl.texRectVertShader && 0 < ppgl.texRectFragShader) {
1388
1477
  ppgl.texRectShaderProgram = createProgram(ppgl.texRectVertShader,
1389
- ppgl.texRectFragShader);
1478
+ ppgl.texRectFragShader);
1390
1479
  }
1391
1480
  if (0 < ppgl.texRectShaderProgram) {
1392
1481
  ppgl.texRectVertLoc = getAttribLocation(ppgl.texRectShaderProgram, "position");
@@ -1405,10 +1494,11 @@ public abstract class PGL {
1405
1494
  return ppgl;
1406
1495
  }
1407
1496
 
1497
+
1408
1498
  protected void drawTextureRect(int id, int texW, int texH,
1409
- int viewX, int viewY, int viewW, int viewH, int viewF,
1410
- int texX0, int texY0, int texX1, int texY1,
1411
- int scrX0, int scrY0, int scrX1, int scrY1) {
1499
+ int viewX, int viewY, int viewW, int viewH, int viewF,
1500
+ int texX0, int texY0, int texX1, int texY1,
1501
+ int scrX0, int scrY0, int scrX1, int scrY1) {
1412
1502
  PGL ppgl = initTexRectShader();
1413
1503
 
1414
1504
  if (texData == null) {
@@ -1440,23 +1530,23 @@ public abstract class PGL {
1440
1530
  // Vertex coordinates of the textured quad are specified
1441
1531
  // in normalized screen space (-1, 1):
1442
1532
  // Corner 1
1443
- texCoords[0] = 2 * (float) scrX0 / viewW - 1;
1444
- texCoords[1] = 2 * (float) scrY0 / viewH - 1;
1445
- texCoords[2] = texX0;
1446
- texCoords[3] = texY0;
1533
+ texCoords[ 0] = 2 * (float)scrX0 / viewW - 1;
1534
+ texCoords[ 1] = 2 * (float)scrY0 / viewH - 1;
1535
+ texCoords[ 2] = texX0;
1536
+ texCoords[ 3] = texY0;
1447
1537
  // Corner 2
1448
- texCoords[4] = 2 * (float) scrX1 / viewW - 1;
1449
- texCoords[5] = 2 * (float) scrY0 / viewH - 1;
1450
- texCoords[6] = texX1;
1451
- texCoords[7] = texY0;
1538
+ texCoords[ 4] = 2 * (float)scrX1 / viewW - 1;
1539
+ texCoords[ 5] = 2 * (float)scrY0 / viewH - 1;
1540
+ texCoords[ 6] = texX1;
1541
+ texCoords[ 7] = texY0;
1452
1542
  // Corner 3
1453
- texCoords[8] = 2 * (float) scrX0 / viewW - 1;
1454
- texCoords[9] = 2 * (float) scrY1 / viewH - 1;
1543
+ texCoords[ 8] = 2 * (float)scrX0 / viewW - 1;
1544
+ texCoords[ 9] = 2 * (float)scrY1 / viewH - 1;
1455
1545
  texCoords[10] = texX0;
1456
1546
  texCoords[11] = texY1;
1457
1547
  // Corner 4
1458
- texCoords[12] = 2 * (float) scrX1 / viewW - 1;
1459
- texCoords[13] = 2 * (float) scrY1 / viewH - 1;
1548
+ texCoords[12] = 2 * (float)scrX1 / viewW - 1;
1549
+ texCoords[13] = 2 * (float)scrY1 / viewH - 1;
1460
1550
  texCoords[14] = texX1;
1461
1551
  texCoords[15] = texY1;
1462
1552
 
@@ -1501,59 +1591,62 @@ public abstract class PGL {
1501
1591
  depthMask(depthMask);
1502
1592
 
1503
1593
  viewportImpl(viewBuffer.get(0), viewBuffer.get(1),
1504
- viewBuffer.get(2), viewBuffer.get(3));
1594
+ viewBuffer.get(2), viewBuffer.get(3));
1505
1595
  }
1506
1596
  }
1507
1597
 
1598
+
1508
1599
  protected int getColorValue(int scrX, int scrY) {
1509
1600
  if (colorBuffer == null) {
1510
1601
  colorBuffer = IntBuffer.allocate(1);
1511
1602
  }
1512
1603
  colorBuffer.rewind();
1513
1604
  readPixels(scrX, graphics.height - scrY - 1, 1, 1, RGBA, UNSIGNED_BYTE,
1514
- colorBuffer);
1605
+ colorBuffer);
1515
1606
  return colorBuffer.get();
1516
1607
  }
1517
1608
 
1609
+
1518
1610
  protected float getDepthValue(int scrX, int scrY) {
1519
1611
  if (depthBuffer == null) {
1520
1612
  depthBuffer = FloatBuffer.allocate(1);
1521
1613
  }
1522
1614
  depthBuffer.rewind();
1523
1615
  readPixels(scrX, graphics.height - scrY - 1, 1, 1, DEPTH_COMPONENT, FLOAT,
1524
- depthBuffer);
1616
+ depthBuffer);
1525
1617
  return depthBuffer.get(0);
1526
1618
  }
1527
1619
 
1620
+
1528
1621
  protected byte getStencilValue(int scrX, int scrY) {
1529
1622
  if (stencilBuffer == null) {
1530
1623
  stencilBuffer = ByteBuffer.allocate(1);
1531
1624
  }
1532
1625
  stencilBuffer.rewind();
1533
1626
  readPixels(scrX, graphics.height - scrY - 1, 1, 1, STENCIL_INDEX,
1534
- UNSIGNED_BYTE, stencilBuffer);
1627
+ UNSIGNED_BYTE, stencilBuffer);
1535
1628
  return stencilBuffer.get(0);
1536
1629
  }
1537
1630
 
1631
+
1538
1632
  protected static boolean isPowerOfTwo(int val) {
1539
1633
  return (val & (val - 1)) == 0;
1540
1634
  }
1541
1635
 
1636
+
1542
1637
  // bit shifting this might be more efficient
1543
1638
  protected static int nextPowerOfTwo(int val) {
1544
1639
  int ret = 1;
1545
- while (ret < val) {
1546
- ret <<= 1;
1547
- }
1640
+ while (ret < val) ret <<= 1;
1548
1641
  return ret;
1549
1642
  }
1550
1643
 
1644
+
1551
1645
  /**
1552
1646
  * Converts input native OpenGL value (RGBA on big endian, ABGR on little
1553
1647
  * endian) to Java ARGB.
1554
- *
1555
1648
  * @param color
1556
- * @return
1649
+ * @return
1557
1650
  */
1558
1651
  protected static int nativeToJavaARGB(int color) {
1559
1652
  if (BIG_ENDIAN) { // RGBA to ARGB
@@ -1564,15 +1657,12 @@ public abstract class PGL {
1564
1657
  }
1565
1658
  }
1566
1659
 
1660
+
1567
1661
  /**
1568
1662
  * Converts input array of native OpenGL values (RGBA on big endian, ABGR on
1569
1663
  * little endian) representing an image of width x height resolution to Java
1570
- * ARGB.It also rearranges the elements in the array so that the image is
1664
+ * ARGB. It also rearranges the elements in the array so that the image is
1571
1665
  * flipped vertically.
1572
- *
1573
- * @param pixels
1574
- * @param width
1575
- * @param height
1576
1666
  */
1577
1667
  protected static void nativeToJavaARGB(int[] pixels, int width, int height) {
1578
1668
  int index = 0;
@@ -1611,34 +1701,29 @@ public abstract class PGL {
1611
1701
  }
1612
1702
  }
1613
1703
 
1704
+
1614
1705
  /**
1615
1706
  * Converts input native OpenGL value (RGBA on big endian, ABGR on little
1616
- * endian) to Java RGB, so that the alpha component of the result is set to
1617
- * opaque (255).
1618
- *
1619
- * @param color
1620
- * @return
1707
+ * endian) to Java RGB, so that the alpha component of the result is set
1708
+ * to opaque (255).
1621
1709
  */
1622
1710
  protected static int nativeToJavaRGB(int color) {
1623
1711
  if (BIG_ENDIAN) { // RGBA to ARGB
1624
1712
  return (color >>> 8) | 0xFF000000;
1625
1713
  } else { // ABGR to ARGB
1626
1714
  int rb = color & 0x00FF00FF;
1627
- return 0xFF000000 | (rb << 16)
1628
- | (color & 0x0000FF00) | (rb >> 16);
1715
+ return 0xFF000000 | (rb << 16) |
1716
+ (color & 0x0000FF00) | (rb >> 16);
1629
1717
  }
1630
1718
  }
1631
1719
 
1720
+
1632
1721
  /**
1633
1722
  * Converts input array of native OpenGL values (RGBA on big endian, ABGR on
1634
1723
  * little endian) representing an image of width x height resolution to Java
1635
- * RGB, so that the alpha component of all pixels is set to opaque (255).It
1724
+ * RGB, so that the alpha component of all pixels is set to opaque (255). It
1636
1725
  * also rearranges the elements in the array so that the image is flipped
1637
1726
  * vertically.
1638
- *
1639
- * @param pixels
1640
- * @param width
1641
- * @param height
1642
1727
  */
1643
1728
  protected static void nativeToJavaRGB(int[] pixels, int width, int height) {
1644
1729
  int index = 0;
@@ -1653,10 +1738,10 @@ public abstract class PGL {
1653
1738
  } else { // ABGR to ARGB
1654
1739
  int rbi = pixi & 0x00FF00FF;
1655
1740
  int rby = pixy & 0x00FF00FF;
1656
- pixels[index] = 0xFF000000 | (rby << 16)
1657
- | (pixy & 0x0000FF00) | (rby >> 16);
1658
- pixels[yindex] = 0xFF000000 | (rbi << 16)
1659
- | (pixi & 0x0000FF00) | (rbi >> 16);
1741
+ pixels[index] = 0xFF000000 | (rby << 16) |
1742
+ (pixy & 0x0000FF00) | (rby >> 16);
1743
+ pixels[yindex] = 0xFF000000 | (rbi << 16) |
1744
+ (pixi & 0x0000FF00) | (rbi >> 16);
1660
1745
  }
1661
1746
  index++;
1662
1747
  yindex++;
@@ -1672,20 +1757,18 @@ public abstract class PGL {
1672
1757
  pixels[index] = (pixi >>> 8) | 0xFF000000;
1673
1758
  } else { // ABGR to ARGB
1674
1759
  int rbi = pixi & 0x00FF00FF;
1675
- pixels[index] = 0xFF000000 | (rbi << 16)
1676
- | (pixi & 0x000FF00) | (rbi >> 16);
1760
+ pixels[index] = 0xFF000000 | (rbi << 16) |
1761
+ (pixi & 0x000FF00) | (rbi >> 16);
1677
1762
  }
1678
1763
  index++;
1679
1764
  }
1680
1765
  }
1681
1766
  }
1682
1767
 
1768
+
1683
1769
  /**
1684
1770
  * Converts input Java ARGB value to native OpenGL format (RGBA on big endian,
1685
1771
  * BGRA on little endian).
1686
- *
1687
- * @param color
1688
- * @return
1689
1772
  */
1690
1773
  protected static int javaToNativeARGB(int color) {
1691
1774
  if (BIG_ENDIAN) { // ARGB to RGBA
@@ -1696,15 +1779,12 @@ public abstract class PGL {
1696
1779
  }
1697
1780
  }
1698
1781
 
1782
+
1699
1783
  /**
1700
1784
  * Converts input array of Java ARGB values representing an image of width x
1701
1785
  * height resolution to native OpenGL format (RGBA on big endian, BGRA on
1702
- * little endian).It also rearranges the elements in the array so that the
1786
+ * little endian). It also rearranges the elements in the array so that the
1703
1787
  * image is flipped vertically.
1704
- *
1705
- * @param pixels
1706
- * @param width
1707
- * @param height
1708
1788
  */
1709
1789
  protected static void javaToNativeARGB(int[] pixels, int width, int height) {
1710
1790
  int index = 0;
@@ -1746,9 +1826,8 @@ public abstract class PGL {
1746
1826
  /**
1747
1827
  * Converts input Java ARGB value to native OpenGL format (RGBA on big endian,
1748
1828
  * BGRA on little endian), setting alpha component to opaque (255).
1749
- *
1750
1829
  * @param color
1751
- * @return
1830
+ * @return
1752
1831
  */
1753
1832
  protected static int javaToNativeRGB(int color) {
1754
1833
  if (BIG_ENDIAN) { // ARGB to RGB
@@ -1759,16 +1838,13 @@ public abstract class PGL {
1759
1838
  }
1760
1839
  }
1761
1840
 
1841
+
1762
1842
  /**
1763
1843
  * Converts input array of Java ARGB values representing an image of width x
1764
1844
  * height resolution to native OpenGL format (RGBA on big endian, BGRA on
1765
1845
  * little endian), while setting alpha component of all pixels to opaque
1766
- * (255).It also rearranges the elements in the array so that the image is
1846
+ * (255). It also rearranges the elements in the array so that the image is
1767
1847
  * flipped vertically.
1768
- *
1769
- * @param pixels
1770
- * @param width
1771
- * @param height
1772
1848
  */
1773
1849
  protected static void javaToNativeRGB(int[] pixels, int width, int height) {
1774
1850
  int index = 0;
@@ -1783,10 +1859,10 @@ public abstract class PGL {
1783
1859
  } else { // ARGB to BGR
1784
1860
  int rbi = pixi & 0x00FF00FF;
1785
1861
  int rby = pixy & 0x00FF00FF;
1786
- pixels[index] = 0xFF000000 | (rby << 16)
1787
- | (pixy & 0x0000FF00) | (rby >> 16);
1788
- pixels[yindex] = 0xFF000000 | (rbi << 16)
1789
- | (pixi & 0x0000FF00) | (rbi >> 16);
1862
+ pixels[index] = 0xFF000000 | (rby << 16) |
1863
+ (pixy & 0x0000FF00) | (rby >> 16);
1864
+ pixels[yindex] = 0xFF000000 | (rbi << 16) |
1865
+ (pixi & 0x0000FF00) | (rbi >> 16);
1790
1866
  }
1791
1867
  index++;
1792
1868
  yindex++;
@@ -1802,14 +1878,15 @@ public abstract class PGL {
1802
1878
  pixels[index] = 0xFF | (pixi << 8);
1803
1879
  } else { // ARGB to BGR
1804
1880
  int rbi = pixi & 0x00FF00FF;
1805
- pixels[index] = 0xFF000000 | (rbi << 16)
1806
- | (pixi & 0x0000FF00) | (rbi >> 16);
1881
+ pixels[index] = 0xFF000000 | (rbi << 16) |
1882
+ (pixi & 0x0000FF00) | (rbi >> 16);
1807
1883
  }
1808
1884
  index++;
1809
1885
  }
1810
1886
  }
1811
1887
  }
1812
1888
 
1889
+
1813
1890
  protected static int qualityToSamples(int quality) {
1814
1891
  if (quality <= 1) {
1815
1892
  return 1;
@@ -1820,18 +1897,21 @@ public abstract class PGL {
1820
1897
  }
1821
1898
  }
1822
1899
 
1823
- abstract protected int getGLSLVersion();
1824
1900
 
1901
+ abstract protected int getGLSLVersion();
1825
1902
  abstract protected String getGLSLVersionSuffix();
1826
1903
 
1904
+
1827
1905
  protected String[] loadVertexShader(String filename) {
1828
1906
  return sketch.loadStrings(filename);
1829
1907
  }
1830
1908
 
1909
+
1831
1910
  protected String[] loadFragmentShader(String filename) {
1832
1911
  return sketch.loadStrings(filename);
1833
1912
  }
1834
1913
 
1914
+
1835
1915
  protected String[] loadFragmentShader(URL url) {
1836
1916
  try {
1837
1917
  return PApplet.loadStrings(url.openStream());
@@ -1841,6 +1921,7 @@ public abstract class PGL {
1841
1921
  return null;
1842
1922
  }
1843
1923
 
1924
+
1844
1925
  protected String[] loadVertexShader(URL url) {
1845
1926
  try {
1846
1927
  return PApplet.loadStrings(url.openStream());
@@ -1850,25 +1931,30 @@ public abstract class PGL {
1850
1931
  return null;
1851
1932
  }
1852
1933
 
1934
+
1853
1935
  protected String[] loadVertexShader(String filename, int version, String versionSuffix) {
1854
1936
  return loadVertexShader(filename);
1855
1937
  }
1856
1938
 
1939
+
1857
1940
  protected String[] loadFragmentShader(String filename, int version, String versionSuffix) {
1858
1941
  return loadFragmentShader(filename);
1859
1942
  }
1860
1943
 
1944
+
1861
1945
  protected String[] loadFragmentShader(URL url, int version, String versionSuffix) {
1862
1946
  return loadFragmentShader(url);
1863
1947
  }
1864
1948
 
1949
+
1865
1950
  protected String[] loadVertexShader(URL url, int version, String versionSuffix) {
1866
1951
  return loadVertexShader(url);
1867
1952
  }
1868
1953
 
1954
+
1869
1955
  protected static String[] preprocessFragmentSource(String[] fragSrc0,
1870
- int version,
1871
- String versionSuffix) {
1956
+ int version,
1957
+ String versionSuffix) {
1872
1958
  if (containsVersionDirective(fragSrc0)) {
1873
1959
  // The user knows what she or he is doing
1874
1960
  return fragSrc0;
@@ -1877,8 +1963,8 @@ public abstract class PGL {
1877
1963
  String[] fragSrc;
1878
1964
 
1879
1965
  if (version < 130) {
1880
- Pattern[] search = {};
1881
- String[] replace = {};
1966
+ Pattern[] search = { };
1967
+ String[] replace = { };
1882
1968
  int offset = 1;
1883
1969
 
1884
1970
  fragSrc = preprocessShaderSource(fragSrc0, search, replace, offset);
@@ -1887,14 +1973,14 @@ public abstract class PGL {
1887
1973
  // We need to replace 'texture' uniform by 'texMap' uniform and
1888
1974
  // 'textureXXX()' functions by 'texture()' functions. Order of these
1889
1975
  // replacements is important to prevent collisions between these two.
1890
- Pattern[] search = new Pattern[]{
1891
- Pattern.compile(String.format(GLSL_ID_REGEX, "varying|attribute")),
1892
- Pattern.compile(String.format(GLSL_ID_REGEX, "texture")),
1893
- Pattern.compile(String.format(GLSL_FN_REGEX, "texture2DRect|texture2D|texture3D|textureCube")),
1894
- Pattern.compile(String.format(GLSL_ID_REGEX, "gl_FragColor"))
1976
+ Pattern[] search = new Pattern[] {
1977
+ Pattern.compile(String.format(GLSL_ID_REGEX, "varying|attribute")),
1978
+ Pattern.compile(String.format(GLSL_ID_REGEX, "texture")),
1979
+ Pattern.compile(String.format(GLSL_FN_REGEX, "texture2DRect|texture2D|texture3D|textureCube")),
1980
+ Pattern.compile(String.format(GLSL_ID_REGEX, "gl_FragColor"))
1895
1981
  };
1896
- String[] replace = new String[]{
1897
- "in", "texMap", "texture", "_fragColor"
1982
+ String[] replace = new String[] {
1983
+ "in", "texMap", "texture", "_fragColor"
1898
1984
  };
1899
1985
  int offset = 2;
1900
1986
 
@@ -1911,8 +1997,8 @@ public abstract class PGL {
1911
1997
  }
1912
1998
 
1913
1999
  protected static String[] preprocessVertexSource(String[] vertSrc0,
1914
- int version,
1915
- String versionSuffix) {
2000
+ int version,
2001
+ String versionSuffix) {
1916
2002
  if (containsVersionDirective(vertSrc0)) {
1917
2003
  // The user knows what she or he is doing
1918
2004
  return vertSrc0;
@@ -1921,8 +2007,8 @@ public abstract class PGL {
1921
2007
  String[] vertSrc;
1922
2008
 
1923
2009
  if (version < 130) {
1924
- Pattern[] search = {};
1925
- String[] replace = {};
2010
+ Pattern[] search = { };
2011
+ String[] replace = { };
1926
2012
  int offset = 1;
1927
2013
 
1928
2014
  vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset);
@@ -1931,14 +2017,15 @@ public abstract class PGL {
1931
2017
  // We need to replace 'texture' uniform by 'texMap' uniform and
1932
2018
  // 'textureXXX()' functions by 'texture()' functions. Order of these
1933
2019
  // replacements is important to prevent collisions between these two.
1934
- Pattern[] search = new Pattern[]{
1935
- Pattern.compile(String.format(GLSL_ID_REGEX, "varying")),
1936
- Pattern.compile(String.format(GLSL_ID_REGEX, "attribute")),
1937
- Pattern.compile(String.format(GLSL_ID_REGEX, "texture")),
1938
- Pattern.compile(String.format(GLSL_FN_REGEX, "texture2DRect|texture2D|texture3D|textureCube"))
2020
+ Pattern[] search = new Pattern[] {
2021
+ Pattern.compile(String.format(GLSL_ID_REGEX, "varying")),
2022
+ Pattern.compile(String.format(GLSL_ID_REGEX, "attribute")),
2023
+ Pattern.compile(String.format(GLSL_ID_REGEX, "texture")),
2024
+ Pattern.compile(String.format(GLSL_FN_REGEX, "texture2DRect|texture2D|texture3D|textureCube"))
2025
+ };
2026
+ String[] replace = new String[] {
2027
+ "out", "in", "texMap", "texture",
1939
2028
  };
1940
- String[] replace = new String[]{
1941
- "out", "in", "texMap", "texture",};
1942
2029
  int offset = 1;
1943
2030
 
1944
2031
  vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset);
@@ -1948,14 +2035,16 @@ public abstract class PGL {
1948
2035
  return vertSrc;
1949
2036
  }
1950
2037
 
2038
+
1951
2039
  protected static final String GLSL_ID_REGEX = "(?<![0-9A-Z_a-z])(%s)(?![0-9A-Z_a-z]|\\s*\\()";
1952
2040
  protected static final String GLSL_FN_REGEX = "(?<![0-9A-Z_a-z])(%s)(?=\\s*\\()";
1953
2041
 
2042
+
1954
2043
  protected static String[] preprocessShaderSource(String[] src0,
1955
- Pattern[] search,
1956
- String[] replace,
1957
- int offset) {
1958
- String[] src = new String[src0.length + offset];
2044
+ Pattern[] search,
2045
+ String[] replace,
2046
+ int offset) {
2047
+ String[] src = new String[src0.length+offset];
1959
2048
  for (int i = 0; i < src0.length; i++) {
1960
2049
  String line = src0[i];
1961
2050
  int versionIndex = line.indexOf("#version");
@@ -1965,7 +2054,7 @@ public abstract class PGL {
1965
2054
  for (int j = 0; j < search.length; j++) {
1966
2055
  line = search[j].matcher(line).replaceAll(replace[j]);
1967
2056
  }
1968
- src[i + offset] = line;
2057
+ src[i+offset] = line;
1969
2058
  }
1970
2059
  return src;
1971
2060
  }
@@ -1998,6 +2087,7 @@ public abstract class PGL {
1998
2087
  return shader;
1999
2088
  }
2000
2089
 
2090
+
2001
2091
  protected int createProgram(int vertexShader, int fragmentShader) {
2002
2092
  int program = createProgram();
2003
2093
  if (program != 0) {
@@ -2014,55 +2104,58 @@ public abstract class PGL {
2014
2104
  return program;
2015
2105
  }
2016
2106
 
2107
+
2017
2108
  protected boolean compiled(int shader) {
2018
2109
  intBuffer.rewind();
2019
2110
  getShaderiv(shader, COMPILE_STATUS, intBuffer);
2020
2111
  return intBuffer.get(0) != 0;
2021
2112
  }
2022
2113
 
2114
+
2023
2115
  protected boolean linked(int program) {
2024
2116
  intBuffer.rewind();
2025
2117
  getProgramiv(program, LINK_STATUS, intBuffer);
2026
2118
  return intBuffer.get(0) != 0;
2027
2119
  }
2028
2120
 
2121
+
2029
2122
  protected int validateFramebuffer() {
2030
2123
  int status = checkFramebufferStatus(FRAMEBUFFER);
2031
2124
  if (status == FRAMEBUFFER_COMPLETE) {
2032
2125
  return 0;
2033
2126
  } else if (status == FRAMEBUFFER_UNDEFINED) {
2034
2127
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2035
- "framebuffer undefined"));
2128
+ "framebuffer undefined"));
2036
2129
  } else if (status == FRAMEBUFFER_INCOMPLETE_ATTACHMENT) {
2037
2130
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2038
- "incomplete attachment"));
2131
+ "incomplete attachment"));
2039
2132
  } else if (status == FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT) {
2040
2133
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2041
- "incomplete missing attachment"));
2134
+ "incomplete missing attachment"));
2042
2135
  } else if (status == FRAMEBUFFER_INCOMPLETE_DIMENSIONS) {
2043
2136
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2044
- "incomplete dimensions"));
2137
+ "incomplete dimensions"));
2045
2138
  } else if (status == FRAMEBUFFER_INCOMPLETE_FORMATS) {
2046
2139
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2047
- "incomplete formats"));
2140
+ "incomplete formats"));
2048
2141
  } else if (status == FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER) {
2049
2142
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2050
- "incomplete draw buffer"));
2143
+ "incomplete draw buffer"));
2051
2144
  } else if (status == FRAMEBUFFER_INCOMPLETE_READ_BUFFER) {
2052
2145
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2053
- "incomplete read buffer"));
2146
+ "incomplete read buffer"));
2054
2147
  } else if (status == FRAMEBUFFER_UNSUPPORTED) {
2055
2148
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2056
- "framebuffer unsupported"));
2149
+ "framebuffer unsupported"));
2057
2150
  } else if (status == FRAMEBUFFER_INCOMPLETE_MULTISAMPLE) {
2058
2151
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2059
- "incomplete multisample buffer"));
2152
+ "incomplete multisample buffer"));
2060
2153
  } else if (status == FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS) {
2061
2154
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2062
- "incomplete layer targets"));
2155
+ "incomplete layer targets"));
2063
2156
  } else {
2064
2157
  System.err.println(String.format(FRAMEBUFFER_ERROR,
2065
- "unknown error " + status));
2158
+ "unknown error " + status));
2066
2159
  }
2067
2160
  return status;
2068
2161
  }
@@ -2087,19 +2180,16 @@ public abstract class PGL {
2087
2180
  String[] nums = part.split("\\.");
2088
2181
  try {
2089
2182
  res[0] = Integer.parseInt(nums[0]);
2090
- } catch (NumberFormatException e) {
2091
- }
2183
+ } catch (NumberFormatException e) { }
2092
2184
  if (1 < nums.length) {
2093
2185
  try {
2094
2186
  res[1] = Integer.parseInt(nums[1]);
2095
- } catch (NumberFormatException e) {
2096
- }
2187
+ } catch (NumberFormatException e) { }
2097
2188
  }
2098
2189
  if (2 < nums.length) {
2099
2190
  try {
2100
2191
  res[2] = Integer.parseInt(nums[2]);
2101
- } catch (NumberFormatException e) {
2102
- }
2192
+ } catch (NumberFormatException e) { }
2103
2193
  }
2104
2194
  break;
2105
2195
  }
@@ -2107,20 +2197,22 @@ public abstract class PGL {
2107
2197
  return res;
2108
2198
  }
2109
2199
 
2200
+
2110
2201
  protected boolean hasFBOs() {
2111
2202
  // FBOs might still be available through extensions.
2112
2203
  int major = getGLVersion()[0];
2113
2204
  if (major < 2) {
2114
2205
  String ext = getString(EXTENSIONS);
2115
- return ext.contains("_framebuffer_object")
2116
- && ext.contains("_vertex_shader")
2117
- && ext.contains("_shader_objects")
2118
- && ext.contains("_shading_language");
2206
+ return ext.contains("_framebuffer_object") &&
2207
+ ext.contains("_vertex_shader") &&
2208
+ ext.contains("_shader_objects") &&
2209
+ ext.contains("_shading_language");
2119
2210
  } else {
2120
2211
  return true;
2121
2212
  }
2122
2213
  }
2123
2214
 
2215
+
2124
2216
  protected boolean hasShaders() {
2125
2217
  // GLSL might still be available through extensions. For instance,
2126
2218
  // GLContext.hasGLSL() gives false for older intel integrated chipsets on
@@ -2128,15 +2220,16 @@ public abstract class PGL {
2128
2220
  int major = getGLVersion()[0];
2129
2221
  if (major < 2) {
2130
2222
  String ext = getString(EXTENSIONS);
2131
- return ext.contains("_fragment_shader")
2132
- && ext.contains("_vertex_shader")
2133
- && ext.contains("_shader_objects")
2134
- && ext.contains("_shading_language");
2223
+ return ext.contains("_fragment_shader") &&
2224
+ ext.contains("_vertex_shader") &&
2225
+ ext.contains("_shader_objects") &&
2226
+ ext.contains("_shading_language");
2135
2227
  } else {
2136
2228
  return true;
2137
2229
  }
2138
2230
  }
2139
2231
 
2232
+
2140
2233
  protected boolean hasNpotTexSupport() {
2141
2234
  int major = getGLVersion()[0];
2142
2235
  if (major < 3) {
@@ -2151,6 +2244,7 @@ public abstract class PGL {
2151
2244
  }
2152
2245
  }
2153
2246
 
2247
+
2154
2248
  protected boolean hasAutoMipmapGenSupport() {
2155
2249
  int major = getGLVersion()[0];
2156
2250
  if (isES() && major >= 2) {
@@ -2163,6 +2257,7 @@ public abstract class PGL {
2163
2257
  }
2164
2258
  }
2165
2259
 
2260
+
2166
2261
  protected boolean hasFboMultisampleSupport() {
2167
2262
  int major = getGLVersion()[0];
2168
2263
  if (major < 3) {
@@ -2173,6 +2268,7 @@ public abstract class PGL {
2173
2268
  }
2174
2269
  }
2175
2270
 
2271
+
2176
2272
  protected boolean hasPackedDepthStencilSupport() {
2177
2273
  int major = getGLVersion()[0];
2178
2274
  if (major < 3) {
@@ -2183,6 +2279,7 @@ public abstract class PGL {
2183
2279
  }
2184
2280
  }
2185
2281
 
2282
+
2186
2283
  protected boolean hasAnisoSamplingSupport() {
2187
2284
  int major = getGLVersion()[0];
2188
2285
  if (isES() || major < 3) {
@@ -2193,6 +2290,7 @@ public abstract class PGL {
2193
2290
  }
2194
2291
  }
2195
2292
 
2293
+
2196
2294
  protected boolean hasSynchronization() {
2197
2295
  int[] version = getGLVersion();
2198
2296
  if (isES()) {
@@ -2201,6 +2299,7 @@ public abstract class PGL {
2201
2299
  return (version[0] > 3) || (version[0] == 3 && version[1] >= 2);
2202
2300
  }
2203
2301
 
2302
+
2204
2303
  protected boolean hasPBOs() {
2205
2304
  int[] version = getGLVersion();
2206
2305
  if (isES()) {
@@ -2209,6 +2308,7 @@ public abstract class PGL {
2209
2308
  return (version[0] > 2) || (version[0] == 2 && version[1] >= 1);
2210
2309
  }
2211
2310
 
2311
+
2212
2312
  protected boolean hasReadBuffer() {
2213
2313
  int[] version = getGLVersion();
2214
2314
  if (isES()) {
@@ -2217,6 +2317,7 @@ public abstract class PGL {
2217
2317
  return version[0] >= 2;
2218
2318
  }
2219
2319
 
2320
+
2220
2321
  protected boolean hasDrawBuffer() {
2221
2322
  int[] version = getGLVersion();
2222
2323
  if (isES()) {
@@ -2225,23 +2326,49 @@ public abstract class PGL {
2225
2326
  return version[0] >= 2;
2226
2327
  }
2227
2328
 
2329
+
2228
2330
  protected int maxSamples() {
2229
2331
  intBuffer.rewind();
2230
2332
  getIntegerv(MAX_SAMPLES, intBuffer);
2231
2333
  return intBuffer.get(0);
2232
2334
  }
2233
2335
 
2336
+
2234
2337
  protected int getMaxTexUnits() {
2235
2338
  intBuffer.rewind();
2236
2339
  getIntegerv(MAX_TEXTURE_IMAGE_UNITS, intBuffer);
2237
2340
  return intBuffer.get(0);
2238
2341
  }
2239
2342
 
2343
+
2344
+ public boolean isFboAllowed() {
2345
+ if (fboAllowed == null) {
2346
+ if (PApplet.platform == PConstants.MACOS) {
2347
+ try {
2348
+ String hardware = getString(PGL.RENDERER);
2349
+ if (hardware != null && hardware.contains("Intel HD Graphics 3000")) {
2350
+ fboAllowed = false;
2351
+ return false;
2352
+ }
2353
+ } catch (RuntimeException e) {
2354
+ System.err.println("Could not read renderer name. FBOs disabled. Reason: " + e);
2355
+ // disable for now, but will try again on next isFboAllowed() call
2356
+ return false;
2357
+ }
2358
+ }
2359
+ // all other scenarios allow for FBOs
2360
+ fboAllowed = true;
2361
+ }
2362
+ return fboAllowed;
2363
+ }
2364
+
2365
+
2240
2366
  protected static ByteBuffer allocateDirectByteBuffer(int size) {
2241
2367
  int bytes = PApplet.max(MIN_DIRECT_BUFFER_SIZE, size) * SIZEOF_BYTE;
2242
2368
  return ByteBuffer.allocateDirect(bytes).order(ByteOrder.nativeOrder());
2243
2369
  }
2244
2370
 
2371
+
2245
2372
  protected static ByteBuffer allocateByteBuffer(int size) {
2246
2373
  if (USE_DIRECT_BUFFERS) {
2247
2374
  return allocateDirectByteBuffer(size);
@@ -2250,6 +2377,7 @@ public abstract class PGL {
2250
2377
  }
2251
2378
  }
2252
2379
 
2380
+
2253
2381
  protected static ByteBuffer allocateByteBuffer(byte[] arr) {
2254
2382
  if (USE_DIRECT_BUFFERS) {
2255
2383
  ByteBuffer buf = allocateDirectByteBuffer(arr.length);
@@ -2261,8 +2389,9 @@ public abstract class PGL {
2261
2389
  }
2262
2390
  }
2263
2391
 
2392
+
2264
2393
  protected static ByteBuffer updateByteBuffer(ByteBuffer buf, byte[] arr,
2265
- boolean wrap) {
2394
+ boolean wrap) {
2266
2395
  if (USE_DIRECT_BUFFERS) {
2267
2396
  if (buf == null || buf.capacity() < arr.length) {
2268
2397
  buf = allocateDirectByteBuffer(arr.length);
@@ -2285,8 +2414,9 @@ public abstract class PGL {
2285
2414
  return buf;
2286
2415
  }
2287
2416
 
2417
+
2288
2418
  protected static void updateByteBuffer(ByteBuffer buf, byte[] arr,
2289
- int offset, int size) {
2419
+ int offset, int size) {
2290
2420
  if (USE_DIRECT_BUFFERS || (buf.hasArray() && buf.array() != arr)) {
2291
2421
  buf.position(offset);
2292
2422
  buf.put(arr, offset, size);
@@ -2294,6 +2424,7 @@ public abstract class PGL {
2294
2424
  }
2295
2425
  }
2296
2426
 
2427
+
2297
2428
  protected static void getByteArray(ByteBuffer buf, byte[] arr) {
2298
2429
  if (!buf.hasArray() || buf.array() != arr) {
2299
2430
  buf.position(0);
@@ -2302,6 +2433,7 @@ public abstract class PGL {
2302
2433
  }
2303
2434
  }
2304
2435
 
2436
+
2305
2437
  protected static void putByteArray(ByteBuffer buf, byte[] arr) {
2306
2438
  if (!buf.hasArray() || buf.array() != arr) {
2307
2439
  buf.position(0);
@@ -2310,8 +2442,9 @@ public abstract class PGL {
2310
2442
  }
2311
2443
  }
2312
2444
 
2445
+
2313
2446
  protected static void fillByteBuffer(ByteBuffer buf, int i0, int i1,
2314
- byte val) {
2447
+ byte val) {
2315
2448
  int n = i1 - i0;
2316
2449
  byte[] temp = new byte[n];
2317
2450
  Arrays.fill(temp, 0, n, val);
@@ -2320,12 +2453,14 @@ public abstract class PGL {
2320
2453
  buf.rewind();
2321
2454
  }
2322
2455
 
2456
+
2323
2457
  protected static ShortBuffer allocateDirectShortBuffer(int size) {
2324
2458
  int bytes = PApplet.max(MIN_DIRECT_BUFFER_SIZE, size) * SIZEOF_SHORT;
2325
2459
  return ByteBuffer.allocateDirect(bytes).order(ByteOrder.nativeOrder()).
2326
- asShortBuffer();
2460
+ asShortBuffer();
2327
2461
  }
2328
2462
 
2463
+
2329
2464
  protected static ShortBuffer allocateShortBuffer(int size) {
2330
2465
  if (USE_DIRECT_BUFFERS) {
2331
2466
  return allocateDirectShortBuffer(size);
@@ -2334,6 +2469,7 @@ public abstract class PGL {
2334
2469
  }
2335
2470
  }
2336
2471
 
2472
+
2337
2473
  protected static ShortBuffer allocateShortBuffer(short[] arr) {
2338
2474
  if (USE_DIRECT_BUFFERS) {
2339
2475
  ShortBuffer buf = allocateDirectShortBuffer(arr.length);
@@ -2345,8 +2481,9 @@ public abstract class PGL {
2345
2481
  }
2346
2482
  }
2347
2483
 
2484
+
2348
2485
  protected static ShortBuffer updateShortBuffer(ShortBuffer buf, short[] arr,
2349
- boolean wrap) {
2486
+ boolean wrap) {
2350
2487
  if (USE_DIRECT_BUFFERS) {
2351
2488
  if (buf == null || buf.capacity() < arr.length) {
2352
2489
  buf = allocateDirectShortBuffer(arr.length);
@@ -2369,8 +2506,9 @@ public abstract class PGL {
2369
2506
  return buf;
2370
2507
  }
2371
2508
 
2509
+
2372
2510
  protected static void updateShortBuffer(ShortBuffer buf, short[] arr,
2373
- int offset, int size) {
2511
+ int offset, int size) {
2374
2512
  if (USE_DIRECT_BUFFERS || (buf.hasArray() && buf.array() != arr)) {
2375
2513
  buf.position(offset);
2376
2514
  buf.put(arr, offset, size);
@@ -2378,6 +2516,7 @@ public abstract class PGL {
2378
2516
  }
2379
2517
  }
2380
2518
 
2519
+
2381
2520
  protected static void getShortArray(ShortBuffer buf, short[] arr) {
2382
2521
  if (!buf.hasArray() || buf.array() != arr) {
2383
2522
  buf.position(0);
@@ -2386,6 +2525,7 @@ public abstract class PGL {
2386
2525
  }
2387
2526
  }
2388
2527
 
2528
+
2389
2529
  protected static void putShortArray(ShortBuffer buf, short[] arr) {
2390
2530
  if (!buf.hasArray() || buf.array() != arr) {
2391
2531
  buf.position(0);
@@ -2394,8 +2534,9 @@ public abstract class PGL {
2394
2534
  }
2395
2535
  }
2396
2536
 
2537
+
2397
2538
  protected static void fillShortBuffer(ShortBuffer buf, int i0, int i1,
2398
- short val) {
2539
+ short val) {
2399
2540
  int n = i1 - i0;
2400
2541
  short[] temp = new short[n];
2401
2542
  Arrays.fill(temp, 0, n, val);
@@ -2404,12 +2545,14 @@ public abstract class PGL {
2404
2545
  buf.rewind();
2405
2546
  }
2406
2547
 
2548
+
2407
2549
  protected static IntBuffer allocateDirectIntBuffer(int size) {
2408
2550
  int bytes = PApplet.max(MIN_DIRECT_BUFFER_SIZE, size) * SIZEOF_INT;
2409
2551
  return ByteBuffer.allocateDirect(bytes).order(ByteOrder.nativeOrder()).
2410
- asIntBuffer();
2552
+ asIntBuffer();
2411
2553
  }
2412
2554
 
2555
+
2413
2556
  protected static IntBuffer allocateIntBuffer(int size) {
2414
2557
  if (USE_DIRECT_BUFFERS) {
2415
2558
  return allocateDirectIntBuffer(size);
@@ -2418,6 +2561,7 @@ public abstract class PGL {
2418
2561
  }
2419
2562
  }
2420
2563
 
2564
+
2421
2565
  protected static IntBuffer allocateIntBuffer(int[] arr) {
2422
2566
  if (USE_DIRECT_BUFFERS) {
2423
2567
  IntBuffer buf = allocateDirectIntBuffer(arr.length);
@@ -2429,8 +2573,9 @@ public abstract class PGL {
2429
2573
  }
2430
2574
  }
2431
2575
 
2576
+
2432
2577
  protected static IntBuffer updateIntBuffer(IntBuffer buf, int[] arr,
2433
- boolean wrap) {
2578
+ boolean wrap) {
2434
2579
  if (USE_DIRECT_BUFFERS) {
2435
2580
  if (buf == null || buf.capacity() < arr.length) {
2436
2581
  buf = allocateDirectIntBuffer(arr.length);
@@ -2453,14 +2598,16 @@ public abstract class PGL {
2453
2598
  return buf;
2454
2599
  }
2455
2600
 
2601
+
2456
2602
  protected static void updateIntBuffer(IntBuffer buf, int[] arr,
2457
- int offset, int size) {
2458
- if (USE_DIRECT_BUFFERS || (buf.hasArray() && buf.array() != arr)) {
2459
- buf.position(offset);
2460
- buf.put(arr, offset, size);
2461
- buf.rewind();
2462
- }
2463
- }
2603
+ int offset, int size) {
2604
+ if (USE_DIRECT_BUFFERS || (buf.hasArray() && buf.array() != arr)) {
2605
+ buf.position(offset);
2606
+ buf.put(arr, offset, size);
2607
+ buf.rewind();
2608
+ }
2609
+ }
2610
+
2464
2611
 
2465
2612
  protected static void getIntArray(IntBuffer buf, int[] arr) {
2466
2613
  if (!buf.hasArray() || buf.array() != arr) {
@@ -2470,6 +2617,7 @@ public abstract class PGL {
2470
2617
  }
2471
2618
  }
2472
2619
 
2620
+
2473
2621
  protected static void putIntArray(IntBuffer buf, int[] arr) {
2474
2622
  if (!buf.hasArray() || buf.array() != arr) {
2475
2623
  buf.position(0);
@@ -2478,6 +2626,7 @@ public abstract class PGL {
2478
2626
  }
2479
2627
  }
2480
2628
 
2629
+
2481
2630
  protected static void fillIntBuffer(IntBuffer buf, int i0, int i1, int val) {
2482
2631
  int n = i1 - i0;
2483
2632
  int[] temp = new int[n];
@@ -2487,12 +2636,14 @@ public abstract class PGL {
2487
2636
  buf.rewind();
2488
2637
  }
2489
2638
 
2639
+
2490
2640
  protected static FloatBuffer allocateDirectFloatBuffer(int size) {
2491
2641
  int bytes = PApplet.max(MIN_DIRECT_BUFFER_SIZE, size) * SIZEOF_FLOAT;
2492
2642
  return ByteBuffer.allocateDirect(bytes).order(ByteOrder.nativeOrder()).
2493
- asFloatBuffer();
2643
+ asFloatBuffer();
2494
2644
  }
2495
2645
 
2646
+
2496
2647
  protected static FloatBuffer allocateFloatBuffer(int size) {
2497
2648
  if (USE_DIRECT_BUFFERS) {
2498
2649
  return allocateDirectFloatBuffer(size);
@@ -2501,6 +2652,7 @@ public abstract class PGL {
2501
2652
  }
2502
2653
  }
2503
2654
 
2655
+
2504
2656
  protected static FloatBuffer allocateFloatBuffer(float[] arr) {
2505
2657
  if (USE_DIRECT_BUFFERS) {
2506
2658
  FloatBuffer buf = allocateDirectFloatBuffer(arr.length);
@@ -2512,8 +2664,9 @@ public abstract class PGL {
2512
2664
  }
2513
2665
  }
2514
2666
 
2667
+
2515
2668
  protected static FloatBuffer updateFloatBuffer(FloatBuffer buf, float[] arr,
2516
- boolean wrap) {
2669
+ boolean wrap) {
2517
2670
  if (USE_DIRECT_BUFFERS) {
2518
2671
  if (buf == null || buf.capacity() < arr.length) {
2519
2672
  buf = allocateDirectFloatBuffer(arr.length);
@@ -2536,14 +2689,16 @@ public abstract class PGL {
2536
2689
  return buf;
2537
2690
  }
2538
2691
 
2692
+
2539
2693
  protected static void updateFloatBuffer(FloatBuffer buf, float[] arr,
2540
- int offset, int size) {
2541
- if (USE_DIRECT_BUFFERS || (buf.hasArray() && buf.array() != arr)) {
2542
- buf.position(offset);
2543
- buf.put(arr, offset, size);
2544
- buf.rewind();
2545
- }
2546
- }
2694
+ int offset, int size) {
2695
+ if (USE_DIRECT_BUFFERS || (buf.hasArray() && buf.array() != arr)) {
2696
+ buf.position(offset);
2697
+ buf.put(arr, offset, size);
2698
+ buf.rewind();
2699
+ }
2700
+ }
2701
+
2547
2702
 
2548
2703
  protected static void getFloatArray(FloatBuffer buf, float[] arr) {
2549
2704
  if (!buf.hasArray() || buf.array() != arr) {
@@ -2553,6 +2708,7 @@ public abstract class PGL {
2553
2708
  }
2554
2709
  }
2555
2710
 
2711
+
2556
2712
  protected static void putFloatArray(FloatBuffer buf, float[] arr) {
2557
2713
  if (!buf.hasArray() || buf.array() != arr) {
2558
2714
  buf.position(0);
@@ -2561,8 +2717,9 @@ public abstract class PGL {
2561
2717
  }
2562
2718
  }
2563
2719
 
2720
+
2564
2721
  protected static void fillFloatBuffer(FloatBuffer buf, int i0, int i1,
2565
- float val) {
2722
+ float val) {
2566
2723
  int n = i1 - i0;
2567
2724
  float[] temp = new float[n];
2568
2725
  Arrays.fill(temp, 0, n, val);
@@ -2571,63 +2728,72 @@ public abstract class PGL {
2571
2728
  buf.rewind();
2572
2729
  }
2573
2730
 
2731
+
2574
2732
  // TODO: the next three functions shouldn't be here...
2575
2733
  // Uses 'Object' so that the API can be used w/ Android Typeface objects
2734
+
2576
2735
  abstract protected int getFontAscent(Object font);
2577
2736
 
2737
+
2578
2738
  abstract protected int getFontDescent(Object font);
2579
2739
 
2740
+
2580
2741
  abstract protected int getTextWidth(Object font, char[] buffer, int start, int stop);
2581
2742
 
2743
+
2582
2744
  abstract protected Object getDerivedFont(Object font, float size);
2583
2745
 
2584
2746
  ///////////////////////////////////////////////////////////
2747
+
2748
+ protected interface RenderCallback {
2749
+
2750
+ void onRender();
2751
+
2752
+ }
2753
+
2754
+ ///////////////////////////////////////////////////////////
2755
+
2585
2756
  // Tessellator interface
2757
+
2758
+
2586
2759
  protected abstract Tessellator createTessellator(TessellatorCallback callback);
2587
2760
 
2588
- protected interface Tessellator {
2589
2761
 
2762
+ protected interface Tessellator {
2590
2763
  public void setCallback(int flag);
2591
-
2592
2764
  public void setWindingRule(int rule);
2593
-
2594
2765
  public void setProperty(int property, int value);
2595
2766
 
2596
2767
  public void beginPolygon();
2597
-
2598
2768
  public void beginPolygon(Object data);
2599
-
2600
2769
  public void endPolygon();
2601
-
2602
2770
  public void beginContour();
2603
-
2604
2771
  public void endContour();
2605
-
2606
2772
  public void addVertex(double[] v);
2607
-
2608
2773
  public void addVertex(double[] v, int n, Object data);
2609
2774
  }
2610
2775
 
2611
- protected interface TessellatorCallback {
2612
2776
 
2777
+ protected interface TessellatorCallback {
2613
2778
  public void begin(int type);
2614
-
2615
2779
  public void end();
2616
-
2617
2780
  public void vertex(Object data);
2618
-
2619
2781
  public void combine(double[] coords, Object[] data,
2620
- float[] weight, Object[] outData);
2621
-
2782
+ float[] weight, Object[] outData);
2622
2783
  public void error(int errnum);
2623
2784
  }
2624
2785
 
2786
+
2625
2787
  protected String tessError(int err) {
2626
2788
  return "";
2627
2789
  }
2628
2790
 
2791
+
2629
2792
  ///////////////////////////////////////////////////////////
2793
+
2630
2794
  // FontOutline interface
2795
+
2796
+
2631
2797
  protected static boolean SHAPE_TEXT_SUPPORTED;
2632
2798
  protected static int SEG_MOVETO;
2633
2799
  protected static int SEG_LINETO;
@@ -2635,17 +2801,17 @@ public abstract class PGL {
2635
2801
  protected static int SEG_CUBICTO;
2636
2802
  protected static int SEG_CLOSE;
2637
2803
 
2804
+
2638
2805
  protected abstract FontOutline createFontOutline(char ch, Object font);
2639
2806
 
2640
- protected interface FontOutline {
2641
2807
 
2808
+ protected interface FontOutline {
2642
2809
  public boolean isDone();
2643
-
2644
2810
  public int currentSegment(float coords[]);
2645
-
2646
2811
  public void next();
2647
2812
  }
2648
2813
 
2814
+
2649
2815
  //////////////////////////////////////////////////////////////////////////////
2650
2816
  //
2651
2817
  // OpenGL ES 2.0 API, with a few additional functions for multisampling and
@@ -2665,7 +2831,9 @@ public abstract class PGL {
2665
2831
  // Also, keep in mind the note about the PGL constants below.
2666
2832
  //
2667
2833
  //////////////////////////////////////////////////////////////////////////////
2834
+
2668
2835
  ///////////////////////////////////////////////////////////
2836
+
2669
2837
  // Constants
2670
2838
  // Very important note: set the GL constants in your PGL subclass by using an
2671
2839
  // static initialization block as follows:
@@ -2678,6 +2846,7 @@ public abstract class PGL {
2678
2846
  // errors when the constants are accessed through PGL because they are not
2679
2847
  // overridden but hidden by the new declarations, and hence they keep their
2680
2848
  // initial values (all zeroes) when accessed through the superclass.
2849
+
2681
2850
  public static int FALSE;
2682
2851
  public static int TRUE;
2683
2852
 
@@ -2972,80 +3141,82 @@ public abstract class PGL {
2972
3141
  public static int CONDITION_SATISFIED;
2973
3142
 
2974
3143
  ///////////////////////////////////////////////////////////
3144
+
2975
3145
  // Special Functions
2976
- public abstract void flush();
2977
3146
 
3147
+ public abstract void flush();
2978
3148
  public abstract void finish();
2979
-
2980
3149
  public abstract void hint(int target, int hint);
2981
3150
 
2982
3151
  ///////////////////////////////////////////////////////////
3152
+
2983
3153
  // State and State Requests
2984
- public abstract void enable(int value);
2985
3154
 
3155
+ public abstract void enable(int value);
2986
3156
  public abstract void disable(int value);
2987
-
2988
3157
  public abstract void getBooleanv(int value, IntBuffer data);
2989
-
2990
3158
  public abstract void getIntegerv(int value, IntBuffer data);
2991
-
2992
3159
  public abstract void getFloatv(int value, FloatBuffer data);
2993
-
2994
3160
  public abstract boolean isEnabled(int value);
2995
3161
 
2996
- public abstract String getString(int name);
3162
+ /**
3163
+ * Get a configuration or status string from the underlying renderer.
3164
+ *
3165
+ * @param name The name or ID of the attribute to request.
3166
+ * @return The requested value as a string.
3167
+ * @throws GraphicsNotInitializedException Thrown if an attribute is requested that is not
3168
+ * available until graphics initialization before that initialization compeltes. For example,
3169
+ * if requesting a GL string before GL context is available.
3170
+ */
3171
+ public abstract String getString(int name) throws GraphicsNotInitializedException;
2997
3172
 
2998
3173
  ///////////////////////////////////////////////////////////
3174
+
2999
3175
  // Error Handling
3000
- public abstract int getError();
3001
3176
 
3177
+ public abstract int getError();
3002
3178
  public abstract String errorString(int err);
3003
3179
 
3004
3180
  //////////////////////////////////////////////////////////////////////////////
3181
+
3005
3182
  // Buffer Objects
3006
- public abstract void genBuffers(int n, IntBuffer buffers);
3007
3183
 
3184
+ public abstract void genBuffers(int n, IntBuffer buffers);
3008
3185
  public abstract void deleteBuffers(int n, IntBuffer buffers);
3009
-
3010
3186
  public abstract void bindBuffer(int target, int buffer);
3011
-
3012
3187
  public abstract void bufferData(int target, int size, Buffer data, int usage);
3013
-
3014
3188
  public abstract void bufferSubData(int target, int offset, int size, Buffer data);
3015
-
3016
3189
  public abstract void isBuffer(int buffer);
3017
-
3018
3190
  public abstract void getBufferParameteriv(int target, int value, IntBuffer data);
3019
-
3020
3191
  public abstract ByteBuffer mapBuffer(int target, int access);
3021
-
3022
3192
  public abstract ByteBuffer mapBufferRange(int target, int offset, int length, int access);
3023
-
3024
3193
  public abstract void unmapBuffer(int target);
3025
3194
 
3026
3195
  //////////////////////////////////////////////////////////////////////////////
3196
+
3027
3197
  // Synchronization
3028
- public abstract long fenceSync(int condition, int flags);
3029
3198
 
3199
+ public abstract long fenceSync(int condition, int flags);
3030
3200
  public abstract void deleteSync(long sync);
3031
-
3032
3201
  public abstract int clientWaitSync(long sync, int flags, long timeout);
3033
3202
 
3034
3203
  //////////////////////////////////////////////////////////////////////////////
3204
+
3035
3205
  // Viewport and Clipping
3036
- public abstract void depthRangef(float n, float f);
3037
3206
 
3207
+ public abstract void depthRangef(float n, float f);
3038
3208
  public abstract void viewport(int x, int y, int w, int h);
3039
-
3040
3209
  protected abstract void viewportImpl(int x, int y, int w, int h);
3041
3210
 
3042
3211
  //////////////////////////////////////////////////////////////////////////////
3212
+
3043
3213
  // Reading Pixels
3044
3214
  // This is a special case: because the renderer might be using an FBO even on
3045
3215
  // the main surface, some extra handling might be needed before and after
3046
3216
  // reading the pixels. To make this transparent to the user, the actual call
3047
3217
  // to glReadPixels() should be done in readPixelsImpl().
3048
- public void readPixels(int x, int y, int width, int height, int format, int type, Buffer buffer) {
3218
+
3219
+ public void readPixels(int x, int y, int width, int height, int format, int type, Buffer buffer){
3049
3220
  boolean multisampled = isMultisampled() || graphics.offscreenMultisample;
3050
3221
  boolean depthReadingEnabled = graphics.getHint(PConstants.ENABLE_BUFFER_READING);
3051
3222
  boolean depthRequested = format == STENCIL_INDEX || format == DEPTH_COMPONENT || format == DEPTH_STENCIL;
@@ -3060,7 +3231,7 @@ public abstract class PGL {
3060
3231
  graphics.endReadPixels();
3061
3232
  }
3062
3233
 
3063
- public void readPixels(int x, int y, int width, int height, int format, int type, long offset) {
3234
+ public void readPixels(int x, int y, int width, int height, int format, int type, long offset){
3064
3235
  boolean multisampled = isMultisampled() || graphics.offscreenMultisample;
3065
3236
  boolean depthReadingEnabled = graphics.getHint(PConstants.ENABLE_BUFFER_READING);
3066
3237
  boolean depthRequested = format == STENCIL_INDEX || format == DEPTH_COMPONENT || format == DEPTH_STENCIL;
@@ -3076,31 +3247,22 @@ public abstract class PGL {
3076
3247
  }
3077
3248
 
3078
3249
  protected abstract void readPixelsImpl(int x, int y, int width, int height, int format, int type, Buffer buffer);
3079
-
3080
3250
  protected abstract void readPixelsImpl(int x, int y, int width, int height, int format, int type, long offset);
3081
3251
 
3082
3252
  //////////////////////////////////////////////////////////////////////////////
3253
+
3083
3254
  // Vertices
3084
- public abstract void vertexAttrib1f(int index, float value);
3085
3255
 
3256
+ public abstract void vertexAttrib1f(int index, float value);
3086
3257
  public abstract void vertexAttrib2f(int index, float value0, float value1);
3087
-
3088
3258
  public abstract void vertexAttrib3f(int index, float value0, float value1, float value2);
3089
-
3090
3259
  public abstract void vertexAttrib4f(int index, float value0, float value1, float value2, float value3);
3091
-
3092
3260
  public abstract void vertexAttrib1fv(int index, FloatBuffer values);
3093
-
3094
3261
  public abstract void vertexAttrib2fv(int index, FloatBuffer values);
3095
-
3096
3262
  public abstract void vertexAttrib3fv(int index, FloatBuffer values);
3097
-
3098
3263
  public abstract void vertexAttrib4fv(int index, FloatBuffer values);
3099
-
3100
3264
  public abstract void vertexAttribPointer(int index, int size, int type, boolean normalized, int stride, int offset);
3101
-
3102
3265
  public abstract void enableVertexAttribArray(int index);
3103
-
3104
3266
  public abstract void disableVertexAttribArray(int index);
3105
3267
 
3106
3268
  public void drawArrays(int mode, int first, int count) {
@@ -3118,51 +3280,39 @@ public abstract class PGL {
3118
3280
  public abstract void drawElementsImpl(int mode, int count, int type, int offset);
3119
3281
 
3120
3282
  //////////////////////////////////////////////////////////////////////////////
3283
+
3121
3284
  // Rasterization
3122
- public abstract void lineWidth(float width);
3123
3285
 
3286
+ public abstract void lineWidth(float width);
3124
3287
  public abstract void frontFace(int dir);
3125
-
3126
3288
  public abstract void cullFace(int mode);
3127
-
3128
3289
  public abstract void polygonOffset(float factor, float units);
3129
3290
 
3130
3291
  //////////////////////////////////////////////////////////////////////////////
3292
+
3131
3293
  // Pixel Rectangles
3294
+
3132
3295
  public abstract void pixelStorei(int pname, int param);
3133
3296
 
3134
3297
  ///////////////////////////////////////////////////////////
3298
+
3135
3299
  // Texturing
3136
- public abstract void texImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, Buffer data);
3137
3300
 
3301
+ public abstract void texImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, Buffer data);
3138
3302
  public abstract void copyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border);
3139
-
3140
3303
  public abstract void texSubImage2D(int target, int level, int xOffset, int yOffset, int width, int height, int format, int type, Buffer data);
3141
-
3142
3304
  public abstract void copyTexSubImage2D(int target, int level, int xOffset, int yOffset, int x, int y, int width, int height);
3143
-
3144
3305
  public abstract void compressedTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int imageSize, Buffer data);
3145
-
3146
3306
  public abstract void compressedTexSubImage2D(int target, int level, int xOffset, int yOffset, int width, int height, int format, int imageSize, Buffer data);
3147
-
3148
3307
  public abstract void texParameteri(int target, int pname, int param);
3149
-
3150
3308
  public abstract void texParameterf(int target, int pname, float param);
3151
-
3152
3309
  public abstract void texParameteriv(int target, int pname, IntBuffer params);
3153
-
3154
3310
  public abstract void texParameterfv(int target, int pname, FloatBuffer params);
3155
-
3156
3311
  public abstract void generateMipmap(int target);
3157
-
3158
3312
  public abstract void genTextures(int n, IntBuffer textures);
3159
-
3160
3313
  public abstract void deleteTextures(int n, IntBuffer textures);
3161
-
3162
3314
  public abstract void getTexParameteriv(int target, int pname, IntBuffer params);
3163
-
3164
3315
  public abstract void getTexParameterfv(int target, int pname, FloatBuffer params);
3165
-
3166
3316
  public abstract boolean isTexture(int texture);
3167
3317
 
3168
3318
  // activeTexture() and bindTexture() have some extra logic to keep track of
@@ -3193,198 +3343,141 @@ public abstract class PGL {
3193
3343
  boundTextures[activeTexUnit][1] = texture;
3194
3344
  }
3195
3345
  }
3196
-
3197
3346
  protected abstract void bindTextureImpl(int target, int texture);
3198
3347
 
3199
3348
  ///////////////////////////////////////////////////////////
3349
+
3200
3350
  // Shaders and Programs
3201
- public abstract int createShader(int type);
3202
3351
 
3352
+ public abstract int createShader(int type);
3203
3353
  public abstract void shaderSource(int shader, String source);
3204
-
3205
3354
  public abstract void compileShader(int shader);
3206
-
3207
3355
  public abstract void releaseShaderCompiler();
3208
-
3209
3356
  public abstract void deleteShader(int shader);
3210
-
3211
3357
  public abstract void shaderBinary(int count, IntBuffer shaders, int binaryFormat, Buffer binary, int length);
3212
-
3213
3358
  public abstract int createProgram();
3214
-
3215
3359
  public abstract void attachShader(int program, int shader);
3216
-
3217
3360
  public abstract void detachShader(int program, int shader);
3218
-
3219
3361
  public abstract void linkProgram(int program);
3220
-
3221
3362
  public abstract void useProgram(int program);
3222
-
3223
3363
  public abstract void deleteProgram(int program);
3224
-
3225
3364
  public abstract String getActiveAttrib(int program, int index, IntBuffer size, IntBuffer type);
3226
-
3227
3365
  public abstract int getAttribLocation(int program, String name);
3228
-
3229
3366
  public abstract void bindAttribLocation(int program, int index, String name);
3230
-
3231
3367
  public abstract int getUniformLocation(int program, String name);
3232
-
3233
3368
  public abstract String getActiveUniform(int program, int index, IntBuffer size, IntBuffer type);
3234
-
3235
3369
  public abstract void uniform1i(int location, int value);
3236
-
3237
3370
  public abstract void uniform2i(int location, int value0, int value1);
3238
-
3239
3371
  public abstract void uniform3i(int location, int value0, int value1, int value2);
3240
-
3241
3372
  public abstract void uniform4i(int location, int value0, int value1, int value2, int value3);
3242
-
3243
3373
  public abstract void uniform1f(int location, float value);
3244
-
3245
3374
  public abstract void uniform2f(int location, float value0, float value1);
3246
-
3247
3375
  public abstract void uniform3f(int location, float value0, float value1, float value2);
3248
-
3249
3376
  public abstract void uniform4f(int location, float value0, float value1, float value2, float value3);
3250
-
3251
3377
  public abstract void uniform1iv(int location, int count, IntBuffer v);
3252
-
3253
3378
  public abstract void uniform2iv(int location, int count, IntBuffer v);
3254
-
3255
3379
  public abstract void uniform3iv(int location, int count, IntBuffer v);
3256
-
3257
3380
  public abstract void uniform4iv(int location, int count, IntBuffer v);
3258
-
3259
3381
  public abstract void uniform1fv(int location, int count, FloatBuffer v);
3260
-
3261
3382
  public abstract void uniform2fv(int location, int count, FloatBuffer v);
3262
-
3263
3383
  public abstract void uniform3fv(int location, int count, FloatBuffer v);
3264
-
3265
3384
  public abstract void uniform4fv(int location, int count, FloatBuffer v);
3266
-
3267
3385
  public abstract void uniformMatrix2fv(int location, int count, boolean transpose, FloatBuffer mat);
3268
-
3269
3386
  public abstract void uniformMatrix3fv(int location, int count, boolean transpose, FloatBuffer mat);
3270
-
3271
3387
  public abstract void uniformMatrix4fv(int location, int count, boolean transpose, FloatBuffer mat);
3272
-
3273
3388
  public abstract void validateProgram(int program);
3274
-
3275
3389
  public abstract boolean isShader(int shader);
3276
-
3277
3390
  public abstract void getShaderiv(int shader, int pname, IntBuffer params);
3278
-
3279
3391
  public abstract void getAttachedShaders(int program, int maxCount, IntBuffer count, IntBuffer shaders);
3280
-
3281
3392
  public abstract String getShaderInfoLog(int shader);
3282
-
3283
3393
  public abstract String getShaderSource(int shader);
3284
-
3285
3394
  public abstract void getShaderPrecisionFormat(int shaderType, int precisionType, IntBuffer range, IntBuffer precision);
3286
-
3287
3395
  public abstract void getVertexAttribfv(int index, int pname, FloatBuffer params);
3288
-
3289
3396
  public abstract void getVertexAttribiv(int index, int pname, IntBuffer params);
3290
-
3291
3397
  public abstract void getVertexAttribPointerv(int index, int pname, ByteBuffer data);
3292
-
3293
3398
  public abstract void getUniformfv(int program, int location, FloatBuffer params);
3294
-
3295
3399
  public abstract void getUniformiv(int program, int location, IntBuffer params);
3296
-
3297
3400
  public abstract boolean isProgram(int program);
3298
-
3299
3401
  public abstract void getProgramiv(int program, int pname, IntBuffer params);
3300
-
3301
3402
  public abstract String getProgramInfoLog(int program);
3302
3403
 
3303
3404
  ///////////////////////////////////////////////////////////
3405
+
3304
3406
  // Per-Fragment Operations
3305
- public abstract void scissor(int x, int y, int w, int h);
3306
3407
 
3408
+ public abstract void scissor(int x, int y, int w, int h);
3307
3409
  public abstract void sampleCoverage(float value, boolean invert);
3308
-
3309
3410
  public abstract void stencilFunc(int func, int ref, int mask);
3310
-
3311
3411
  public abstract void stencilFuncSeparate(int face, int func, int ref, int mask);
3312
-
3313
3412
  public abstract void stencilOp(int sfail, int dpfail, int dppass);
3314
-
3315
3413
  public abstract void stencilOpSeparate(int face, int sfail, int dpfail, int dppass);
3316
-
3317
3414
  public abstract void depthFunc(int func);
3318
-
3319
3415
  public abstract void blendEquation(int mode);
3320
-
3321
3416
  public abstract void blendEquationSeparate(int modeRGB, int modeAlpha);
3322
-
3323
3417
  public abstract void blendFunc(int src, int dst);
3324
-
3325
3418
  public abstract void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha);
3326
-
3327
3419
  public abstract void blendColor(float red, float green, float blue, float alpha);
3328
3420
 
3329
3421
  ///////////////////////////////////////////////////////////
3422
+
3330
3423
  // Whole Framebuffer Operations
3331
- public abstract void colorMask(boolean r, boolean g, boolean b, boolean a);
3332
3424
 
3425
+ public abstract void colorMask(boolean r, boolean g, boolean b, boolean a);
3333
3426
  public abstract void depthMask(boolean mask);
3334
-
3335
3427
  public abstract void stencilMask(int mask);
3336
-
3337
3428
  public abstract void stencilMaskSeparate(int face, int mask);
3338
-
3339
3429
  public abstract void clearColor(float r, float g, float b, float a);
3340
-
3341
3430
  public abstract void clearDepth(float d);
3342
-
3343
3431
  public abstract void clearStencil(int s);
3344
-
3345
3432
  public abstract void clear(int buf);
3346
3433
 
3347
3434
  ///////////////////////////////////////////////////////////
3435
+
3348
3436
  // Framebuffers Objects
3437
+
3349
3438
  public void bindFramebuffer(int target, int framebuffer) {
3350
3439
  graphics.beginBindFramebuffer(target, framebuffer);
3351
3440
  bindFramebufferImpl(target, framebuffer);
3352
3441
  graphics.endBindFramebuffer(target, framebuffer);
3353
3442
  }
3354
-
3355
3443
  protected abstract void bindFramebufferImpl(int target, int framebuffer);
3356
3444
 
3357
3445
  public abstract void deleteFramebuffers(int n, IntBuffer framebuffers);
3358
-
3359
3446
  public abstract void genFramebuffers(int n, IntBuffer framebuffers);
3360
-
3361
3447
  public abstract void bindRenderbuffer(int target, int renderbuffer);
3362
-
3363
3448
  public abstract void deleteRenderbuffers(int n, IntBuffer renderbuffers);
3364
-
3365
3449
  public abstract void genRenderbuffers(int n, IntBuffer renderbuffers);
3366
-
3367
3450
  public abstract void renderbufferStorage(int target, int internalFormat, int width, int height);
3368
-
3369
3451
  public abstract void framebufferRenderbuffer(int target, int attachment, int rendbuferfTarget, int renderbuffer);
3370
-
3371
3452
  public abstract void framebufferTexture2D(int target, int attachment, int texTarget, int texture, int level);
3372
-
3373
3453
  public abstract int checkFramebufferStatus(int target);
3374
-
3375
3454
  public abstract boolean isFramebuffer(int framebuffer);
3376
-
3377
3455
  public abstract void getFramebufferAttachmentParameteriv(int target, int attachment, int pname, IntBuffer params);
3378
-
3379
3456
  public abstract boolean isRenderbuffer(int renderbuffer);
3380
-
3381
3457
  public abstract void getRenderbufferParameteriv(int target, int pname, IntBuffer params);
3382
-
3383
3458
  public abstract void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter);
3384
-
3385
3459
  public abstract void renderbufferStorageMultisample(int target, int samples, int format, int width, int height);
3386
-
3387
3460
  public abstract void readBuffer(int buf);
3388
-
3389
3461
  public abstract void drawBuffer(int buf);
3462
+
3463
+ ///////////////////////////////////////////////////////////
3464
+
3465
+ // Exceptions
3466
+
3467
+ /**
3468
+ * Exception for when attempting an operation requiring the graphics renderer, context, etc
3469
+ * to have been initialized before that initialization.
3470
+ */
3471
+ public class GraphicsNotInitializedException extends RuntimeException {
3472
+
3473
+ /**
3474
+ * Create a new exception indicating that an action could not be fulfilled because the rendering
3475
+ * context or equivalent is not ready.
3476
+ *
3477
+ * @param msg Further details about the issue.
3478
+ */
3479
+ public GraphicsNotInitializedException(String msg) {
3480
+ super(msg);
3481
+ }
3482
+ }
3390
3483
  }