propane 3.3.1-java → 3.6.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 (157) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -2
  3. data/.mvn/wrapper/MavenWrapperDownloader.java +117 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +2 -3
  5. data/.travis.yml +9 -0
  6. data/CHANGELOG.md +17 -5
  7. data/Gemfile +2 -0
  8. data/README.md +17 -8
  9. data/Rakefile +16 -30
  10. data/bin/propane +3 -1
  11. data/lib/propane.rb +6 -4
  12. data/lib/propane/app.rb +20 -10
  13. data/lib/propane/creators/sketch_class.rb +7 -1
  14. data/lib/propane/creators/sketch_factory.rb +4 -2
  15. data/lib/propane/creators/sketch_writer.rb +1 -0
  16. data/lib/propane/helper_methods.rb +23 -24
  17. data/lib/propane/helpers/numeric.rb +2 -0
  18. data/lib/propane/helpers/version_error.rb +1 -0
  19. data/lib/propane/library.rb +5 -1
  20. data/lib/propane/library_loader.rb +2 -0
  21. data/lib/propane/native_folder.rb +21 -15
  22. data/lib/propane/native_loader.rb +3 -0
  23. data/lib/propane/runner.rb +14 -6
  24. data/lib/propane/version.rb +2 -1
  25. data/library/boids/boids.rb +21 -11
  26. data/library/color_group/color_group.rb +28 -0
  27. data/library/control_panel/control_panel.rb +8 -5
  28. data/library/dxf/dxf.rb +6 -0
  29. data/library/file_chooser/chooser.rb +10 -9
  30. data/library/file_chooser/file_chooser.rb +10 -9
  31. data/library/library_proxy/library_proxy.rb +2 -0
  32. data/library/net/net.rb +7 -0
  33. data/library/simplex_noise/simplex_noise.rb +2 -0
  34. data/library/slider/slider.rb +23 -22
  35. data/library/vector_utils/vector_utils.rb +4 -0
  36. data/library/video_event/video_event.rb +4 -1
  37. data/mvnw +127 -51
  38. data/mvnw.cmd +182 -145
  39. data/pom.rb +53 -50
  40. data/pom.xml +17 -8
  41. data/propane.gemspec +13 -11
  42. data/src/main/java/monkstone/ColorUtil.java +13 -1
  43. data/src/main/java/monkstone/MathToolModule.java +253 -203
  44. data/src/main/java/monkstone/PropaneLibrary.java +2 -2
  45. data/src/main/java/monkstone/fastmath/Deglut.java +1 -1
  46. data/src/main/java/monkstone/filechooser/Chooser.java +2 -1
  47. data/src/main/java/monkstone/noise/SimplexNoise.java +2 -2
  48. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +1 -1
  49. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
  50. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +1 -1
  51. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +1 -1
  52. data/src/main/java/monkstone/slider/SliderBar.java +1 -1
  53. data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
  54. data/src/main/java/monkstone/slider/WheelHandler.java +7 -6
  55. data/src/main/java/monkstone/vecmath/package-info.java +1 -1
  56. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +2 -2
  57. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
  58. data/src/main/java/monkstone/videoevent/CaptureEvent.java +27 -0
  59. data/src/main/java/monkstone/videoevent/{VideoInterface.java → MovieEvent.java} +11 -27
  60. data/src/main/java/monkstone/videoevent/package-info.java +1 -1
  61. data/src/main/java/processing/awt/PGraphicsJava2D.java +2164 -1661
  62. data/src/main/java/processing/awt/PImageAWT.java +377 -0
  63. data/src/main/java/processing/awt/PShapeJava2D.java +280 -268
  64. data/src/main/java/processing/awt/PSurfaceAWT.java +942 -829
  65. data/src/main/java/processing/awt/ShimAWT.java +581 -0
  66. data/src/main/java/processing/core/PApplet.java +831 -824
  67. data/src/main/java/processing/core/PConstants.java +477 -447
  68. data/src/main/java/processing/core/PFont.java +914 -880
  69. data/src/main/java/processing/core/PGraphics.java +229 -213
  70. data/src/main/java/processing/core/PImage.java +620 -318
  71. data/src/main/java/processing/core/PMatrix.java +172 -159
  72. data/src/main/java/processing/core/PMatrix2D.java +478 -409
  73. data/src/main/java/processing/core/PMatrix3D.java +762 -735
  74. data/src/main/java/processing/core/PShape.java +2888 -2652
  75. data/src/main/java/processing/core/PShapeOBJ.java +436 -415
  76. data/src/main/java/processing/core/PShapeSVG.java +1702 -1479
  77. data/src/main/java/processing/core/PStyle.java +40 -37
  78. data/src/main/java/processing/core/PSurface.java +139 -97
  79. data/src/main/java/processing/core/PSurfaceNone.java +296 -208
  80. data/src/main/java/processing/core/PVector.java +997 -965
  81. data/src/main/java/processing/core/ThinkDifferent.java +12 -17
  82. data/src/main/java/processing/data/DoubleDict.java +756 -710
  83. data/src/main/java/processing/data/DoubleList.java +749 -696
  84. data/src/main/java/processing/data/FloatDict.java +748 -702
  85. data/src/main/java/processing/data/FloatList.java +751 -697
  86. data/src/main/java/processing/data/IntDict.java +720 -673
  87. data/src/main/java/processing/data/IntList.java +699 -633
  88. data/src/main/java/processing/data/JSONArray.java +931 -873
  89. data/src/main/java/processing/data/JSONObject.java +1262 -1165
  90. data/src/main/java/processing/data/JSONTokener.java +351 -341
  91. data/src/main/java/processing/data/LongDict.java +710 -663
  92. data/src/main/java/processing/data/LongList.java +701 -635
  93. data/src/main/java/processing/data/Sort.java +37 -41
  94. data/src/main/java/processing/data/StringDict.java +525 -486
  95. data/src/main/java/processing/data/StringList.java +626 -580
  96. data/src/main/java/processing/data/Table.java +3690 -3510
  97. data/src/main/java/processing/data/TableRow.java +182 -183
  98. data/src/main/java/processing/data/XML.java +957 -883
  99. data/src/main/java/processing/dxf/RawDXF.java +404 -0
  100. data/src/main/java/processing/event/Event.java +87 -66
  101. data/src/main/java/processing/event/KeyEvent.java +48 -41
  102. data/src/main/java/processing/event/MouseEvent.java +88 -113
  103. data/src/main/java/processing/event/TouchEvent.java +10 -6
  104. data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
  105. data/src/main/java/processing/javafx/PSurfaceFX.java +149 -121
  106. data/src/main/java/processing/net/Client.java +744 -0
  107. data/src/main/java/processing/net/Server.java +388 -0
  108. data/src/main/java/processing/opengl/FontTexture.java +289 -270
  109. data/src/main/java/processing/opengl/FrameBuffer.java +386 -364
  110. data/src/main/java/processing/opengl/LinePath.java +547 -500
  111. data/src/main/java/processing/opengl/LineStroker.java +588 -581
  112. data/src/main/java/processing/opengl/PGL.java +3047 -2914
  113. data/src/main/java/processing/opengl/PGraphics2D.java +408 -315
  114. data/src/main/java/processing/opengl/PGraphics3D.java +107 -72
  115. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12378 -12075
  116. data/src/main/java/processing/opengl/PJOGL.java +1753 -1670
  117. data/src/main/java/processing/opengl/PShader.java +1266 -1257
  118. data/src/main/java/processing/opengl/PShapeOpenGL.java +4678 -4580
  119. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1114 -1027
  120. data/src/main/java/processing/opengl/Texture.java +1492 -1401
  121. data/src/main/java/processing/opengl/VertexBuffer.java +57 -55
  122. data/test/create_test.rb +21 -20
  123. data/test/deglut_spec_test.rb +4 -2
  124. data/test/helper_methods_test.rb +49 -20
  125. data/test/math_tool_test.rb +39 -32
  126. data/test/native_folder.rb +47 -0
  127. data/test/respond_to_test.rb +3 -2
  128. data/test/sketches/key_event.rb +2 -2
  129. data/test/sketches/library/my_library/my_library.rb +3 -0
  130. data/test/test_helper.rb +2 -0
  131. data/test/vecmath_spec_test.rb +35 -22
  132. data/vendors/Rakefile +33 -62
  133. metadata +54 -45
  134. data/src/main/java/processing/core/util/image/ImageLoadFacade.java +0 -161
  135. data/src/main/java/processing/core/util/image/ImageSaveFacade.java +0 -169
  136. data/src/main/java/processing/core/util/image/constants/TifConstants.java +0 -45
  137. data/src/main/java/processing/core/util/image/load/AwtImageLoadStrategy.java +0 -80
  138. data/src/main/java/processing/core/util/image/load/Base64StringImageLoadStrategy.java +0 -73
  139. data/src/main/java/processing/core/util/image/load/FallbackImageLoadStrategy.java +0 -70
  140. data/src/main/java/processing/core/util/image/load/ImageIoImageLoadStrategy.java +0 -132
  141. data/src/main/java/processing/core/util/image/load/ImageLoadStrategy.java +0 -48
  142. data/src/main/java/processing/core/util/image/load/ImageLoadUtil.java +0 -45
  143. data/src/main/java/processing/core/util/image/load/TgaImageLoadStrategy.java +0 -255
  144. data/src/main/java/processing/core/util/image/load/TiffImageLoadStrategy.java +0 -98
  145. data/src/main/java/processing/core/util/image/save/ImageSaveStrategy.java +0 -49
  146. data/src/main/java/processing/core/util/image/save/ImageSaveUtil.java +0 -48
  147. data/src/main/java/processing/core/util/image/save/ImageWriterImageSaveStrategy.java +0 -179
  148. data/src/main/java/processing/core/util/image/save/SaveImageException.java +0 -41
  149. data/src/main/java/processing/core/util/image/save/TgaImageSaveStrategy.java +0 -198
  150. data/src/main/java/processing/core/util/image/save/TiffImageSaveStrategy.java +0 -91
  151. data/src/main/java/processing/core/util/image/save/TiffNakedFilenameImageSaveStrategy.java +0 -57
  152. data/src/main/java/processing/core/util/io/InputFactory.java +0 -285
  153. data/src/main/java/processing/core/util/io/PathUtil.java +0 -109
  154. data/src/main/java/processing/opengl/shaders/LightVert-brcm.glsl +0 -154
  155. data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +0 -154
  156. data/src/main/java/processing/opengl/shaders/TexLightVert-brcm.glsl +0 -160
  157. 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 processing.core.PApplet;
