propane 3.4.2-java → 3.5.0-java

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