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.
- checksums.yaml +4 -4
- data/.mvn/extensions.xml +1 -1
- data/.mvn/wrapper/MavenWrapperDownloader.java +2 -2
- data/.mvn/wrapper/maven-wrapper.properties +2 -2
- data/.travis.yml +1 -1
- data/CHANGELOG.md +9 -1
- data/Gemfile +2 -0
- data/README.md +7 -10
- data/Rakefile +10 -11
- data/bin/propane +3 -1
- data/lib/propane.rb +4 -2
- data/lib/propane/app.rb +5 -1
- data/lib/propane/creators/sketch_class.rb +7 -1
- data/lib/propane/creators/sketch_factory.rb +4 -2
- data/lib/propane/creators/sketch_writer.rb +1 -0
- data/lib/propane/helper_methods.rb +22 -23
- data/lib/propane/helpers/numeric.rb +2 -0
- data/lib/propane/helpers/version_error.rb +1 -0
- data/lib/propane/library.rb +5 -1
- data/lib/propane/library_loader.rb +2 -0
- data/lib/propane/native_folder.rb +10 -9
- data/lib/propane/native_loader.rb +3 -0
- data/lib/propane/runner.rb +20 -14
- data/lib/propane/version.rb +2 -1
- data/library/boids/boids.rb +21 -11
- data/library/color_group/color_group.rb +2 -0
- data/library/control_panel/control_panel.rb +8 -5
- data/library/dxf/dxf.rb +2 -0
- data/library/file_chooser/chooser.rb +10 -9
- data/library/file_chooser/file_chooser.rb +10 -9
- data/library/library_proxy/library_proxy.rb +2 -0
- data/library/net/net.rb +2 -0
- data/library/slider/slider.rb +23 -22
- data/library/vector_utils/vector_utils.rb +4 -0
- data/library/video_event/video_event.rb +2 -0
- data/pom.rb +37 -36
- data/pom.xml +7 -7
- data/propane.gemspec +13 -9
- data/src/main/java/japplemenubar/JAppleMenuBar.java +3 -3
- data/src/main/java/monkstone/ColorUtil.java +1 -3
- data/src/main/java/monkstone/MathToolModule.java +1 -1
- data/src/main/java/monkstone/PropaneLibrary.java +2 -2
- data/src/main/java/monkstone/fastmath/DegLutTables.java +111 -0
- data/src/main/java/monkstone/fastmath/Deglut.java +6 -56
- data/src/main/java/monkstone/filechooser/Chooser.java +1 -1
- data/src/main/java/monkstone/noise/Noise.java +116 -0
- data/src/main/java/monkstone/noise/NoiseGenerator.java +63 -0
- data/src/main/java/monkstone/noise/NoiseMode.java +15 -0
- data/src/main/java/monkstone/noise/SimplexNoise.java +137 -103
- data/src/main/java/monkstone/noise/ValueNoise.java +170 -0
- data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +1 -1
- data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SliderBar.java +1 -1
- data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
- data/src/main/java/monkstone/slider/WheelHandler.java +1 -1
- data/src/main/java/monkstone/vecmath/package-info.java +1 -1
- data/src/main/java/monkstone/vecmath/vec2/Vec2.java +1 -1
- data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -2
- data/src/main/java/monkstone/videoevent/CaptureEvent.java +1 -1
- data/src/main/java/monkstone/videoevent/MovieEvent.java +1 -1
- data/src/main/java/monkstone/videoevent/package-info.java +1 -1
- data/src/main/java/processing/awt/PGraphicsJava2D.java +781 -285
- data/src/main/java/processing/awt/PImageAWT.java +377 -0
- data/src/main/java/processing/awt/PShapeJava2D.java +56 -52
- data/src/main/java/processing/awt/PSurfaceAWT.java +308 -208
- data/src/main/java/processing/awt/ShimAWT.java +581 -0
- data/src/main/java/processing/core/PApplet.java +13142 -13883
- data/src/main/java/processing/core/PConstants.java +477 -447
- data/src/main/java/processing/core/PFont.java +914 -880
- data/src/main/java/processing/core/PGraphics.java +152 -136
- data/src/main/java/processing/core/PImage.java +275 -372
- data/src/main/java/processing/core/PMatrix.java +172 -159
- data/src/main/java/processing/core/PMatrix2D.java +478 -415
- data/src/main/java/processing/core/PMatrix3D.java +762 -735
- data/src/main/java/processing/core/PShape.java +2887 -2651
- data/src/main/java/processing/core/PShapeOBJ.java +97 -92
- data/src/main/java/processing/core/PShapeSVG.java +1705 -1490
- data/src/main/java/processing/core/PStyle.java +40 -37
- data/src/main/java/processing/core/PSurface.java +139 -97
- data/src/main/java/processing/core/PSurfaceNone.java +296 -218
- data/src/main/java/processing/core/PVector.java +995 -963
- data/src/main/java/processing/core/ThinkDifferent.java +12 -8
- data/src/main/java/processing/data/DoubleDict.java +756 -710
- data/src/main/java/processing/data/DoubleList.java +749 -696
- data/src/main/java/processing/data/FloatDict.java +748 -702
- data/src/main/java/processing/data/FloatList.java +751 -697
- data/src/main/java/processing/data/IntDict.java +720 -673
- data/src/main/java/processing/data/IntList.java +699 -633
- data/src/main/java/processing/data/JSONArray.java +931 -873
- data/src/main/java/processing/data/JSONObject.java +1262 -1165
- data/src/main/java/processing/data/JSONTokener.java +351 -341
- data/src/main/java/processing/data/LongDict.java +710 -663
- data/src/main/java/processing/data/LongList.java +701 -635
- data/src/main/java/processing/data/Sort.java +37 -41
- data/src/main/java/processing/data/StringDict.java +525 -486
- data/src/main/java/processing/data/StringList.java +626 -580
- data/src/main/java/processing/data/Table.java +3690 -3510
- data/src/main/java/processing/data/TableRow.java +182 -183
- data/src/main/java/processing/data/XML.java +957 -883
- data/src/main/java/processing/event/Event.java +87 -67
- data/src/main/java/processing/event/KeyEvent.java +48 -41
- data/src/main/java/processing/event/MouseEvent.java +88 -113
- data/src/main/java/processing/event/TouchEvent.java +10 -6
- data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
- data/src/main/java/processing/javafx/PSurfaceFX.java +149 -121
- data/src/main/java/processing/net/Client.java +20 -20
- data/src/main/java/processing/net/Server.java +9 -9
- data/src/main/java/processing/opengl/FontTexture.java +286 -266
- data/src/main/java/processing/opengl/FrameBuffer.java +389 -377
- data/src/main/java/processing/opengl/LinePath.java +132 -89
- data/src/main/java/processing/opengl/LineStroker.java +588 -581
- data/src/main/java/processing/opengl/PGL.java +660 -567
- data/src/main/java/processing/opengl/PGraphics2D.java +408 -315
- data/src/main/java/processing/opengl/PGraphics3D.java +107 -72
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12378 -12075
- data/src/main/java/processing/opengl/PJOGL.java +1753 -1670
- data/src/main/java/processing/opengl/PShader.java +369 -461
- data/src/main/java/processing/opengl/PShapeOpenGL.java +4678 -4580
- data/src/main/java/processing/opengl/PSurfaceJOGL.java +1114 -1027
- data/src/main/java/processing/opengl/Texture.java +1492 -1401
- data/src/main/java/processing/opengl/VertexBuffer.java +57 -55
- data/test/create_test.rb +21 -20
- data/test/deglut_spec_test.rb +4 -2
- data/test/helper_methods_test.rb +49 -20
- data/test/math_tool_test.rb +39 -32
- data/test/native_folder.rb +47 -0
- data/test/respond_to_test.rb +3 -2
- data/test/sketches/key_event.rb +2 -2
- data/test/sketches/library/my_library/my_library.rb +3 -0
- data/test/test_helper.rb +2 -0
- data/test/vecmath_spec_test.rb +35 -22
- data/vendors/Rakefile +35 -40
- metadata +47 -23
- data/library/simplex_noise/simplex_noise.rb +0 -3
- data/src/main/java/processing/opengl/shaders/LightVert-brcm.glsl +0 -154
- data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +0 -154
- data/src/main/java/processing/opengl/shaders/TexLightVert-brcm.glsl +0 -160
- 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.
|
|
32
|
-
* onscreen == true, it represents the normal
|
|
33
|
-
* mechanism in OPENGL2 to return
|
|
34
|
-
*
|
|
35
|
-
* extension is
|
|
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
|
-
|
|
42
|
-
protected PGL pgl;
|
|
43
|
-
protected int context; // The context that created this framebuffer.
|
|
135
|
+
screenFb = screen;
|
|
44
136
|
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
protected boolean packedDepthStencil;
|
|
140
|
+
pixelBuffer = null;
|
|
141
|
+
}
|
|
57
142
|
|
|
58
|
-
protected boolean multisample;
|
|
59
|
-
protected int nsamples;
|
|
60
143
|
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
94
|
-
|
|
166
|
+
public void copyColor(FrameBuffer dest) {
|
|
167
|
+
copy(dest, PGL.COLOR_BUFFER_BIT);
|
|
168
|
+
}
|
|
95
169
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
colorBufferTex[i] = null;
|
|
108
|
-
}
|
|
174
|
+
public void copyStencil(FrameBuffer dest) {
|
|
175
|
+
copy(dest, PGL.STENCIL_BUFFER_BIT);
|
|
176
|
+
}
|
|
109
177
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
187
|
+
public void bind() {
|
|
188
|
+
pgl.bindFramebufferImpl(PGL.FRAMEBUFFER, glFbo);
|
|
189
|
+
}
|
|
130
190
|
|
|
131
|
-
|
|
132
|
-
|
|
191
|
+
public void disableDepthTest() {
|
|
192
|
+
noDepth = true;
|
|
193
|
+
}
|
|
133
194
|
|
|
134
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
142
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
224
|
+
public boolean hasDepthBuffer() {
|
|
225
|
+
return 0 < depthBits;
|
|
226
|
+
}
|
|
160
227
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
228
|
+
public boolean hasStencilBuffer() {
|
|
229
|
+
return 0 < stencilBits;
|
|
230
|
+
}
|
|
164
231
|
|
|
165
|
-
|
|
166
|
-
|
|
232
|
+
public void setFBO(int id) {
|
|
233
|
+
if (screenFb) {
|
|
234
|
+
glFbo = id;
|
|
167
235
|
}
|
|
236
|
+
}
|
|
168
237
|
|
|
169
|
-
|
|
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
|
-
|
|
179
|
-
pgl.bindFramebufferImpl(PGL.FRAMEBUFFER, glFbo);
|
|
180
|
-
}
|
|
240
|
+
// Color buffer setters.
|
|
181
241
|
|
|
182
|
-
public void disableDepthTest() {
|
|
183
|
-
noDepth = true;
|
|
184
|
-
}
|
|
185
242
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
218
|
-
|
|
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
|
-
|
|
222
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
238
|
-
|
|
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
|
-
|
|
242
|
-
|
|
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
|
-
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
323
|
+
///////////////////////////////////////////////////////////
|
|
269
324
|
|
|
270
|
-
|
|
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
|
-
|
|
282
|
-
|
|
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
|
-
|
|
291
|
-
|
|
331
|
+
context = pgl.getCurrentContext();
|
|
332
|
+
glres = new GLResourceFrameBuffer(this); // create the FBO resources...
|
|
292
333
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
334
|
+
if (screenFb) {
|
|
335
|
+
glFbo = 0;
|
|
336
|
+
} else {
|
|
337
|
+
if (multisample) {
|
|
338
|
+
initColorBufferMultisample();
|
|
339
|
+
}
|
|
300
340
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
|
|
373
|
-
|
|
383
|
+
protected void initColorBufferMultisample() {
|
|
384
|
+
if (screenFb) return;
|
|
374
385
|
|
|
375
|
-
|
|
376
|
-
|
|
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
|
-
|
|
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
|
-
|
|
385
|
-
|
|
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
|
-
|
|
394
|
-
|
|
399
|
+
protected void initPackedDepthStencilBuffer() {
|
|
400
|
+
if (screenFb) return;
|
|
395
401
|
|
|
396
|
-
|
|
402
|
+
if (width == 0 || height == 0) {
|
|
403
|
+
throw new RuntimeException("PFramebuffer: size undefined.");
|
|
404
|
+
}
|
|
397
405
|
|
|
398
|
-
|
|
399
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
-
|
|
420
|
-
|
|
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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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
|
-
|
|
451
|
-
PGL.RENDERBUFFER, glDepth);
|
|
438
|
+
pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepth);
|
|
452
439
|
|
|
453
|
-
|
|
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
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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
|
-
|
|
462
|
-
|
|
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
|
-
|
|
492
|
-
|
|
469
|
+
protected void initStencilBuffer() {
|
|
470
|
+
if (screenFb) return;
|
|
493
471
|
|
|
494
|
-
|
|
472
|
+
if (width == 0 || height == 0) {
|
|
473
|
+
throw new RuntimeException("PFramebuffer: size undefined.");
|
|
495
474
|
}
|
|
496
475
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
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
|
}
|