@@ -28,464 +31,483 @@ import processing.opengl.PGraphicsOpenGL.GLResourceFrameBuffer;
28
31
  import java.nio.IntBuffer;
29
32
 
30
33
  /**
31
- * Encapsulates a Frame Buffer Object for offscreen rendering. When created with
32
- * onscreen == true, it represents the normal framebuffer. Needed by the stack
33
- * mechanism in OPENGL2 to return to onscreen rendering after a sequence of
34
- * pushFramebuffer calls. It transparently handles the situations when the FBO
35
- * extension is not available.
34
+ * Encapsulates a Frame Buffer Object for offscreen rendering.
35
+ * When created with onscreen == true, it represents the normal
36
+ * framebuffer. Needed by the stack mechanism in OPENGL2 to return
37
+ * to onscreen rendering after a sequence of pushFramebuffer calls.
38
+ * It transparently handles the situations when the FBO extension is
39
+ * not available.
36
40
  *
37
41
  * By Andres Colubri.
38
42
  */
43
+
39
44
  public class FrameBuffer implements PConstants {
45
+ protected PGraphicsOpenGL pg;
46
+ protected PGL pgl;
47
+ protected int context; // The context that created this framebuffer.
40
48
 
41
- protected PGraphicsOpenGL pg;
42
- protected PGL pgl;
43
- protected int context; // The context that created this framebuffer.
49
+ public int glFbo;
50
+ public int glDepth;
51
+ public int glStencil;
52
+ public int glDepthStencil;
53
+ public int glMultisample;
54
+ public int width;
55
+ public int height;
56
+ private GLResourceFrameBuffer glres;
44
57
 
45
- public int glFbo;
46
- public int glDepth;
47
- public int glStencil;
48
- public int glDepthStencil;
49
- public int glMultisample;
50
- public int width;
51
- public int height;
52
- private GLResourceFrameBuffer glres;
58
+ protected int depthBits;
59
+ protected int stencilBits;
60
+ protected boolean packedDepthStencil;
53
61
 
54
- protected int depthBits;
55
- protected int stencilBits;
56
- protected boolean packedDepthStencil;
62
+ protected boolean multisample;
63
+ protected int nsamples;
64
+
65
+ protected int numColorBuffers;
66
+ protected Texture[] colorBufferTex;
57
67
 
58
- protected boolean multisample;
59
- protected int nsamples;
68
+ protected boolean screenFb;
69
+ protected boolean noDepth;
70
+
71
+ protected IntBuffer pixelBuffer;
60
72
 
61
- protected int numColorBuffers;
62
- protected Texture[] colorBufferTex;
63
73
 
64
- protected boolean screenFb;
65
- protected boolean noDepth;
74
+ FrameBuffer(PGraphicsOpenGL pg) {
75
+ this.pg = pg;
76
+ pgl = pg.pgl;
77
+ context = pgl.createEmptyContext();
78
+ }
66
79
 
67
- protected IntBuffer pixelBuffer;
68
80
 
69
- FrameBuffer(PGraphicsOpenGL pg) {
70
- this.pg = pg;
71
- pgl = pg.pgl;
72
- context = pgl.createEmptyContext();
73
- }
81
+ FrameBuffer(PGraphicsOpenGL pg, int w, int h, int samples, int colorBuffers,
82
+ int depthBits, int stencilBits, boolean packedDepthStencil,
83
+ boolean screen) {
84
+ this(pg);
85
+
86
+ glFbo = 0;
87
+ glDepth = 0;
88
+ glStencil = 0;
89
+ glDepthStencil = 0;
90
+ glMultisample = 0;
91
+
92
+ if (screen) {
93
+ // If this framebuffer is used to represent a on-screen buffer,
94
+ // then it doesn't make it sense for it to have multisampling,
95
+ // color, depth or stencil buffers.
96
+ depthBits = stencilBits = samples = colorBuffers = 0;
97
+ }
98
+
99
+ width = w;
100
+ height = h;
101
+
102
+ if (1 < samples) {
103
+ multisample = true;
104
+ nsamples = samples;
105
+ } else {
106
+ multisample = false;
107
+ nsamples = 1;
108
+ }
109
+
110
+ numColorBuffers = colorBuffers;
111
+ colorBufferTex = new Texture[numColorBuffers];
112
+ for (int i = 0; i < numColorBuffers; i++) {
113
+ colorBufferTex[i] = null;
114
+ }
115
+
116
+ if (depthBits < 1 && stencilBits < 1) {
117
+ this.depthBits = 0;
118
+ this.stencilBits = 0;
119
+ this.packedDepthStencil = false;
120
+ } else {
121
+ if (packedDepthStencil) {
122
+ // When combined depth/stencil format is required, the depth and stencil
123
+ // bits are overriden and the 24/8 combination for a 32 bits surface is
124
+ // used.
125
+ this.depthBits = 24;
126
+ this.stencilBits = 8;
127
+ this.packedDepthStencil = true;
128
+ } else {
129
+ this.depthBits = depthBits;
130
+ this.stencilBits = stencilBits;
131
+ this.packedDepthStencil = false;
132
+ }
133
+ }
134
+
135
+ screenFb = screen;
136
+
137
+ allocate();
138
+ noDepth = false;
139
+
140
+ pixelBuffer = null;
141
+ }
142
+
74
143
 
75
- FrameBuffer(PGraphicsOpenGL pg, int w, int h, int samples, int colorBuffers,
76
- int depthBits, int stencilBits, boolean packedDepthStencil,
77
- boolean screen) {
78
- this(pg);
79
-
80
- glFbo = 0;
81
- glDepth = 0;
82
- glStencil = 0;
83
- glDepthStencil = 0;
84
- glMultisample = 0;
85
-
86
- if (screen) {
87
- // If this framebuffer is used to represent a on-screen buffer,
88
- // then it doesn't make it sense for it to have multisampling,
89
- // color, depth or stencil buffers.
90
- depthBits = stencilBits = samples = colorBuffers = 0;
91
- }
144
+ FrameBuffer(PGraphicsOpenGL pg, int w, int h) {
145
+ this(pg, w, h, 1, 1, 0, 0, false, false);
146
+ }
92
147
 
93
- width = w;
94
- height = h;
95
148
 
96
- if (1 < samples) {
97
- multisample = true;
98
- nsamples = samples;
99
- } else {
100
- multisample = false;
101
- nsamples = 1;
102
- }
149
+ FrameBuffer(PGraphicsOpenGL pg, int w, int h, boolean screen) {
150
+ this(pg, w, h, 1, 1, 0, 0, false, screen);
151
+ }
103
152
 
104
- numColorBuffers = colorBuffers;
105
- colorBufferTex = new Texture[numColorBuffers];
106
- for (int i = 0; i < numColorBuffers; i++) {
107
- colorBufferTex[i] = null;
108
- }
109
153
 
110
- if (depthBits < 1 && stencilBits < 1) {
111
- this.depthBits = 0;
112
- this.stencilBits = 0;
113
- this.packedDepthStencil = false;
114
- } else {
115
- if (packedDepthStencil) {
116
- // When combined depth/stencil format is required, the depth and stencil
117
- // bits are overriden and the 24/8 combination for a 32 bits surface is
118
- // used.
119
- this.depthBits = 24;
120
- this.stencilBits = 8;
121
- this.packedDepthStencil = true;
122
- } else {
123
- this.depthBits = depthBits;
124
- this.stencilBits = stencilBits;
125
- this.packedDepthStencil = false;
126
- }
127
- }
154
+ public void clear() {
155
+ pg.pushFramebuffer();
156
+ pg.setFramebuffer(this);
157
+ pgl.clearDepth(1);
158
+ pgl.clearStencil(0);
159
+ pgl.clearColor(0, 0, 0, 0);
160
+ pgl.clear(PGL.DEPTH_BUFFER_BIT |
161
+ PGL.STENCIL_BUFFER_BIT |
162
+ PGL.COLOR_BUFFER_BIT);
163
+ pg.popFramebuffer();
164
+ }
128
165
 
129
- screenFb = screen;
166
+ public void copyColor(FrameBuffer dest) {
167
+ copy(dest, PGL.COLOR_BUFFER_BIT);
168
+ }
130
169
 
131
- allocate();
132
- noDepth = false;
170
+ public void copyDepth(FrameBuffer dest) {
171
+ copy(dest, PGL.DEPTH_BUFFER_BIT);
172
+ }
133
173
 
134
- pixelBuffer = null;
135
- }
174
+ public void copyStencil(FrameBuffer dest) {
175
+ copy(dest, PGL.STENCIL_BUFFER_BIT);
176
+ }
136
177
 
137
- FrameBuffer(PGraphicsOpenGL pg, int w, int h) {
138
- this(pg, w, h, 1, 1, 0, 0, false, false);
139
- }
178
+ public void copy(FrameBuffer dest, int mask) {
179
+ pgl.bindFramebufferImpl(PGL.READ_FRAMEBUFFER, this.glFbo);
180
+ pgl.bindFramebufferImpl(PGL.DRAW_FRAMEBUFFER, dest.glFbo);
181
+ pgl.blitFramebuffer(0, 0, this.width, this.height,
182
+ 0, 0, dest.width, dest.height, mask, PGL.NEAREST);
183
+ pgl.bindFramebufferImpl(PGL.READ_FRAMEBUFFER, pg.getCurrentFB().glFbo);
184
+ pgl.bindFramebufferImpl(PGL.DRAW_FRAMEBUFFER, pg.getCurrentFB().glFbo);
185
+ }
140
186
 
141
- FrameBuffer(PGraphicsOpenGL pg, int w, int h, boolean screen) {
142
- this(pg, w, h, 1, 1, 0, 0, false, screen);
143
- }
187
+ public void bind() {
188
+ pgl.bindFramebufferImpl(PGL.FRAMEBUFFER, glFbo);
189
+ }
144
190
 
145
- public void clear() {
146
- pg.pushFramebuffer();
147
- pg.setFramebuffer(this);
148
- pgl.clearDepth(1);
149
- pgl.clearStencil(0);
150
- pgl.clearColor(0, 0, 0, 0);
151
- pgl.clear(PGL.DEPTH_BUFFER_BIT
152
- | PGL.STENCIL_BUFFER_BIT
153
- | PGL.COLOR_BUFFER_BIT);
154
- pg.popFramebuffer();
155
- }
191
+ public void disableDepthTest() {
192
+ noDepth = true;
193
+ }
156
194
 
157
- public void copyColor(FrameBuffer dest) {
158
- copy(dest, PGL.COLOR_BUFFER_BIT);
195
+ public void finish() {
196
+ if (noDepth) {
197
+ // No need to clear depth buffer because depth testing was disabled.
198
+ if (pg.getHint(ENABLE_DEPTH_TEST)) {
199
+ pgl.enable(PGL.DEPTH_TEST);
200
+ } else {
201
+ pgl.disable(PGL.DEPTH_TEST);
202
+ }
159
203
  }
204
+ }
160
205
 
161
- public void copyDepth(FrameBuffer dest) {
162
- copy(dest, PGL.DEPTH_BUFFER_BIT);
163
- }
206
+ public void readPixels() {
207
+ if (pixelBuffer == null) createPixelBuffer();
208
+ pixelBuffer.rewind();
209
+ pgl.readPixels(0, 0, width, height, PGL.RGBA, PGL.UNSIGNED_BYTE,
210
+ pixelBuffer);
211
+ }
164
212
 
165
- public void copyStencil(FrameBuffer dest) {
166
- copy(dest, PGL.STENCIL_BUFFER_BIT);
213
+ public void getPixels(int[] pixels) {
214
+ if (pixelBuffer != null) {
215
+ pixelBuffer.get(pixels, 0, pixels.length);
216
+ pixelBuffer.rewind();
167
217
  }
218
+ }
168
219
 
169
- public void copy(FrameBuffer dest, int mask) {
170
- pgl.bindFramebufferImpl(PGL.READ_FRAMEBUFFER, this.glFbo);
171
- pgl.bindFramebufferImpl(PGL.DRAW_FRAMEBUFFER, dest.glFbo);
172
- pgl.blitFramebuffer(0, 0, this.width, this.height,
173
- 0, 0, dest.width, dest.height, mask, PGL.NEAREST);
174
- pgl.bindFramebufferImpl(PGL.READ_FRAMEBUFFER, pg.getCurrentFB().glFbo);
175
- pgl.bindFramebufferImpl(PGL.DRAW_FRAMEBUFFER, pg.getCurrentFB().glFbo);
176
- }
220
+ public IntBuffer getPixelBuffer() {
221
+ return pixelBuffer;
222
+ }
177
223
 
178
- public void bind() {
179
- pgl.bindFramebufferImpl(PGL.FRAMEBUFFER, glFbo);
180
- }
224
+ public boolean hasDepthBuffer() {
225
+ return 0 < depthBits;
226
+ }
181
227
 
182
- public void disableDepthTest() {
183
- noDepth = true;
184
- }
228
+ public boolean hasStencilBuffer() {
229
+ return 0 < stencilBits;
230
+ }
185
231
 
186
- public void finish() {
187
- if (noDepth) {
188
- // No need to clear depth buffer because depth testing was disabled.
189
- if (pg.getHint(ENABLE_DEPTH_TEST)) {
190
- pgl.enable(PGL.DEPTH_TEST);
191
- } else {
192
- pgl.disable(PGL.DEPTH_TEST);
193
- }
194
- }
232
+ public void setFBO(int id) {
233
+ if (screenFb) {
234
+ glFbo = id;
195
235
  }
236
+ }
196
237
 
197
- public void readPixels() {
198
- if (pixelBuffer == null) {
199
- createPixelBuffer();
200
- }
201
- pixelBuffer.rewind();
202
- pgl.readPixels(0, 0, width, height, PGL.RGBA, PGL.UNSIGNED_BYTE,
203
- pixelBuffer);
204
- }
238
+ ///////////////////////////////////////////////////////////
205
239
 
206
- public void getPixels(int[] pixels) {
207
- if (pixelBuffer != null) {
208
- pixelBuffer.get(pixels, 0, pixels.length);
209
- pixelBuffer.rewind();
210
- }
211
- }
240
+ // Color buffer setters.
212
241
 
213
- public IntBuffer getPixelBuffer() {
214
- return pixelBuffer;
215
- }
216
242
 
217
- public boolean hasDepthBuffer() {
218
- return 0 < depthBits;
219
- }
243
+ public void setColorBuffer(Texture tex) {
244
+ setColorBuffers(new Texture[] { tex }, 1);
245
+ }
220
246
 
221
- public boolean hasStencilBuffer() {
222
- return 0 < stencilBits;
223
- }
224
247
 
225
- public void setFBO(int id) {
226
- if (screenFb) {
227
- glFbo = id;
228
- }
229
- }
248
+ public void setColorBuffers(Texture[] textures) {
249
+ setColorBuffers(textures, textures.length);
250
+ }
230
251
 
231
- ///////////////////////////////////////////////////////////
232
- // Color buffer setters.
233
- public void setColorBuffer(Texture tex) {
234
- setColorBuffers(new Texture[]{tex}, 1);
235
- }
236
252
 
237
- public void setColorBuffers(Texture[] textures) {
238
- setColorBuffers(textures, textures.length);
253
+ public void setColorBuffers(Texture[] textures, int n) {
254
+ if (screenFb) return;
255
+
256
+ if (numColorBuffers != PApplet.min(n, textures.length)) {
257
+ throw new RuntimeException("Wrong number of textures to set the color " +
258
+ "buffers.");
239
259
  }
240
260
 
241
- public void setColorBuffers(Texture[] textures, int n) {
242
- if (screenFb) {
243
- return;
244
- }
261
+ System.arraycopy(textures, 0, colorBufferTex, 0, numColorBuffers);
245
262
 
246
- if (numColorBuffers != PApplet.min(n, textures.length)) {
247
- throw new RuntimeException("Wrong number of textures to set the color "
248
- + "buffers.");
249
- }
263
+ pg.pushFramebuffer();
264
+ pg.setFramebuffer(this);
250
265
 
251
- for (int i = 0; i < numColorBuffers; i++) {
252
- colorBufferTex[i] = textures[i];
253
- }
266
+ // Making sure nothing is attached.
267
+ for (int i = 0; i < numColorBuffers; i++) {
268
+ pgl.framebufferTexture2D(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0 + i,
269
+ PGL.TEXTURE_2D, 0, 0);
270
+ }
254
271
 
255
- pg.pushFramebuffer();
256
- pg.setFramebuffer(this);
272
+ for (int i = 0; i < numColorBuffers; i++) {
273
+ pgl.framebufferTexture2D(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0 + i,
274
+ colorBufferTex[i].glTarget,
275
+ colorBufferTex[i].glName, 0);
276
+ }
257
277
 
258
- // Making sure nothing is attached.
259
- for (int i = 0; i < numColorBuffers; i++) {
260
- pgl.framebufferTexture2D(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0 + i,
261
- PGL.TEXTURE_2D, 0, 0);
262
- }
278
+ pgl.validateFramebuffer();
263
279
 
264
- for (int i = 0; i < numColorBuffers; i++) {
265
- pgl.framebufferTexture2D(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0 + i,
266
- colorBufferTex[i].glTarget,
267
- colorBufferTex[i].glName, 0);
268
- }
280
+ pg.popFramebuffer();
281
+ }
269
282
 
270
- pgl.validateFramebuffer();
271
283
 
272
- pg.popFramebuffer();
284
+ public void swapColorBuffers() {
285
+ for (int i = 0; i < numColorBuffers - 1; i++) {
286
+ int i1 = (i + 1);
287
+ Texture tmp = colorBufferTex[i];
288
+ colorBufferTex[i] = colorBufferTex[i1];
289
+ colorBufferTex[i1] = tmp;
273
290
  }
274
291
 
275
- public void swapColorBuffers() {
276
- for (int i = 0; i < numColorBuffers - 1; i++) {
277
- int i1 = (i + 1);
278
- Texture tmp = colorBufferTex[i];
279
- colorBufferTex[i] = colorBufferTex[i1];
280
- colorBufferTex[i1] = tmp;
281
- }
292
+ pg.pushFramebuffer();
293
+ pg.setFramebuffer(this);
294
+ for (int i = 0; i < numColorBuffers; i++) {
295
+ pgl.framebufferTexture2D(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0 + i,
296
+ colorBufferTex[i].glTarget,
297
+ colorBufferTex[i].glName, 0);
298
+ }
299
+ pgl.validateFramebuffer();
282
300
 
283
- pg.pushFramebuffer();
284
- pg.setFramebuffer(this);
285
- for (int i = 0; i < numColorBuffers; i++) {
286
- pgl.framebufferTexture2D(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0 + i,
287
- colorBufferTex[i].glTarget,
288
- colorBufferTex[i].glName, 0);
289
- }
290
- pgl.validateFramebuffer();
301
+ pg.popFramebuffer();
302
+ }
291
303
 
292
- pg.popFramebuffer();
293
- }
294
304
 
295
- public int getDefaultReadBuffer() {
296
- if (screenFb) {
297
- return pgl.getDefaultReadBuffer();
298
- } else {
299
- return PGL.COLOR_ATTACHMENT0;
300
- }
305
+ public int getDefaultReadBuffer() {
306
+ if (screenFb) {
307
+ return pgl.getDefaultReadBuffer();
308
+ } else {
309
+ return PGL.COLOR_ATTACHMENT0;
301
310
  }
311
+ }
302
312
 
303
- public int getDefaultDrawBuffer() {
304
- if (screenFb) {
305
- return pgl.getDefaultDrawBuffer();
306
- } else {
307
- return PGL.COLOR_ATTACHMENT0;
308
- }
309
- }
310
313
 
311
- ///////////////////////////////////////////////////////////
312
- // Allocate/release framebuffer.
313
- protected void allocate() {
314
- dispose(); // Just in the case this object is being re-allocated.
315
-
316
- context = pgl.getCurrentContext();
317
- glres = new GLResourceFrameBuffer(this); // create the FBO resources...
318
-
319
- if (screenFb) {
320
- glFbo = 0;
321
- } else {
322
- if (multisample) {
323
- initColorBufferMultisample();
324
- }
325
-
326
- if (packedDepthStencil) {
327
- initPackedDepthStencilBuffer();
328
- } else {
329
- if (0 < depthBits) {
330
- initDepthBuffer();
331
- }
332
- if (0 < stencilBits) {
333
- initStencilBuffer();
334
- }
335
- }
336
- }
314
+ public int getDefaultDrawBuffer() {
315
+ if (screenFb) {
316
+ return pgl.getDefaultDrawBuffer();
317
+ } else {
318
+ return PGL.COLOR_ATTACHMENT0;
337
319
  }
320
+ }
321
+
322
+
323
+ ///////////////////////////////////////////////////////////
324
+
325
+ // Allocate/release framebuffer.
326
+
327
+
328
+ protected final void allocate() {
329
+ dispose(); // Just in the case this object is being re-allocated.
330
+
331
+ context = pgl.getCurrentContext();
332
+ glres = new GLResourceFrameBuffer(this); // create the FBO resources...
338
333
 
339
- protected void dispose() {
340
- if (screenFb) {
341
- return;
334
+ if (screenFb) {
335
+ glFbo = 0;
336
+ } else {
337
+ if (multisample) {
338
+ initColorBufferMultisample();
339
+ }
340
+
341
+ if (packedDepthStencil) {
342
+ initPackedDepthStencilBuffer();
343
+ } else {
344
+ if (0 < depthBits) {
345
+ initDepthBuffer();
342
346
  }
343
- if (glres != null) {
344
- glres.dispose();
345
- glFbo = 0;
346
- glDepth = 0;
347
- glStencil = 0;
348
- glMultisample = 0;
349
- glDepthStencil = 0;
350
- glres = null;
347
+ if (0 < stencilBits) {
348
+ initStencilBuffer();
351
349
  }
350
+ }
352
351
  }
352
+ }
353
353
 
354
- protected boolean contextIsOutdated() {
355
- if (screenFb) {
356
- return false;
357
- }
358
354
 
359
- boolean outdated = !pgl.contextIsCurrent(context);
360
- if (outdated) {
361
- dispose();
362
- for (int i = 0; i < numColorBuffers; i++) {
363
- colorBufferTex[i] = null;
364
- }
365
- }
366
- return outdated;
355
+ protected void dispose() {
356
+ if (screenFb) return;
357
+ if (glres != null) {
358
+ glres.dispose();
359
+ glFbo = 0;
360
+ glDepth = 0;
361
+ glStencil = 0;
362
+ glMultisample = 0;
363
+ glDepthStencil = 0;
364
+ glres = null;
367
365
  }
366
+ }
368
367
 
369
- protected void initColorBufferMultisample() {
370
- if (screenFb) {
371
- return;
372
- }
373
-
374
- pg.pushFramebuffer();
375
- pg.setFramebuffer(this);
376
368
 
377
- pgl.bindRenderbuffer(PGL.RENDERBUFFER, glMultisample);
378
- pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples,
379
- PGL.RGBA8, width, height);
380
- pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0,
381
- PGL.RENDERBUFFER, glMultisample);
369
+ protected boolean contextIsOutdated() {
370
+ if (screenFb) return false;
382
371
 
383
- pg.popFramebuffer();
372
+ boolean outdated = !pgl.contextIsCurrent(context);
373
+ if (outdated) {
374
+ dispose();
375
+ for (int i = 0; i < numColorBuffers; i++) {
376
+ colorBufferTex[i] = null;
377
+ }
384
378
  }
379
+ return outdated;
380
+ }
385
381
 
386
- protected void initPackedDepthStencilBuffer() {
387
- if (screenFb) {
388
- return;
389
- }
390
382
 
391
- if (width == 0 || height == 0) {
392
- throw new RuntimeException("PFramebuffer: size undefined.");
393
- }
383
+ protected void initColorBufferMultisample() {
384
+ if (screenFb) return;
394
385
 
395
- pg.pushFramebuffer();
396
- pg.setFramebuffer(this);
386
+ pg.pushFramebuffer();
387
+ pg.setFramebuffer(this);
397
388
 
398
- pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepthStencil);
389
+ pgl.bindRenderbuffer(PGL.RENDERBUFFER, glMultisample);
390
+ pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples,
391
+ PGL.RGBA8, width, height);
392
+ pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0,
393
+ PGL.RENDERBUFFER, glMultisample);
399
394
 
400
- if (multisample) {
401
- pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples,
402
- PGL.DEPTH24_STENCIL8, width, height);
403
- } else {
404
- pgl.renderbufferStorage(PGL.RENDERBUFFER, PGL.DEPTH24_STENCIL8,
405
- width, height);
406
- }
395
+ pg.popFramebuffer();
396
+ }
407
397
 
408
- pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.DEPTH_ATTACHMENT,
409
- PGL.RENDERBUFFER, glDepthStencil);
410
- pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.STENCIL_ATTACHMENT,
411
- PGL.RENDERBUFFER, glDepthStencil);
412
398
 
413
- pg.popFramebuffer();
399
+ protected void initPackedDepthStencilBuffer() {
400
+ if (screenFb) return;
401
+
402
+ if (width == 0 || height == 0) {
403
+ throw new RuntimeException("PFramebuffer: size undefined.");
414
404
  }
415
405
 
416
- protected void initDepthBuffer() {
417
- if (screenFb) {
418
- return;
419
- }
406
+ pg.pushFramebuffer();
407
+ pg.setFramebuffer(this);
420
408
 
421
- if (width == 0 || height == 0) {
422
- throw new RuntimeException("PFramebuffer: size undefined.");
423
- }
409
+ pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepthStencil);
424
410
 
425
- pg.pushFramebuffer();
426
- pg.setFramebuffer(this);
411
+ if (multisample) {
412
+ pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples,
413
+ PGL.DEPTH24_STENCIL8, width, height);
414
+ } else {
415
+ pgl.renderbufferStorage(PGL.RENDERBUFFER, PGL.DEPTH24_STENCIL8,
416
+ width, height);
417
+ }
427
418
 
428
- pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepth);
419
+ pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.DEPTH_ATTACHMENT,
420
+ PGL.RENDERBUFFER, glDepthStencil);
421
+ pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.STENCIL_ATTACHMENT,
422
+ PGL.RENDERBUFFER, glDepthStencil);
429
423
 
430
- int glConst = PGL.DEPTH_COMPONENT16;
431
- if (depthBits == 16) {
432
- glConst = PGL.DEPTH_COMPONENT16;
433
- } else if (depthBits == 24) {
434
- glConst = PGL.DEPTH_COMPONENT24;
435
- } else if (depthBits == 32) {
436
- glConst = PGL.DEPTH_COMPONENT32;
437
- }
424
+ pg.popFramebuffer();
425
+ }
438
426
 
439
- if (multisample) {
440
- pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples, glConst,
441
- width, height);
442
- } else {
443
- pgl.renderbufferStorage(PGL.RENDERBUFFER, glConst, width, height);
444
- }
445
427
 
446
- pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.DEPTH_ATTACHMENT,
447
- PGL.RENDERBUFFER, glDepth);
428
+ protected void initDepthBuffer() {
429
+ if (screenFb) return;
448
430
 
449
- pg.popFramebuffer();
431
+ if (width == 0 || height == 0) {
432
+ throw new RuntimeException("PFramebuffer: size undefined.");
450
433
  }
451
434
 
452
- protected void initStencilBuffer() {
453
- if (screenFb) {
454
- return;
455
- }
435
+ pg.pushFramebuffer();
436
+ pg.setFramebuffer(this);
456
437
 
457
- if (width == 0 || height == 0) {
458
- throw new RuntimeException("PFramebuffer: size undefined.");
459
- }
438
+ pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepth);
460
439
 
461
- pg.pushFramebuffer();
462
- pg.setFramebuffer(this);
440
+ int glConst = PGL.DEPTH_COMPONENT16;
441
+ switch (depthBits) {
442
+ case 16:
443
+ glConst = PGL.DEPTH_COMPONENT16;
444
+ break;
445
+ case 24:
446
+ glConst = PGL.DEPTH_COMPONENT24;
447
+ break;
448
+ case 32:
449
+ glConst = PGL.DEPTH_COMPONENT32;
450
+ break;
451
+ default:
452
+ break;
453
+ }
463
454
 
464
- pgl.bindRenderbuffer(PGL.RENDERBUFFER, glStencil);
455
+ if (multisample) {
456
+ pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples, glConst,
457
+ width, height);
458
+ } else {
459
+ pgl.renderbufferStorage(PGL.RENDERBUFFER, glConst, width, height);
460
+ }
465
461
 
