propane 2.9.0-java → 2.9.1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -0
- data/Rakefile +2 -3
- data/lib/.gitignore +1 -0
- data/lib/export.txt +2 -0
- data/lib/propane/version.rb +1 -1
- data/pom.rb +2 -49
- data/pom.xml +1 -64
- data/propane.gemspec +13 -10
- data/src/main/java/processing/awt/PGraphicsJava2D.java +29 -20
- data/src/main/java/processing/core/PApplet.java +12854 -12803
- data/src/main/java/processing/core/PGraphics.java +17 -22
- data/src/main/java/processing/core/PShape.java +42 -20
- data/src/main/java/processing/core/PShapeSVG.java +20 -5
- data/src/main/java/processing/core/PSurfaceNone.java +1 -4
- data/src/main/java/processing/data/DoubleDict.java +848 -0
- data/src/main/java/processing/data/DoubleList.java +928 -0
- data/src/main/java/processing/data/FloatDict.java +18 -2
- data/src/main/java/processing/data/FloatList.java +26 -2
- data/src/main/java/processing/data/IntDict.java +12 -3
- data/src/main/java/processing/data/IntList.java +24 -1
- data/src/main/java/processing/data/JSONObject.java +2 -2
- data/src/main/java/processing/data/LongDict.java +800 -0
- data/src/main/java/processing/data/LongList.java +937 -0
- data/src/main/java/processing/data/Sort.java +1 -1
- data/src/main/java/processing/data/StringDict.java +12 -3
- data/src/main/java/processing/data/StringList.java +25 -2
- data/src/main/java/processing/data/Table.java +16 -5
- data/src/main/java/processing/data/XML.java +8 -1
- data/src/main/java/processing/opengl/PGL.java +23 -16
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +13 -10
- data/src/main/java/processing/opengl/PJOGL.java +35 -12
- data/src/main/java/processing/opengl/shaders/LightVert-brcm.glsl +154 -0
- data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +2 -2
- data/src/main/java/processing/opengl/shaders/TexLightVert-brcm.glsl +160 -0
- data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +2 -2
- metadata +22 -13
@@ -522,7 +522,7 @@ public class StringDict {
|
|
522
522
|
}
|
523
523
|
|
524
524
|
@Override
|
525
|
-
public
|
525
|
+
public int compare(int a, int b) {
|
526
526
|
int diff = 0;
|
527
527
|
if (useKeys) {
|
528
528
|
diff = keys[a].compareToIgnoreCase(keys[b]);
|
@@ -571,8 +571,17 @@ public class StringDict {
|
|
571
571
|
|
572
572
|
|
573
573
|
/**
|
574
|
-
*
|
575
|
-
|
574
|
+
* Save tab-delimited entries to a file (TSV format, UTF-8 encoding)
|
575
|
+
*/
|
576
|
+
public void save(File file) {
|
577
|
+
PrintWriter writer = PApplet.createWriter(file);
|
578
|
+
write(writer);
|
579
|
+
writer.close();
|
580
|
+
}
|
581
|
+
|
582
|
+
|
583
|
+
/**
|
584
|
+
* Write tab-delimited entries to a PrintWriter
|
576
585
|
*/
|
577
586
|
public void write(PrintWriter writer) {
|
578
587
|
for (int i = 0; i < count; i++) {
|
@@ -1,5 +1,7 @@
|
|
1
1
|
package processing.data;
|
2
2
|
|
3
|
+
import java.io.File;
|
4
|
+
import java.io.PrintWriter;
|
3
5
|
import java.util.Arrays;
|
4
6
|
import java.util.Iterator;
|
5
7
|
import java.util.Random;
|
@@ -514,8 +516,8 @@ public class StringList implements Iterable<String> {
|
|
514
516
|
}
|
515
517
|
|
516
518
|
@Override
|
517
|
-
public
|
518
|
-
|
519
|
+
public int compare(int a, int b) {
|
520
|
+
int diff = data[a].compareToIgnoreCase(data[b]);
|
519
521
|
return reverse ? -diff : diff;
|
520
522
|
}
|
521
523
|
|
@@ -756,6 +758,27 @@ public class StringList implements Iterable<String> {
|
|
756
758
|
}
|
757
759
|
|
758
760
|
|
761
|
+
/**
|
762
|
+
* Save tab-delimited entries to a file (TSV format, UTF-8 encoding)
|
763
|
+
*/
|
764
|
+
public void save(File file) {
|
765
|
+
PrintWriter writer = PApplet.createWriter(file);
|
766
|
+
write(writer);
|
767
|
+
writer.close();
|
768
|
+
}
|
769
|
+
|
770
|
+
|
771
|
+
/**
|
772
|
+
* Write entries to a PrintWriter, one per line
|
773
|
+
*/
|
774
|
+
public void write(PrintWriter writer) {
|
775
|
+
for (int i = 0; i < count; i++) {
|
776
|
+
writer.println(data[i]);
|
777
|
+
}
|
778
|
+
writer.flush();
|
779
|
+
}
|
780
|
+
|
781
|
+
|
759
782
|
/**
|
760
783
|
* Return this dictionary as a String in JSON format.
|
761
784
|
*/
|
@@ -4333,7 +4333,7 @@ public class Table {
|
|
4333
4333
|
}
|
4334
4334
|
|
4335
4335
|
@Override
|
4336
|
-
public
|
4336
|
+
public int compare(int index1, int index2) {
|
4337
4337
|
int a = reverse ? order[index2] : order[index1];
|
4338
4338
|
int b = reverse ? order[index1] : order[index2];
|
4339
4339
|
|
@@ -4341,13 +4341,24 @@ public class Table {
|
|
4341
4341
|
case INT:
|
4342
4342
|
return getInt(a, column) - getInt(b, column);
|
4343
4343
|
case LONG:
|
4344
|
-
|
4344
|
+
long diffl = getLong(a, column) - getLong(b, column);
|
4345
|
+
return diffl == 0 ? 0 : (diffl < 0 ? -1 : 1);
|
4345
4346
|
case FLOAT:
|
4346
|
-
|
4347
|
+
float difff = getFloat(a, column) - getFloat(b, column);
|
4348
|
+
return difff == 0 ? 0 : (difff < 0 ? -1 : 1);
|
4347
4349
|
case DOUBLE:
|
4348
|
-
|
4350
|
+
double diffd = getDouble(a, column) - getDouble(b, column);
|
4351
|
+
return diffd == 0 ? 0 : (diffd < 0 ? -1 : 1);
|
4349
4352
|
case STRING:
|
4350
|
-
|
4353
|
+
String string1 = getString(a, column);
|
4354
|
+
if (string1 == null) {
|
4355
|
+
string1 = ""; // avoid NPE when cells are left empty
|
4356
|
+
}
|
4357
|
+
String string2 = getString(b, column);
|
4358
|
+
if (string2 == null) {
|
4359
|
+
string2 = "";
|
4360
|
+
}
|
4361
|
+
return string1.compareToIgnoreCase(string2);
|
4351
4362
|
case CATEGORY:
|
4352
4363
|
return getInt(a, column) - getInt(b, column);
|
4353
4364
|
default:
|
@@ -594,7 +594,14 @@ public class XML implements Serializable {
|
|
594
594
|
children = null; // TODO not efficient
|
595
595
|
}
|
596
596
|
|
597
|
-
|
597
|
+
/**
|
598
|
+
* Removes whitespace nodes.
|
599
|
+
* Those whitespace nodes are required to reconstruct the original XML's spacing and indentation.
|
600
|
+
* If you call this and use saveXML() your original spacing will be gone.
|
601
|
+
*
|
602
|
+
* @nowebref
|
603
|
+
* @brief Removes whitespace nodes
|
604
|
+
*/
|
598
605
|
public void trim() {
|
599
606
|
try {
|
600
607
|
XPathFactory xpathFactory = XPathFactory.newInstance();
|
@@ -1287,9 +1287,9 @@ public abstract class PGL {
|
|
1287
1287
|
PGL ppgl = primaryPGL ? this : graphics.getPrimaryPGL();
|
1288
1288
|
|
1289
1289
|
if (!ppgl.loadedTex2DShader || ppgl.tex2DShaderContext != ppgl.glContext) {
|
1290
|
-
String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion());
|
1290
|
+
String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion(), getGLSLVersionSuffix());
|
1291
1291
|
String vertSource = PApplet.join(preprocVertSrc, "\n");
|
1292
|
-
String[] preprocFragSrc = preprocessFragmentSource(tex2DFragShaderSource, getGLSLVersion());
|
1292
|
+
String[] preprocFragSrc = preprocessFragmentSource(tex2DFragShaderSource, getGLSLVersion(), getGLSLVersionSuffix());
|
1293
1293
|
String fragSource = PApplet.join(preprocFragSrc, "\n");
|
1294
1294
|
ppgl.tex2DVertShader = createShader(VERTEX_SHADER, vertSource);
|
1295
1295
|
ppgl.tex2DFragShader = createShader(FRAGMENT_SHADER, fragSource);
|
@@ -1419,9 +1419,9 @@ public abstract class PGL {
|
|
1419
1419
|
PGL ppgl = primaryPGL ? this : graphics.getPrimaryPGL();
|
1420
1420
|
|
1421
1421
|
if (!ppgl.loadedTexRectShader || ppgl.texRectShaderContext != ppgl.glContext) {
|
1422
|
-
String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion());
|
1422
|
+
String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion(), getGLSLVersionSuffix());
|
1423
1423
|
String vertSource = PApplet.join(preprocVertSrc, "\n");
|
1424
|
-
String[] preprocFragSrc = preprocessFragmentSource(texRectFragShaderSource, getGLSLVersion());
|
1424
|
+
String[] preprocFragSrc = preprocessFragmentSource(texRectFragShaderSource, getGLSLVersion(), getGLSLVersionSuffix());
|
1425
1425
|
String fragSource = PApplet.join(preprocFragSrc, "\n");
|
1426
1426
|
ppgl.texRectVertShader = createShader(VERTEX_SHADER, vertSource);
|
1427
1427
|
ppgl.texRectFragShader = createShader(FRAGMENT_SHADER, fragSource);
|
@@ -1848,6 +1848,7 @@ public abstract class PGL {
|
|
1848
1848
|
|
1849
1849
|
|
1850
1850
|
abstract protected int getGLSLVersion();
|
1851
|
+
abstract protected String getGLSLVersionSuffix();
|
1851
1852
|
|
1852
1853
|
|
1853
1854
|
protected String[] loadVertexShader(String filename) {
|
@@ -1880,28 +1881,29 @@ public abstract class PGL {
|
|
1880
1881
|
}
|
1881
1882
|
|
1882
1883
|
|
1883
|
-
protected String[] loadVertexShader(String filename, int version) {
|
1884
|
+
protected String[] loadVertexShader(String filename, int version, String versionSuffix) {
|
1884
1885
|
return loadVertexShader(filename);
|
1885
1886
|
}
|
1886
1887
|
|
1887
1888
|
|
1888
|
-
protected String[] loadFragmentShader(String filename, int version) {
|
1889
|
+
protected String[] loadFragmentShader(String filename, int version, String versionSuffix) {
|
1889
1890
|
return loadFragmentShader(filename);
|
1890
1891
|
}
|
1891
1892
|
|
1892
1893
|
|
1893
|
-
protected String[] loadFragmentShader(URL url, int version) {
|
1894
|
+
protected String[] loadFragmentShader(URL url, int version, String versionSuffix) {
|
1894
1895
|
return loadFragmentShader(url);
|
1895
1896
|
}
|
1896
1897
|
|
1897
1898
|
|
1898
|
-
protected String[] loadVertexShader(URL url, int version) {
|
1899
|
+
protected String[] loadVertexShader(URL url, int version, String versionSuffix) {
|
1899
1900
|
return loadVertexShader(url);
|
1900
1901
|
}
|
1901
1902
|
|
1902
1903
|
|
1903
1904
|
protected static String[] preprocessFragmentSource(String[] fragSrc0,
|
1904
|
-
int version
|
1905
|
+
int version,
|
1906
|
+
String versionSuffix) {
|
1905
1907
|
if (containsVersionDirective(fragSrc0)) {
|
1906
1908
|
// The user knows what she or he is doing
|
1907
1909
|
return fragSrc0;
|
@@ -1915,7 +1917,7 @@ public abstract class PGL {
|
|
1915
1917
|
int offset = 1;
|
1916
1918
|
|
1917
1919
|
fragSrc = preprocessShaderSource(fragSrc0, search, replace, offset);
|
1918
|
-
fragSrc[0] = "#version " + version;
|
1920
|
+
fragSrc[0] = "#version " + version + versionSuffix;
|
1919
1921
|
} else {
|
1920
1922
|
// We need to replace 'texture' uniform by 'texMap' uniform and
|
1921
1923
|
// 'textureXXX()' functions by 'texture()' functions. Order of these
|
@@ -1932,15 +1934,20 @@ public abstract class PGL {
|
|
1932
1934
|
int offset = 2;
|
1933
1935
|
|
1934
1936
|
fragSrc = preprocessShaderSource(fragSrc0, search, replace, offset);
|
1935
|
-
fragSrc[0] = "#version " + version;
|
1936
|
-
|
1937
|
+
fragSrc[0] = "#version " + version + versionSuffix;
|
1938
|
+
if (" es".equals(versionSuffix)) {
|
1939
|
+
fragSrc[1] = "out mediump vec4 _fragColor;";
|
1940
|
+
} else {
|
1941
|
+
fragSrc[1] = "out vec4 _fragColor;";
|
1942
|
+
}
|
1937
1943
|
}
|
1938
1944
|
|
1939
1945
|
return fragSrc;
|
1940
1946
|
}
|
1941
1947
|
|
1942
1948
|
protected static String[] preprocessVertexSource(String[] vertSrc0,
|
1943
|
-
int version
|
1949
|
+
int version,
|
1950
|
+
String versionSuffix) {
|
1944
1951
|
if (containsVersionDirective(vertSrc0)) {
|
1945
1952
|
// The user knows what she or he is doing
|
1946
1953
|
return vertSrc0;
|
@@ -1954,7 +1961,7 @@ public abstract class PGL {
|
|
1954
1961
|
int offset = 1;
|
1955
1962
|
|
1956
1963
|
vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset);
|
1957
|
-
vertSrc[0] = "#version " + version;
|
1964
|
+
vertSrc[0] = "#version " + version + versionSuffix;
|
1958
1965
|
} else {
|
1959
1966
|
// We need to replace 'texture' uniform by 'texMap' uniform and
|
1960
1967
|
// 'textureXXX()' functions by 'texture()' functions. Order of these
|
@@ -1971,7 +1978,7 @@ public abstract class PGL {
|
|
1971
1978
|
int offset = 1;
|
1972
1979
|
|
1973
1980
|
vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset);
|
1974
|
-
vertSrc[0] = "#version " + version;
|
1981
|
+
vertSrc[0] = "#version " + version + versionSuffix;
|
1975
1982
|
}
|
1976
1983
|
|
1977
1984
|
return vertSrc;
|
@@ -2225,7 +2232,7 @@ public abstract class PGL {
|
|
2225
2232
|
|
2226
2233
|
protected boolean hasAnisoSamplingSupport() {
|
2227
2234
|
int major = getGLVersion()[0];
|
2228
|
-
if (major < 3) {
|
2235
|
+
if (isES() || major < 3) {
|
2229
2236
|
String ext = getString(EXTENSIONS);
|
2230
2237
|
return -1 < ext.indexOf("_texture_filter_anisotropic");
|
2231
2238
|
} else {
|
@@ -1561,13 +1561,14 @@ public class PGraphicsOpenGL extends PGraphics {
|
|
1561
1561
|
}
|
1562
1562
|
pgl.depthFunc(PGL.LEQUAL);
|
1563
1563
|
|
1564
|
-
if (
|
1565
|
-
//
|
1566
|
-
// ignore for now
|
1564
|
+
if (pgl.isES()) {
|
1565
|
+
// neither GL_MULTISAMPLE nor GL_POLYGON_SMOOTH are part of GLES2 or GLES3
|
1567
1566
|
} else if (smooth < 1) {
|
1568
1567
|
pgl.disable(PGL.MULTISAMPLE);
|
1569
1568
|
} else if (1 <= smooth) {
|
1570
1569
|
pgl.enable(PGL.MULTISAMPLE);
|
1570
|
+
}
|
1571
|
+
if (!pgl.isES()) {
|
1571
1572
|
pgl.disable(PGL.POLYGON_SMOOTH);
|
1572
1573
|
}
|
1573
1574
|
|
@@ -6775,16 +6776,14 @@ public class PGraphicsOpenGL extends PGraphics {
|
|
6775
6776
|
// quality = temp;
|
6776
6777
|
// }
|
6777
6778
|
}
|
6778
|
-
if (
|
6779
|
-
//
|
6780
|
-
// ignore for now
|
6779
|
+
if (pgl.isES()) {
|
6780
|
+
// neither GL_MULTISAMPLE nor GL_POLYGON_SMOOTH are part of GLES2 or GLES3
|
6781
6781
|
} else if (smooth < 1) {
|
6782
6782
|
pgl.disable(PGL.MULTISAMPLE);
|
6783
6783
|
} else if (1 <= smooth) {
|
6784
6784
|
pgl.enable(PGL.MULTISAMPLE);
|
6785
6785
|
}
|
6786
|
-
|
6787
|
-
if (false == OPENGL_RENDERER.equals("VideoCore IV HW")) {
|
6786
|
+
if (!pgl.isES()) {
|
6788
6787
|
pgl.disable(PGL.POLYGON_SMOOTH);
|
6789
6788
|
}
|
6790
6789
|
|
@@ -6895,8 +6894,12 @@ public class PGraphicsOpenGL extends PGraphics {
|
|
6895
6894
|
|
6896
6895
|
// overwrite the default shaders with vendor specific versions
|
6897
6896
|
// if needed
|
6898
|
-
if (OPENGL_RENDERER.equals("VideoCore IV HW")
|
6899
|
-
|
6897
|
+
if (OPENGL_RENDERER.equals("VideoCore IV HW")) { // Broadcom's binary driver for Raspberry Pi
|
6898
|
+
defLightShaderVertURL =
|
6899
|
+
PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/LightVert-brcm.glsl");
|
6900
|
+
defTexlightShaderVertURL =
|
6901
|
+
PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/TexLightVert-brcm.glsl");
|
6902
|
+
} else if (OPENGL_RENDERER.contains("VC4")) { // Mesa driver for same hardware
|
6900
6903
|
defLightShaderVertURL =
|
6901
6904
|
PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/LightVert-vc4.glsl");
|
6902
6905
|
defTexlightShaderVertURL =
|
@@ -503,6 +503,7 @@ public class PJOGL extends PGL {
|
|
503
503
|
return ((Font) font).deriveFont(size);
|
504
504
|
}
|
505
505
|
|
506
|
+
|
506
507
|
@Override
|
507
508
|
protected int getGLSLVersion() {
|
508
509
|
VersionNumber vn = context.getGLSLVersionNumber();
|
@@ -510,49 +511,60 @@ public class PJOGL extends PGL {
|
|
510
511
|
}
|
511
512
|
|
512
513
|
|
514
|
+
@Override
|
515
|
+
protected String getGLSLVersionSuffix() {
|
516
|
+
VersionNumber vn = context.getGLSLVersionNumber();
|
517
|
+
if (context.isGLESProfile() && 1 < vn.getMajor()) {
|
518
|
+
return " es";
|
519
|
+
} else {
|
520
|
+
return "";
|
521
|
+
}
|
522
|
+
}
|
523
|
+
|
524
|
+
|
513
525
|
@Override
|
514
526
|
protected String[] loadVertexShader(String filename) {
|
515
|
-
return loadVertexShader(filename, getGLSLVersion());
|
527
|
+
return loadVertexShader(filename, getGLSLVersion(), getGLSLVersionSuffix());
|
516
528
|
}
|
517
529
|
|
518
530
|
|
519
531
|
@Override
|
520
532
|
protected String[] loadFragmentShader(String filename) {
|
521
|
-
return loadFragmentShader(filename, getGLSLVersion());
|
533
|
+
return loadFragmentShader(filename, getGLSLVersion(), getGLSLVersionSuffix());
|
522
534
|
}
|
523
535
|
|
524
536
|
|
525
537
|
@Override
|
526
538
|
protected String[] loadVertexShader(URL url) {
|
527
|
-
return loadVertexShader(url, getGLSLVersion());
|
539
|
+
return loadVertexShader(url, getGLSLVersion(), getGLSLVersionSuffix());
|
528
540
|
}
|
529
541
|
|
530
542
|
|
531
543
|
@Override
|
532
544
|
protected String[] loadFragmentShader(URL url) {
|
533
|
-
return loadFragmentShader(url, getGLSLVersion());
|
545
|
+
return loadFragmentShader(url, getGLSLVersion(), getGLSLVersionSuffix());
|
534
546
|
}
|
535
547
|
|
536
548
|
|
537
549
|
@Override
|
538
|
-
protected String[] loadFragmentShader(String filename, int version) {
|
550
|
+
protected String[] loadFragmentShader(String filename, int version, String versionSuffix) {
|
539
551
|
String[] fragSrc0 = sketch.loadStrings(filename);
|
540
|
-
return preprocessFragmentSource(fragSrc0, version);
|
552
|
+
return preprocessFragmentSource(fragSrc0, version, versionSuffix);
|
541
553
|
}
|
542
554
|
|
543
555
|
|
544
556
|
@Override
|
545
|
-
protected String[] loadVertexShader(String filename, int version) {
|
557
|
+
protected String[] loadVertexShader(String filename, int version, String versionSuffix) {
|
546
558
|
String[] vertSrc0 = sketch.loadStrings(filename);
|
547
|
-
return preprocessVertexSource(vertSrc0, version);
|
559
|
+
return preprocessVertexSource(vertSrc0, version, versionSuffix);
|
548
560
|
}
|
549
561
|
|
550
562
|
|
551
563
|
@Override
|
552
|
-
protected String[] loadFragmentShader(URL url, int version) {
|
564
|
+
protected String[] loadFragmentShader(URL url, int version, String versionSuffix) {
|
553
565
|
try {
|
554
566
|
String[] fragSrc0 = PApplet.loadStrings(url.openStream());
|
555
|
-
return preprocessFragmentSource(fragSrc0, version);
|
567
|
+
return preprocessFragmentSource(fragSrc0, version, versionSuffix);
|
556
568
|
} catch (IOException e) {
|
557
569
|
PGraphics.showException("Cannot load fragment shader " + url.getFile());
|
558
570
|
}
|
@@ -561,10 +573,10 @@ public class PJOGL extends PGL {
|
|
561
573
|
|
562
574
|
|
563
575
|
@Override
|
564
|
-
protected String[] loadVertexShader(URL url, int version) {
|
576
|
+
protected String[] loadVertexShader(URL url, int version, String versionSuffix) {
|
565
577
|
try {
|
566
578
|
String[] vertSrc0 = PApplet.loadStrings(url.openStream());
|
567
|
-
return preprocessVertexSource(vertSrc0, version);
|
579
|
+
return preprocessVertexSource(vertSrc0, version, versionSuffix);
|
568
580
|
} catch (IOException e) {
|
569
581
|
PGraphics.showException("Cannot load vertex shader " + url.getFile());
|
570
582
|
}
|
@@ -1926,6 +1938,8 @@ public class PJOGL extends PGL {
|
|
1926
1938
|
gl2x.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
1927
1939
|
} else if (gl3 != null) {
|
1928
1940
|
gl3.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
1941
|
+
} else if (gl3es3 != null) {
|
1942
|
+
gl3es3.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
1929
1943
|
} else {
|
1930
1944
|
throw new RuntimeException(String.format(MISSING_GLFUNC_ERROR, "glBlitFramebuffer()"));
|
1931
1945
|
}
|
@@ -1937,6 +1951,8 @@ public class PJOGL extends PGL {
|
|
1937
1951
|
gl2x.glRenderbufferStorageMultisample(target, samples, format, width, height);
|
1938
1952
|
} else if (gl3 != null) {
|
1939
1953
|
gl3.glRenderbufferStorageMultisample(target, samples, format, width, height);
|
1954
|
+
} else if (gl3es3 != null) {
|
1955
|
+
gl3es3.glRenderbufferStorageMultisample(target, samples, format, width, height);
|
1940
1956
|
} else {
|
1941
1957
|
throw new RuntimeException(String.format(MISSING_GLFUNC_ERROR, "glRenderbufferStorageMultisample()"));
|
1942
1958
|
}
|
@@ -1948,6 +1964,8 @@ public class PJOGL extends PGL {
|
|
1948
1964
|
gl2x.glReadBuffer(buf);
|
1949
1965
|
} else if (gl3 != null) {
|
1950
1966
|
gl3.glReadBuffer(buf);
|
1967
|
+
} else if (gl3es3 != null) {
|
1968
|
+
gl3es3.glReadBuffer(buf);
|
1951
1969
|
} else {
|
1952
1970
|
throw new RuntimeException(String.format(MISSING_GLFUNC_ERROR, "glReadBuffer()"));
|
1953
1971
|
}
|
@@ -1959,6 +1977,11 @@ public class PJOGL extends PGL {
|
|
1959
1977
|
gl2x.glDrawBuffer(buf);
|
1960
1978
|
} else if (gl3 != null) {
|
1961
1979
|
gl3.glDrawBuffer(buf);
|
1980
|
+
} else if (gl3es3 != null) {
|
1981
|
+
IntBuffer intBuffer = IntBuffer.allocate(1);
|
1982
|
+
intBuffer.put(buf);
|
1983
|
+
intBuffer.rewind();
|
1984
|
+
gl3es3.glDrawBuffers(1, intBuffer);
|
1962
1985
|
} else {
|
1963
1986
|
throw new RuntimeException(String.format(MISSING_GLFUNC_ERROR, "glDrawBuffer()"));
|
1964
1987
|
}
|
@@ -0,0 +1,154 @@
|
|
1
|
+
/*
|
2
|
+
Part of the Processing project - http://processing.org
|
3
|
+
|
4
|
+
Copyright (c) 2012-15 The Processing Foundation
|
5
|
+
Copyright (c) 2004-12 Ben Fry and Casey Reas
|
6
|
+
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
7
|
+
|
8
|
+
This library is free software; you can redistribute it and/or
|
9
|
+
modify it under the terms of the GNU Lesser General Public
|
10
|
+
License as published by the Free Software Foundation, version 2.1.
|
11
|
+
|
12
|
+
This library is distributed in the hope that it will be useful,
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
Lesser General Public License for more details.
|
16
|
+
|
17
|
+
You should have received a copy of the GNU Lesser General
|
18
|
+
Public License along with this library; if not, write to the
|
19
|
+
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
20
|
+
Boston, MA 02111-1307 USA
|
21
|
+
*/
|
22
|
+
|
23
|
+
uniform mat4 modelviewMatrix;
|
24
|
+
uniform mat4 transformMatrix;
|
25
|
+
uniform mat3 normalMatrix;
|
26
|
+
|
27
|
+
uniform int lightCount;
|
28
|
+
uniform vec4 lightPosition[8];
|
29
|
+
uniform vec3 lightNormal[8];
|
30
|
+
uniform vec3 lightAmbient[8];
|
31
|
+
uniform vec3 lightDiffuse[8];
|
32
|
+
uniform vec3 lightSpecular[8];
|
33
|
+
uniform vec3 lightFalloff[8];
|
34
|
+
uniform vec2 lightSpot[8];
|
35
|
+
|
36
|
+
attribute vec4 position;
|
37
|
+
attribute vec4 color;
|
38
|
+
attribute vec3 normal;
|
39
|
+
|
40
|
+
attribute vec4 ambient;
|
41
|
+
attribute vec4 specular;
|
42
|
+
attribute vec4 emissive;
|
43
|
+
attribute float shininess;
|
44
|
+
|
45
|
+
varying vec4 vertColor;
|
46
|
+
varying vec4 backVertColor;
|
47
|
+
|
48
|
+
const float zero_float = 0.0;
|
49
|
+
const float one_float = 1.0;
|
50
|
+
const vec3 zero_vec3 = vec3(0.0);
|
51
|
+
const vec3 minus_one_vec3 = vec3(0.0-1.0);
|
52
|
+
|
53
|
+
float falloffFactor(vec3 lightPos, vec3 vertPos, vec3 coeff) {
|
54
|
+
vec3 lpv = lightPos - vertPos;
|
55
|
+
vec3 dist = vec3(one_float);
|
56
|
+
dist.z = dot(lpv, lpv);
|
57
|
+
dist.y = sqrt(dist.z);
|
58
|
+
return one_float / dot(dist, coeff);
|
59
|
+
}
|
60
|
+
|
61
|
+
float spotFactor(vec3 lightPos, vec3 vertPos, vec3 lightNorm, float minCos, float spotExp) {
|
62
|
+
vec3 lpv = normalize(lightPos - vertPos);
|
63
|
+
vec3 nln = minus_one_vec3 * lightNorm;
|
64
|
+
float spotCos = dot(nln, lpv);
|
65
|
+
return spotCos <= minCos ? zero_float : pow(spotCos, spotExp);
|
66
|
+
}
|
67
|
+
|
68
|
+
float lambertFactor(vec3 lightDir, vec3 vecNormal) {
|
69
|
+
return max(zero_float, dot(lightDir, vecNormal));
|
70
|
+
}
|
71
|
+
|
72
|
+
float blinnPhongFactor(vec3 lightDir, vec3 vertPos, vec3 vecNormal, float shine) {
|
73
|
+
vec3 np = normalize(vertPos);
|
74
|
+
vec3 ldp = normalize(lightDir - np);
|
75
|
+
return pow(max(zero_float, dot(ldp, vecNormal)), shine);
|
76
|
+
}
|
77
|
+
|
78
|
+
void main() {
|
79
|
+
// Vertex in clip coordinates
|
80
|
+
gl_Position = transformMatrix * position;
|
81
|
+
|
82
|
+
// Vertex in eye coordinates
|
83
|
+
vec3 ecVertex = vec3(modelviewMatrix * position);
|
84
|
+
|
85
|
+
// Normal vector in eye coordinates
|
86
|
+
vec3 ecNormal = normalize(normalMatrix * normal);
|
87
|
+
vec3 ecNormalInv = ecNormal * minus_one_vec3;
|
88
|
+
|
89
|
+
// Light calculations
|
90
|
+
vec3 totalAmbient = vec3(0, 0, 0);
|
91
|
+
|
92
|
+
vec3 totalFrontDiffuse = vec3(0, 0, 0);
|
93
|
+
vec3 totalFrontSpecular = vec3(0, 0, 0);
|
94
|
+
|
95
|
+
vec3 totalBackDiffuse = vec3(0, 0, 0);
|
96
|
+
vec3 totalBackSpecular = vec3(0, 0, 0);
|
97
|
+
|
98
|
+
// prevent register allocation failure by limiting ourselves to
|
99
|
+
// two lights for now
|
100
|
+
for (int i = 0; i < 2; i++) {
|
101
|
+
if (lightCount == i) break;
|
102
|
+
|
103
|
+
vec3 lightPos = lightPosition[i].xyz;
|
104
|
+
bool isDir = lightPosition[i].w < one_float;
|
105
|
+
float spotCos = lightSpot[i].x;
|
106
|
+
float spotExp = lightSpot[i].y;
|
107
|
+
|
108
|
+
vec3 lightDir;
|
109
|
+
float falloff;
|
110
|
+
float spotf;
|
111
|
+
|
112
|
+
if (isDir) {
|
113
|
+
falloff = one_float;
|
114
|
+
lightDir = minus_one_vec3 * lightNormal[i];
|
115
|
+
} else {
|
116
|
+
falloff = falloffFactor(lightPos, ecVertex, lightFalloff[i]);
|
117
|
+
lightDir = normalize(lightPos - ecVertex);
|
118
|
+
}
|
119
|
+
|
120
|
+
spotf = spotExp > zero_float ? spotFactor(lightPos, ecVertex, lightNormal[i],
|
121
|
+
spotCos, spotExp)
|
122
|
+
: one_float;
|
123
|
+
|
124
|
+
if (any(greaterThan(lightAmbient[i], zero_vec3))) {
|
125
|
+
totalAmbient += lightAmbient[i] * falloff;
|
126
|
+
}
|
127
|
+
|
128
|
+
if (any(greaterThan(lightDiffuse[i], zero_vec3))) {
|
129
|
+
totalFrontDiffuse += lightDiffuse[i] * falloff * spotf *
|
130
|
+
lambertFactor(lightDir, ecNormal);
|
131
|
+
totalBackDiffuse += lightDiffuse[i] * falloff * spotf *
|
132
|
+
lambertFactor(lightDir, ecNormalInv);
|
133
|
+
}
|
134
|
+
|
135
|
+
if (any(greaterThan(lightSpecular[i], zero_vec3))) {
|
136
|
+
totalFrontSpecular += lightSpecular[i] * falloff * spotf *
|
137
|
+
blinnPhongFactor(lightDir, ecVertex, ecNormal, shininess);
|
138
|
+
totalBackSpecular += lightSpecular[i] * falloff * spotf *
|
139
|
+
blinnPhongFactor(lightDir, ecVertex, ecNormalInv, shininess);
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
// Calculating final color as result of all lights (plus emissive term).
|
144
|
+
// Transparency is determined exclusively by the diffuse component.
|
145
|
+
vertColor = vec4(totalAmbient, 0) * ambient +
|
146
|
+
vec4(totalFrontDiffuse, 1) * color +
|
147
|
+
vec4(totalFrontSpecular, 0) * specular +
|
148
|
+
vec4(emissive.rgb, 0);
|
149
|
+
|
150
|
+
backVertColor = vec4(totalAmbient, 0) * ambient +
|
151
|
+
vec4(totalBackDiffuse, 1) * color +
|
152
|
+
vec4(totalBackSpecular, 0) * specular +
|
153
|
+
vec4(emissive.rgb, 0);
|
154
|
+
}
|