picrate 0.7.0-java → 0.8.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.mvn/wrapper/MavenWrapperDownloader.java +117 -0
- data/.mvn/wrapper/maven-wrapper.properties +2 -1
- data/.travis.yml +2 -5
- data/CHANGELOG.md +4 -0
- data/README.md +3 -3
- data/Rakefile +15 -27
- data/docs/_config.yml +1 -1
- data/docs/_posts/2018-05-11-arch-linux-arm.md +1 -1
- data/docs/_posts/2018-11-18-building-gem.md +1 -1
- data/lib/picrate/app.rb +1 -1
- data/lib/picrate/native_folder.rb +1 -1
- data/lib/picrate/version.rb +1 -1
- data/mvnw +127 -51
- data/mvnw.cmd +182 -0
- data/pom.rb +39 -30
- data/pom.xml +50 -37
- data/src/main/java/monkstone/ColorUtil.java +1 -1
- data/src/main/java/monkstone/core/LibraryProxy.java +0 -1
- data/src/main/java/monkstone/noise/SimplexNoise.java +1 -1
- data/src/main/java/monkstone/vecmath/GfxRender.java +87 -0
- data/src/main/java/monkstone/vecmath/ShapeRender.java +1 -1
- data/src/main/java/monkstone/vecmath/vec2/Vec2.java +1 -1
- data/src/main/java/processing/awt/PGraphicsJava2D.java +48 -50
- data/src/main/java/processing/awt/PShapeJava2D.java +10 -0
- data/src/main/java/processing/awt/PSurfaceAWT.java +315 -371
- data/src/main/java/processing/core/PApplet.java +15424 -15495
- data/src/main/java/processing/core/PConstants.java +4 -4
- data/src/main/java/processing/core/PFont.java +394 -369
- data/src/main/java/processing/core/PGraphics.java +11 -10
- data/src/main/java/processing/core/PImage.java +1389 -1435
- data/src/main/java/processing/core/PMatrix2D.java +297 -294
- data/src/main/java/processing/core/PMatrix3D.java +641 -594
- data/src/main/java/processing/core/PShape.java +1755 -1784
- data/src/main/java/processing/core/PShapeOBJ.java +145 -133
- data/src/main/java/processing/core/PShapeSVG.java +808 -801
- data/src/main/java/processing/core/PStyle.java +141 -149
- data/src/main/java/processing/core/PSurface.java +111 -117
- data/src/main/java/processing/core/PSurfaceNone.java +178 -187
- data/src/main/java/processing/javafx/PGraphicsFX2D.java +349 -346
- data/src/main/java/processing/opengl/FontTexture.java +40 -59
- data/src/main/java/processing/opengl/FrameBuffer.java +28 -18
- data/src/main/java/processing/opengl/LinePath.java +7 -7
- data/src/main/java/processing/opengl/LineStroker.java +6 -10
- data/src/main/java/processing/opengl/PGL.java +56 -44
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +909 -2338
- data/src/main/java/processing/opengl/PJOGL.java +1722 -1763
- data/src/main/java/processing/opengl/PShader.java +1308 -1192
- data/src/main/java/processing/opengl/PShapeOpenGL.java +487 -1811
- data/src/main/java/processing/opengl/PSurfaceJOGL.java +482 -497
- data/src/main/java/processing/opengl/Texture.java +99 -76
- data/src/main/java/processing/opengl/VertexBuffer.java +41 -43
- data/vendors/Rakefile +1 -1
- metadata +7 -4
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
2
2
|
|
3
|
-
/*
|
3
|
+
/*
|
4
4
|
Part of the Processing project - http://processing.org
|
5
5
|
|
6
6
|
Copyright (c) 2012-15 The Processing Foundation
|
@@ -20,8 +20,7 @@
|
|
20
20
|
Public License along with this library; if not, write to the
|
21
21
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
22
22
|
Boston, MA 02111-1307 USA
|
23
|
-
*/
|
24
|
-
|
23
|
+
*/
|
25
24
|
package processing.opengl;
|
26
25
|
|
27
26
|
import processing.core.PApplet;
|
@@ -33,22 +32,21 @@ import processing.core.PImage;
|
|
33
32
|
import java.util.HashMap;
|
34
33
|
|
35
34
|
/**
|
36
|
-
* All the infrastructure needed for optimized font rendering
|
37
|
-
*
|
38
|
-
*
|
39
|
-
*
|
40
|
-
*
|
41
|
-
*
|
42
|
-
*
|
43
|
-
*
|
44
|
-
* glyphs
|
45
|
-
* in the case that the font size is very large, one single
|
46
|
-
* OpenGL texture might not be enough to store all the glyphs,
|
47
|
-
* so PFontTexture also takes care of spreading a single font
|
35
|
+
* All the infrastructure needed for optimized font rendering in OpenGL.
|
36
|
+
* Basically, this special class is needed because fonts in Processing are
|
37
|
+
* handled by a separate PImage for each glyph. For performance reasons, all
|
38
|
+
* these glyphs should be stored in a single OpenGL texture (otherwise,
|
39
|
+
* rendering a string of text would involve binding and un-binding several
|
40
|
+
* textures. PFontTexture manages the correspondence between individual glyphs
|
41
|
+
* and the large OpenGL texture containing them. Also, in the case that the font
|
42
|
+
* size is very large, one single OpenGL texture might not be enough to store
|
43
|
+
* all the glyphs, so PFontTexture also takes care of spreading a single font
|
48
44
|
* over several textures.
|
45
|
+
*
|
49
46
|
* @author Andres Colubri
|
50
47
|
*/
|
51
48
|
class FontTexture implements PConstants {
|
49
|
+
|
52
50
|
protected PGL pgl;
|
53
51
|
protected boolean is3D;
|
54
52
|
|
@@ -70,32 +68,29 @@ class FontTexture implements PConstants {
|
|
70
68
|
initTexture(pg, font);
|
71
69
|
}
|
72
70
|
|
73
|
-
|
74
71
|
protected void allocate() {
|
75
72
|
// Nothing to do here: the font textures will allocate
|
76
73
|
// themselves.
|
77
74
|
}
|
78
75
|
|
79
|
-
|
80
76
|
protected void dispose() {
|
81
|
-
for (
|
82
|
-
|
77
|
+
for (Texture texture : textures) {
|
78
|
+
texture.dispose();
|
83
79
|
}
|
84
80
|
}
|
85
81
|
|
86
|
-
|
87
|
-
protected void initTexture(PGraphicsOpenGL pg, PFont font) {
|
82
|
+
protected final void initTexture(PGraphicsOpenGL pg, PFont font) {
|
88
83
|
lastTex = -1;
|
89
84
|
|
90
85
|
int spow = PGL.nextPowerOfTwo(font.getSize());
|
91
86
|
minSize = PApplet.min(PGraphicsOpenGL.maxTextureSize,
|
92
|
-
|
87
|
+
PApplet.max(PGL.MIN_FONT_TEX_SIZE, spow));
|
93
88
|
maxSize = PApplet.min(PGraphicsOpenGL.maxTextureSize,
|
94
|
-
|
89
|
+
PApplet.max(PGL.MAX_FONT_TEX_SIZE, 2 * spow));
|
95
90
|
|
96
91
|
if (maxSize < spow) {
|
97
|
-
PGraphics.showWarning("The font size is too large to be properly "
|
98
|
-
|
92
|
+
PGraphics.showWarning("The font size is too large to be properly "
|
93
|
+
+ "displayed with OpenGL");
|
99
94
|
}
|
100
95
|
|
101
96
|
addTexture(pg);
|
@@ -104,12 +99,11 @@ class FontTexture implements PConstants {
|
|
104
99
|
offsetY = 0;
|
105
100
|
lineHeight = 0;
|
106
101
|
|
107
|
-
texinfoMap = new HashMap
|
102
|
+
texinfoMap = new HashMap<>();
|
108
103
|
glyphTexinfos = new TextureInfo[font.getGlyphCount()];
|
109
104
|
addAllGlyphsToTexture(pg, font);
|
110
105
|
}
|
111
106
|
|
112
|
-
|
113
107
|
public boolean addTexture(PGraphicsOpenGL pg) {
|
114
108
|
int w, h;
|
115
109
|
boolean resize;
|
@@ -130,14 +124,14 @@ class FontTexture implements PConstants {
|
|
130
124
|
// Bilinear sampling ensures that the texture doesn't look pixelated
|
131
125
|
// either when it is magnified or minified...
|
132
126
|
tex = new Texture(pg, w, h,
|
133
|
-
|
127
|
+
new Texture.Parameters(ARGB, Texture.BILINEAR, false));
|
134
128
|
} else {
|
135
129
|
// ...however, the effect of bilinear sampling is to add some blurriness
|
136
130
|
// to the text in its original size. In 2D, we assume that text will be
|
137
131
|
// shown at its original size, so linear sampling is chosen instead (which
|
138
132
|
// only affects minimized text).
|
139
133
|
tex = new Texture(pg, w, h,
|
140
|
-
|
134
|
+
new Texture.Parameters(ARGB, Texture.LINEAR, false));
|
141
135
|
}
|
142
136
|
|
143
137
|
if (textures == null) {
|
@@ -177,23 +171,19 @@ class FontTexture implements PConstants {
|
|
177
171
|
return resize;
|
178
172
|
}
|
179
173
|
|
180
|
-
|
181
174
|
public void begin() {
|
182
175
|
}
|
183
176
|
|
184
|
-
|
185
177
|
public void end() {
|
186
|
-
for (
|
187
|
-
pgl.disableTexturing(
|
178
|
+
for (Texture texture : textures) {
|
179
|
+
pgl.disableTexturing(texture.glTarget);
|
188
180
|
}
|
189
181
|
}
|
190
182
|
|
191
|
-
|
192
183
|
public PImage getTexture(TextureInfo info) {
|
193
184
|
return images[info.texIndex];
|
194
185
|
}
|
195
186
|
|
196
|
-
|
197
187
|
// Add all the current glyphs to opengl texture.
|
198
188
|
public void addAllGlyphsToTexture(PGraphicsOpenGL pg, PFont font) {
|
199
189
|
// loop over current glyphs.
|
@@ -202,24 +192,20 @@ class FontTexture implements PConstants {
|
|
202
192
|
}
|
203
193
|
}
|
204
194
|
|
205
|
-
|
206
195
|
public void updateGlyphsTexCoords() {
|
207
196
|
// loop over current glyphs.
|
208
|
-
for (
|
209
|
-
TextureInfo tinfo = glyphTexinfos[i];
|
197
|
+
for (TextureInfo tinfo : glyphTexinfos) {
|
210
198
|
if (tinfo != null && tinfo.texIndex == lastTex) {
|
211
199
|
tinfo.updateUV();
|
212
200
|
}
|
213
201
|
}
|
214
202
|
}
|
215
203
|
|
216
|
-
|
217
204
|
public TextureInfo getTexInfo(PFont.Glyph glyph) {
|
218
205
|
TextureInfo info = texinfoMap.get(glyph);
|
219
206
|
return info;
|
220
207
|
}
|
221
208
|
|
222
|
-
|
223
209
|
public TextureInfo addToTexture(PGraphicsOpenGL pg, PFont.Glyph glyph) {
|
224
210
|
int n = glyphTexinfos.length;
|
225
211
|
if (n == 0) {
|
@@ -229,17 +215,16 @@ class FontTexture implements PConstants {
|
|
229
215
|
return glyphTexinfos[n];
|
230
216
|
}
|
231
217
|
|
232
|
-
|
233
218
|
public boolean contextIsOutdated() {
|
234
219
|
boolean outdated = false;
|
235
|
-
for (
|
236
|
-
if (
|
220
|
+
for (Texture texture : textures) {
|
221
|
+
if (texture.contextIsOutdated()) {
|
237
222
|
outdated = true;
|
238
223
|
}
|
239
224
|
}
|
240
225
|
if (outdated) {
|
241
|
-
for (
|
242
|
-
|
226
|
+
for (Texture texture : textures) {
|
227
|
+
texture.dispose();
|
243
228
|
}
|
244
229
|
}
|
245
230
|
return outdated;
|
@@ -251,8 +236,6 @@ class FontTexture implements PConstants {
|
|
251
236
|
// tex.glWidth, tex.glHeight,
|
252
237
|
// 0, 0, tex.glWidth, tex.glHeight);
|
253
238
|
// }
|
254
|
-
|
255
|
-
|
256
239
|
// Adds this glyph to the opengl texture in PFont.
|
257
240
|
protected void addToTexture(PGraphicsOpenGL pg, int idx, PFont.Glyph glyph) {
|
258
241
|
// We add one pixel to avoid issues when sampling the font texture at
|
@@ -271,7 +254,7 @@ class FontTexture implements PConstants {
|
|
271
254
|
int[] rgba = new int[w * h];
|
272
255
|
int t = 0;
|
273
256
|
int p = 0;
|
274
|
-
if (PGL.BIG_ENDIAN)
|
257
|
+
if (PGL.BIG_ENDIAN) {
|
275
258
|
java.util.Arrays.fill(rgba, 0, w, 0xFFFFFF00); // Set the first row to blank pixels.
|
276
259
|
t = w;
|
277
260
|
for (int y = 0; y < glyph.height; y++) {
|
@@ -333,8 +316,8 @@ class FontTexture implements PConstants {
|
|
333
316
|
texinfoMap.put(glyph, tinfo);
|
334
317
|
}
|
335
318
|
|
336
|
-
|
337
319
|
class TextureInfo {
|
320
|
+
|
338
321
|
int texIndex;
|
339
322
|
int width;
|
340
323
|
int height;
|
@@ -344,7 +327,7 @@ class FontTexture implements PConstants {
|
|
344
327
|
int[] pixels;
|
345
328
|
|
346
329
|
TextureInfo(int tidx, int cropX, int cropY, int cropW, int cropH,
|
347
|
-
|
330
|
+
int[] pix) {
|
348
331
|
texIndex = tidx;
|
349
332
|
crop = new int[4];
|
350
333
|
// The region of the texture corresponding to the glyph is surrounded by a
|
@@ -359,21 +342,19 @@ class FontTexture implements PConstants {
|
|
359
342
|
updateTex();
|
360
343
|
}
|
361
344
|
|
362
|
-
|
363
|
-
void updateUV() {
|
345
|
+
final void updateUV() {
|
364
346
|
width = textures[texIndex].glWidth;
|
365
347
|
height = textures[texIndex].glHeight;
|
366
348
|
|
367
|
-
u0 = (float)crop[0] / (float)width;
|
368
|
-
u1 = u0 + (float)crop[2] / (float)width;
|
369
|
-
v0 = (float)(crop[1] + crop[3]) / (float)height;
|
370
|
-
v1 = v0 - (float)crop[3] / (float)height;
|
349
|
+
u0 = (float) crop[0] / (float) width;
|
350
|
+
u1 = u0 + (float) crop[2] / (float) width;
|
351
|
+
v0 = (float) (crop[1] + crop[3]) / (float) height;
|
352
|
+
v1 = v0 - (float) crop[3] / (float) height;
|
371
353
|
}
|
372
354
|
|
373
|
-
|
374
|
-
void updateTex() {
|
355
|
+
final void updateTex() {
|
375
356
|
textures[texIndex].setNative(pixels, crop[0] - 1, crop[1] + crop[3] - 1,
|
376
|
-
|
357
|
+
crop[2] + 2, -crop[3] + 2);
|
377
358
|
}
|
378
359
|
}
|
379
360
|
}
|
@@ -393,9 +393,7 @@ public class FrameBuffer implements PConstants {
|
|
393
393
|
"buffers.");
|
394
394
|
}
|
395
395
|
|
396
|
-
|
397
|
-
colorBufferTex[i] = textures[i];
|
398
|
-
}
|
396
|
+
System.arraycopy(textures, 0, colorBufferTex, 0, numColorBuffers);
|
399
397
|
|
400
398
|
pg.pushFramebuffer();
|
401
399
|
pg.setFramebuffer(this);
|
@@ -474,7 +472,7 @@ public class FrameBuffer implements PConstants {
|
|
474
472
|
*/
|
475
473
|
|
476
474
|
|
477
|
-
protected void allocate() {
|
475
|
+
protected final void allocate() {
|
478
476
|
dispose(); // Just in the case this object is being re-allocated.
|
479
477
|
|
480
478
|
context = pgl.getCurrentContext();
|
@@ -598,13 +596,19 @@ public class FrameBuffer implements PConstants {
|
|
598
596
|
pgl.bindRenderbuffer(PGL.RENDERBUFFER, glDepth);
|
599
597
|
|
600
598
|
int glConst = PGL.DEPTH_COMPONENT16;
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
599
|
+
switch (depthBits) {
|
600
|
+
case 16:
|
601
|
+
glConst = PGL.DEPTH_COMPONENT16;
|
602
|
+
break;
|
603
|
+
case 24:
|
604
|
+
glConst = PGL.DEPTH_COMPONENT24;
|
605
|
+
break;
|
606
|
+
case 32:
|
607
|
+
glConst = PGL.DEPTH_COMPONENT32;
|
608
|
+
break;
|
609
|
+
default:
|
610
|
+
break;
|
611
|
+
}
|
608
612
|
|
609
613
|
if (multisample) {
|
610
614
|
pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples, glConst,
|
@@ -635,13 +639,19 @@ public class FrameBuffer implements PConstants {
|
|
635
639
|
pgl.bindRenderbuffer(PGL.RENDERBUFFER, glStencil);
|
636
640
|
|
637
641
|
int glConst = PGL.STENCIL_INDEX1;
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
642
|
+
switch (stencilBits) {
|
643
|
+
case 1:
|
644
|
+
glConst = PGL.STENCIL_INDEX1;
|
645
|
+
break;
|
646
|
+
case 4:
|
647
|
+
glConst = PGL.STENCIL_INDEX4;
|
648
|
+
break;
|
649
|
+
case 8:
|
650
|
+
glConst = PGL.STENCIL_INDEX8;
|
651
|
+
break;
|
652
|
+
default:
|
653
|
+
break;
|
654
|
+
}
|
645
655
|
if (multisample) {
|
646
656
|
pgl.renderbufferStorageMultisample(PGL.RENDERBUFFER, nsamples, glConst,
|
647
657
|
width, height);
|
@@ -357,7 +357,7 @@ public class LinePath {
|
|
357
357
|
|
358
358
|
LinePath path;
|
359
359
|
|
360
|
-
static final int
|
360
|
+
static final int[] CURVE_COORDS = { 2, 2, 0 };
|
361
361
|
|
362
362
|
PathIterator(LinePath p2df) {
|
363
363
|
this.path = p2df;
|
@@ -373,14 +373,14 @@ public class LinePath {
|
|
373
373
|
*/
|
374
374
|
public int currentSegment(float[] coords) {
|
375
375
|
int type = path.pointTypes[typeIdx];
|
376
|
-
int numCoords =
|
376
|
+
int numCoords = CURVE_COORDS[type];
|
377
377
|
if (numCoords > 0) {
|
378
378
|
System.arraycopy(floatCoords, pointIdx, coords, 0, numCoords);
|
379
379
|
int color = path.pointColors[colorIdx];
|
380
380
|
coords[numCoords + 0] = (color >> 24) & 0xFF;
|
381
381
|
coords[numCoords + 1] = (color >> 16) & 0xFF;
|
382
382
|
coords[numCoords + 2] = (color >> 8) & 0xFF;
|
383
|
-
coords[numCoords + 3] = (color
|
383
|
+
coords[numCoords + 3] = (color) & 0xFF;
|
384
384
|
}
|
385
385
|
return type;
|
386
386
|
}
|
@@ -392,7 +392,7 @@ public class LinePath {
|
|
392
392
|
*/
|
393
393
|
public int currentSegment(double[] coords) {
|
394
394
|
int type = path.pointTypes[typeIdx];
|
395
|
-
int numCoords =
|
395
|
+
int numCoords = CURVE_COORDS[type];
|
396
396
|
if (numCoords > 0) {
|
397
397
|
for (int i = 0; i < numCoords; i++) {
|
398
398
|
coords[i] = floatCoords[pointIdx + i];
|
@@ -401,7 +401,7 @@ public class LinePath {
|
|
401
401
|
coords[numCoords + 0] = (color >> 24) & 0xFF;
|
402
402
|
coords[numCoords + 1] = (color >> 16) & 0xFF;
|
403
403
|
coords[numCoords + 2] = (color >> 8) & 0xFF;
|
404
|
-
coords[numCoords + 3] = (color
|
404
|
+
coords[numCoords + 3] = (color) & 0xFF;
|
405
405
|
}
|
406
406
|
return type;
|
407
407
|
}
|
@@ -427,8 +427,8 @@ public class LinePath {
|
|
427
427
|
*/
|
428
428
|
public void next() {
|
429
429
|
int type = path.pointTypes[typeIdx++];
|
430
|
-
if (0 <
|
431
|
-
pointIdx +=
|
430
|
+
if (0 < CURVE_COORDS[type]) {
|
431
|
+
pointIdx += CURVE_COORDS[type];
|
432
432
|
colorIdx++;
|
433
433
|
}
|
434
434
|
}
|
@@ -61,9 +61,9 @@ public class LineStroker {
|
|
61
61
|
|
62
62
|
private boolean[] penIncluded;
|
63
63
|
private int[] join;
|
64
|
-
private int[] offset = new int[2];
|
64
|
+
private final int[] offset = new int[2];
|
65
65
|
private int[] reverse = new int[100];
|
66
|
-
private int[] miter = new int[2];
|
66
|
+
private final int[] miter = new int[2];
|
67
67
|
private long miterLimitSq;
|
68
68
|
private int prev;
|
69
69
|
private int rindex;
|
@@ -118,7 +118,7 @@ public class LineStroker {
|
|
118
118
|
* @param output
|
119
119
|
* an output <code>LineStroker</code>.
|
120
120
|
*/
|
121
|
-
|
121
|
+
private void setOutput(LineStroker output) {
|
122
122
|
this.output = output;
|
123
123
|
}
|
124
124
|
|
@@ -141,7 +141,7 @@ public class LineStroker {
|
|
141
141
|
* required in order to produce consistently shaped end caps and
|
142
142
|
* joins.
|
143
143
|
*/
|
144
|
-
public void setParameters(int lineWidth, int capStyle, int joinStyle,
|
144
|
+
public final void setParameters(int lineWidth, int capStyle, int joinStyle,
|
145
145
|
int miterLimit, PMatrix2D transform) {
|
146
146
|
this.m00 = LinePath.FloatToS15_16(transform.m00);
|
147
147
|
this.m01 = LinePath.FloatToS15_16(transform.m01);
|
@@ -262,18 +262,14 @@ public class LineStroker {
|
|
262
262
|
if (side == 0) {
|
263
263
|
centerSide = side(cx, cy, xa, ya, xb, yb);
|
264
264
|
} else {
|
265
|
-
centerSide = (side == 1)
|
265
|
+
centerSide = (side == 1);
|
266
266
|
}
|
267
267
|
for (int i = 0; i < numPenSegments; i++) {
|
268
268
|
px = cx + pen_dx[i];
|
269
269
|
py = cy + pen_dy[i];
|
270
270
|
|
271
271
|
boolean penSide = side(px, py, xa, ya, xb, yb);
|
272
|
-
|
273
|
-
penIncluded[i] = true;
|
274
|
-
} else {
|
275
|
-
penIncluded[i] = false;
|
276
|
-
}
|
272
|
+
penIncluded[i] = penSide != centerSide;
|
277
273
|
}
|
278
274
|
|
279
275
|
int start = -1, end = -1;
|
@@ -131,12 +131,12 @@ public abstract class PGL {
|
|
131
131
|
* shorts as primitive type we have 2^15 = 32768 as the maximum number of
|
132
132
|
* vertices that can be referred to within a single VBO.
|
133
133
|
*/
|
134
|
-
protected static int MAX_VERTEX_INDEX = 32767;
|
134
|
+
protected static final int MAX_VERTEX_INDEX = 32767;
|
135
135
|
|
136
136
|
/**
|
137
137
|
*
|
138
138
|
*/
|
139
|
-
protected static int MAX_VERTEX_INDEX1 = MAX_VERTEX_INDEX + 1;
|
139
|
+
protected static final int MAX_VERTEX_INDEX1 = MAX_VERTEX_INDEX + 1;
|
140
140
|
|
141
141
|
/** Count of tessellated fill, line or point vertices that will
|
142
142
|
* trigger a flush in the immediate mode. It doesn't necessarily
|
@@ -643,7 +643,7 @@ public abstract class PGL {
|
|
643
643
|
// Constants
|
644
644
|
|
645
645
|
/** Size of different types in bytes */
|
646
|
-
protected static int SIZEOF_SHORT = Short.SIZE / 8;
|
646
|
+
protected static final int SIZEOF_SHORT = Short.SIZE / 8;
|
647
647
|
|
648
648
|
/**
|
649
649
|
*
|
@@ -827,15 +827,16 @@ public abstract class PGL {
|
|
827
827
|
* @return
|
828
828
|
*/
|
829
829
|
static public int smoothToSamples(int smooth) {
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
830
|
+
switch (smooth) {
|
831
|
+
case 0:
|
832
|
+
// smooth(0) is noSmooth(), which is 1x sampling
|
833
|
+
return 1;
|
834
|
+
case 1:
|
835
|
+
// smooth(1) means "default smoothing", which is 2x for OpenGL
|
836
|
+
return 2;
|
837
|
+
default:
|
838
|
+
// smooth(N) can be used for 4x, 8x, etc
|
839
|
+
return smooth;
|
839
840
|
}
|
840
841
|
}
|
841
842
|
|
@@ -905,7 +906,7 @@ public abstract class PGL {
|
|
905
906
|
*
|
906
907
|
* @return
|
907
908
|
*/
|
908
|
-
protected boolean isFBOBacked() {
|
909
|
+
protected boolean isFBOBacked() {
|
909
910
|
return fboLayerEnabled;
|
910
911
|
}
|
911
912
|
|
@@ -966,7 +967,7 @@ public abstract class PGL {
|
|
966
967
|
protected boolean getDepthTest() {
|
967
968
|
intBuffer.rewind();
|
968
969
|
getBooleanv(DEPTH_TEST, intBuffer);
|
969
|
-
return intBuffer.get(0)
|
970
|
+
return intBuffer.get(0) != 0;
|
970
971
|
}
|
971
972
|
|
972
973
|
/**
|
@@ -976,7 +977,7 @@ public abstract class PGL {
|
|
976
977
|
protected boolean getDepthWriteMask() {
|
977
978
|
intBuffer.rewind();
|
978
979
|
getBooleanv(DEPTH_WRITEMASK, intBuffer);
|
979
|
-
return intBuffer.get(0)
|
980
|
+
return intBuffer.get(0) != 0;
|
980
981
|
}
|
981
982
|
|
982
983
|
/**
|
@@ -1306,13 +1307,13 @@ public abstract class PGL {
|
|
1306
1307
|
float ba = ((stopButtonColor >> 24) & 0xFF) / 255f;
|
1307
1308
|
float br = ((stopButtonColor >> 16) & 0xFF) / 255f;
|
1308
1309
|
float bg = ((stopButtonColor >> 8) & 0xFF) / 255f;
|
1309
|
-
float bb = ((stopButtonColor
|
1310
|
+
float bb = ((stopButtonColor) & 0xFF) / 255f;
|
1310
1311
|
for (int i = 0; i < color.length; i++) {
|
1311
1312
|
int c = closeButtonPix[i];
|
1312
1313
|
int a = (int)(ba * ((c >> 24) & 0xFF));
|
1313
1314
|
int r = (int)(br * ((c >> 16) & 0xFF));
|
1314
1315
|
int g = (int)(bg * ((c >> 8) & 0xFF));
|
1315
|
-
int b = (int)(bb * ((c
|
1316
|
+
int b = (int)(bb * ((c) & 0xFF));
|
1316
1317
|
color[i] = javaToNativeARGB((a << 24) | (r << 16) | (g << 8) | b);
|
1317
1318
|
}
|
1318
1319
|
IntBuffer buf = allocateIntBuffer(color);
|
@@ -1614,12 +1615,18 @@ public abstract class PGL {
|
|
1614
1615
|
// separate depth and stencil buffers
|
1615
1616
|
if (0 < depthBits) {
|
1616
1617
|
int depthComponent = DEPTH_COMPONENT16;
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1621
|
-
|
1622
|
-
|
1618
|
+
switch (depthBits) {
|
1619
|
+
case 32:
|
1620
|
+
depthComponent = DEPTH_COMPONENT32;
|
1621
|
+
break;
|
1622
|
+
case 24:
|
1623
|
+
depthComponent = DEPTH_COMPONENT24;
|
1624
|
+
break;
|
1625
|
+
case 16:
|
1626
|
+
depthComponent = DEPTH_COMPONENT16;
|
1627
|
+
break;
|
1628
|
+
default:
|
1629
|
+
break;
|
1623
1630
|
}
|
1624
1631
|
|
1625
1632
|
IntBuffer depthBuf = multisample ? glMultiDepth : glDepth;
|
@@ -1638,12 +1645,18 @@ public abstract class PGL {
|
|
1638
1645
|
|
1639
1646
|
if (0 < stencilBits) {
|
1640
1647
|
int stencilIndex = STENCIL_INDEX1;
|
1641
|
-
|
1642
|
-
|
1643
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
1648
|
+
switch (stencilBits) {
|
1649
|
+
case 8:
|
1650
|
+
stencilIndex = STENCIL_INDEX8;
|
1651
|
+
break;
|
1652
|
+
case 4:
|
1653
|
+
stencilIndex = STENCIL_INDEX4;
|
1654
|
+
break;
|
1655
|
+
case 1:
|
1656
|
+
stencilIndex = STENCIL_INDEX1;
|
1657
|
+
break;
|
1658
|
+
default:
|
1659
|
+
break;
|
1647
1660
|
}
|
1648
1661
|
|
1649
1662
|
IntBuffer stencilBuf = multisample ? glMultiStencil : glStencil;
|
@@ -2824,8 +2837,7 @@ public abstract class PGL {
|
|
2824
2837
|
* @return
|
2825
2838
|
*/
|
2826
2839
|
protected static boolean containsVersionDirective(String[] shSrc) {
|
2827
|
-
for (
|
2828
|
-
String line = shSrc[i];
|
2840
|
+
for (String line : shSrc) {
|
2829
2841
|
int versionIndex = line.indexOf("#version");
|
2830
2842
|
if (versionIndex >= 0) {
|
2831
2843
|
int commentIndex = line.indexOf("//");
|
@@ -2888,7 +2900,7 @@ public abstract class PGL {
|
|
2888
2900
|
protected boolean compiled(int shader) {
|
2889
2901
|
intBuffer.rewind();
|
2890
2902
|
getShaderiv(shader, COMPILE_STATUS, intBuffer);
|
2891
|
-
return intBuffer.get(0)
|
2903
|
+
return intBuffer.get(0) != 0;
|
2892
2904
|
}
|
2893
2905
|
|
2894
2906
|
/**
|
@@ -2899,7 +2911,7 @@ public abstract class PGL {
|
|
2899
2911
|
protected boolean linked(int program) {
|
2900
2912
|
intBuffer.rewind();
|
2901
2913
|
getProgramiv(program, LINK_STATUS, intBuffer);
|
2902
|
-
return intBuffer.get(0)
|
2914
|
+
return intBuffer.get(0) != 0;
|
2903
2915
|
}
|
2904
2916
|
|
2905
2917
|
/**
|
@@ -2970,9 +2982,9 @@ public abstract class PGL {
|
|
2970
2982
|
|
2971
2983
|
int[] res = {0, 0, 0};
|
2972
2984
|
String[] parts = version.split(" ");
|
2973
|
-
for (
|
2974
|
-
if (0 <
|
2975
|
-
String
|
2985
|
+
for (String part : parts) {
|
2986
|
+
if (0 < part.indexOf(".")) {
|
2987
|
+
String[] nums = part.split("\\.");
|
2976
2988
|
try {
|
2977
2989
|
res[0] = Integer.parseInt(nums[0]);
|
2978
2990
|
} catch (NumberFormatException e) { }
|
@@ -3001,10 +3013,10 @@ public abstract class PGL {
|
|
3001
3013
|
int major = getGLVersion()[0];
|
3002
3014
|
if (major < 2) {
|
3003
3015
|
String ext = getString(EXTENSIONS);
|
3004
|
-
return ext.
|
3005
|
-
|
3006
|
-
|
3007
|
-
|
3016
|
+
return ext.contains("_framebuffer_object") &&
|
3017
|
+
ext.contains("_vertex_shader") &&
|
3018
|
+
ext.contains("_shader_objects") &&
|
3019
|
+
ext.contains("_shading_language");
|
3008
3020
|
} else {
|
3009
3021
|
return true;
|
3010
3022
|
}
|
@@ -3021,10 +3033,10 @@ public abstract class PGL {
|
|
3021
3033
|
int major = getGLVersion()[0];
|
3022
3034
|
if (major < 2) {
|
3023
3035
|
String ext = getString(EXTENSIONS);
|
3024
|
-
return ext.
|
3025
|
-
|
3026
|
-
|
3027
|
-
|
3036
|
+
return ext.contains("_fragment_shader") &&
|
3037
|
+
ext.contains("_vertex_shader") &&
|
3038
|
+
ext.contains("_shader_objects") &&
|
3039
|
+
ext.contains("_shading_language");
|
3028
3040
|
} else {
|
3029
3041
|
return true;
|
3030
3042
|
}
|