466
- int glConst = PGL.STENCIL_INDEX1;
467
- if (stencilBits == 1) {
468
- glConst = PGL.STENCIL_INDEX1;
469
- } else if (stencilBits == 4) {
470
- glConst = PGL.STENCIL_INDEX4;
471
- } else if (stencilBits == 8) {
472
- glConst = PGL.STENCIL_INDEX8;
473
- }
474
- if (multisample) {
475
- pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples, glConst,
476
- width, height);
477
- } else {
478
- pgl.renderbufferStorage(PGL.RENDERBUFFER, glConst, width, height);
479
- }
462
+ pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.DEPTH_ATTACHMENT,
463
+ PGL.RENDERBUFFER, glDepth);
480
464
 
481
- pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.STENCIL_ATTACHMENT,
482
- PGL.RENDERBUFFER, glStencil);
465
+ pg.popFramebuffer();
466
+ }
483
467
 
484
- pg.popFramebuffer();
468
+
469
+ protected void initStencilBuffer() {
470
+ if (screenFb) return;
471
+
472
+ if (width == 0 || height == 0) {
473
+ throw new RuntimeException("PFramebuffer: size undefined.");
485
474
  }
486
475
 
487
- protected void createPixelBuffer() {
488
- pixelBuffer = IntBuffer.allocate(width * height);
489
- pixelBuffer.rewind();
476
+ pg.pushFramebuffer();
477
+ pg.setFramebuffer(this);
478
+
479
+ pgl.bindRenderbuffer(PGL.RENDERBUFFER, glStencil);
480
+
481
+ int glConst = PGL.STENCIL_INDEX1;
482
+ switch (stencilBits) {
483
+ case 1:
484
+ glConst = PGL.STENCIL_INDEX1;
485
+ break;
486
+ case 4:
487
+ glConst = PGL.STENCIL_INDEX4;
488
+ break;
489
+ case 8:
490
+ glConst = PGL.STENCIL_INDEX8;
491
+ break;
492
+ default:
493
+ break;
494
+ }
495
+ if (multisample) {
496
+ pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples, glConst,
497
+ width, height);
498
+ } else {
499
+ pgl.renderbufferStorage(PGL.RENDERBUFFER, glConst, width, height);
490
500
  }
501
+
502
+ pgl.framebufferRenderbuffer(PGL.FRAMEBUFFER, PGL.STENCIL_ATTACHMENT,
503
+ PGL.RENDERBUFFER, glStencil);
504
+
505
+ pg.popFramebuffer();
506
+ }
507
+
508
+
509
+ protected void createPixelBuffer() {
510
+ pixelBuffer = IntBuffer.allocate(width * height);
511
+ pixelBuffer.rewind();
512
+ }
491
513
  }