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