propane 3.4.0-java → 3.7.0.pre-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 -2
- data/.mvn/wrapper/MavenWrapperDownloader.java +2 -2
- data/.mvn/wrapper/maven-wrapper.properties +2 -2
- data/.travis.yml +2 -2
- data/CHANGELOG.md +12 -0
- data/Gemfile +2 -0
- data/README.md +17 -8
- data/Rakefile +10 -11
- data/bin/propane +3 -1
- data/lib/propane.rb +6 -4
- data/lib/propane/app.rb +20 -10
- 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 +23 -24
- 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 +14 -6
- data/lib/propane/version.rb +2 -1
- data/library/boids/boids.rb +21 -11
- data/library/color_group/color_group.rb +28 -0
- data/library/control_panel/control_panel.rb +8 -5
- data/library/dxf/dxf.rb +6 -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 +7 -0
- data/library/simplex_noise/simplex_noise.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 +4 -1
- data/pom.rb +37 -36
- data/pom.xml +7 -7
- data/propane.gemspec +16 -12
- data/src/main/java/monkstone/ColorUtil.java +13 -1
- data/src/main/java/monkstone/MathToolModule.java +253 -203
- data/src/main/java/monkstone/PropaneLibrary.java +2 -2
- data/src/main/java/monkstone/fastmath/Deglut.java +1 -1
- data/src/main/java/monkstone/filechooser/Chooser.java +2 -1
- data/src/main/java/monkstone/noise/SimplexNoise.java +2 -2
- 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 +7 -6
- 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 +3 -3
- data/src/main/java/monkstone/videoevent/CaptureEvent.java +27 -0
- data/src/main/java/monkstone/videoevent/{VideoInterface.java → MovieEvent.java} +11 -27
- 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 +309 -209
- data/src/main/java/processing/awt/ShimAWT.java +581 -0
- data/src/main/java/processing/core/PApplet.java +4510 -4503
- 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 +193 -177
- data/src/main/java/processing/core/PImage.java +611 -309
- 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 +2888 -2652
- 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 +997 -965
- data/src/main/java/processing/core/ThinkDifferent.java +15 -13
- 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/dxf/RawDXF.java +404 -0
- 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 +744 -0
- data/src/main/java/processing/net/Server.java +388 -0
- data/src/main/java/processing/opengl/FontTexture.java +289 -270
- data/src/main/java/processing/opengl/FrameBuffer.java +386 -364
- data/src/main/java/processing/opengl/LinePath.java +547 -500
- data/src/main/java/processing/opengl/LineStroker.java +588 -581
- data/src/main/java/processing/opengl/PGL.java +3047 -2914
- 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 +1266 -1257
- 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 +33 -62
- metadata +56 -48
- data/src/main/java/processing/core/util/image/ImageLoadFacade.java +0 -161
- data/src/main/java/processing/core/util/image/ImageSaveFacade.java +0 -169
- data/src/main/java/processing/core/util/image/constants/TifConstants.java +0 -45
- data/src/main/java/processing/core/util/image/load/AwtImageLoadStrategy.java +0 -80
- data/src/main/java/processing/core/util/image/load/Base64StringImageLoadStrategy.java +0 -73
- data/src/main/java/processing/core/util/image/load/FallbackImageLoadStrategy.java +0 -70
- data/src/main/java/processing/core/util/image/load/ImageIoImageLoadStrategy.java +0 -132
- data/src/main/java/processing/core/util/image/load/ImageLoadStrategy.java +0 -48
- data/src/main/java/processing/core/util/image/load/ImageLoadUtil.java +0 -45
- data/src/main/java/processing/core/util/image/load/TgaImageLoadStrategy.java +0 -255
- data/src/main/java/processing/core/util/image/load/TiffImageLoadStrategy.java +0 -98
- data/src/main/java/processing/core/util/image/save/ImageSaveStrategy.java +0 -49
- data/src/main/java/processing/core/util/image/save/ImageSaveUtil.java +0 -48
- data/src/main/java/processing/core/util/image/save/ImageWriterImageSaveStrategy.java +0 -179
- data/src/main/java/processing/core/util/image/save/SaveImageException.java +0 -41
- data/src/main/java/processing/core/util/image/save/TgaImageSaveStrategy.java +0 -198
- data/src/main/java/processing/core/util/image/save/TiffImageSaveStrategy.java +0 -91
- data/src/main/java/processing/core/util/image/save/TiffNakedFilenameImageSaveStrategy.java +0 -57
- data/src/main/java/processing/core/util/io/InputFactory.java +0 -285
- data/src/main/java/processing/core/util/io/PathUtil.java +0 -109
- 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,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.
|
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.
|
40
48
|
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
46
|
-
|
47
|
-
|
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
|
-
|
55
|
-
|
56
|
-
|
62
|
+
protected boolean multisample;
|
63
|
+
protected int nsamples;
|
64
|
+
|
65
|
+
protected int numColorBuffers;
|
66
|
+
protected Texture[] colorBufferTex;
|
57
67
|
|
58
|
-
|
59
|
-
|
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
|
-
|
65
|
-
|
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
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
76
|
-
|
77
|
-
|
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
|
-
|
97
|
-
|
98
|
-
|
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
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
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
|
-
|
166
|
+
public void copyColor(FrameBuffer dest) {
|
167
|
+
copy(dest, PGL.COLOR_BUFFER_BIT);
|
168
|
+
}
|
130
169
|
|
131
|
-
|
132
|
-
|
170
|
+
public void copyDepth(FrameBuffer dest) {
|
171
|
+
copy(dest, PGL.DEPTH_BUFFER_BIT);
|
172
|
+
}
|
133
173
|
|
134
|
-
|
135
|
-
|
174
|
+
public void copyStencil(FrameBuffer dest) {
|
175
|
+
copy(dest, PGL.STENCIL_BUFFER_BIT);
|
176
|
+
}
|
136
177
|
|
137
|
-
|
138
|
-
|
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
|
-
|
142
|
-
|
143
|
-
|
187
|
+
public void bind() {
|
188
|
+
pgl.bindFramebufferImpl(PGL.FRAMEBUFFER, glFbo);
|
189
|
+
}
|
144
190
|
|
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
|
-
}
|
191
|
+
public void disableDepthTest() {
|
192
|
+
noDepth = true;
|
193
|
+
}
|
156
194
|
|
157
|
-
|
158
|
-
|
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
|
-
|
162
|
-
|
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
|
-
|
166
|
-
|
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
|
-
|
170
|
-
|
171
|
-
|
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
|
-
|
179
|
-
|
180
|
-
|
224
|
+
public boolean hasDepthBuffer() {
|
225
|
+
return 0 < depthBits;
|
226
|
+
}
|
181
227
|
|
182
|
-
|
183
|
-
|
184
|
-
|
228
|
+
public boolean hasStencilBuffer() {
|
229
|
+
return 0 < stencilBits;
|
230
|
+
}
|
185
231
|
|
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
|
-
}
|
232
|
+
public void setFBO(int id) {
|
233
|
+
if (screenFb) {
|
234
|
+
glFbo = id;
|
195
235
|
}
|
236
|
+
}
|
196
237
|
|
197
|
-
|
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
|
-
|
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
|
-
|
218
|
-
|
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
|
-
|
226
|
-
|
227
|
-
|
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
|
-
|
238
|
-
|
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
|
-
|
242
|
-
if (screenFb) {
|
243
|
-
return;
|
244
|
-
}
|
261
|
+
System.arraycopy(textures, 0, colorBufferTex, 0, numColorBuffers);
|
245
262
|
|
246
|
-
|
247
|
-
|
248
|
-
+ "buffers.");
|
249
|
-
}
|
263
|
+
pg.pushFramebuffer();
|
264
|
+
pg.setFramebuffer(this);
|
250
265
|
|
251
|
-
|
252
|
-
|
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
|
-
|
256
|
-
|
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
|
-
|
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
|
-
|
265
|
-
|
266
|
-
colorBufferTex[i].glTarget,
|
267
|
-
colorBufferTex[i].glName, 0);
|
268
|
-
}
|
280
|
+
pg.popFramebuffer();
|
281
|
+
}
|
269
282
|
|
270
|
-
pgl.validateFramebuffer();
|
271
283
|
|
272
|
-
|
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
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
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
|
-
|
284
|
-
|
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
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
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
|
-
|
313
|
-
|
314
|
-
|
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
|
-
|
340
|
-
|
341
|
-
|
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 (
|
344
|
-
|
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
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
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
|
-
|
378
|
-
|
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
|
-
|
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
|
-
|
392
|
-
|
393
|
-
}
|
383
|
+
protected void initColorBufferMultisample() {
|
384
|
+
if (screenFb) return;
|
394
385
|
|
395
|
-
|
396
|
-
|
386
|
+
pg.pushFramebuffer();
|
387
|
+
pg.setFramebuffer(this);
|
397
388
|
|
398
|
-
|
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
|
-
|
401
|
-
|
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
|
-
|
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
|
-
|
417
|
-
|
418
|
-
return;
|
419
|
-
}
|
406
|
+
pg.pushFramebuffer();
|
407
|
+
pg.setFramebuffer(this);
|
420
408
|
|
421
|
-
|
422
|
-
throw new RuntimeException("PFramebuffer: size undefined.");
|
423
|
-
}
|
409
|
+
pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepthStencil);
|
424
410
|
|
425
|
-
|
426
|
-
|
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
|
-
|
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
|
-
|
431
|
-
|
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
|
-
|
447
|
-
|
428
|
+
protected void initDepthBuffer() {
|
429
|
+
if (screenFb) return;
|
448
430
|
|
449
|
-
|
431
|
+
if (width == 0 || height == 0) {
|
432
|
+
throw new RuntimeException("PFramebuffer: size undefined.");
|
450
433
|
}
|
451
434
|
|
452
|
-
|
453
|
-
|
454
|
-
return;
|
455
|
-
}
|
435
|
+
pg.pushFramebuffer();
|
436
|
+
pg.setFramebuffer(this);
|
456
437
|
|
457
|
-
|
458
|
-
throw new RuntimeException("PFramebuffer: size undefined.");
|
459
|
-
}
|
438
|
+
pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepth);
|
460
439
|
|
461
|
-
|
462
|
-
|
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
|
-
|
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
|
-
|
467
|
-
|
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
|
-
|
482
|
-
|
465
|
+
pg.popFramebuffer();
|
466
|
+
}
|
483
467
|
|
484
|
-
|
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
|
-
|
488
|
-
|
489
|
-
|
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
|
}
|