From 15834fa3cd0a8546bb3907042919dfced59703f2 Mon Sep 17 00:00:00 2001 From: gohai Date: Thu, 15 Mar 2018 19:01:22 -0700 Subject: [PATCH 1/2] Serial: Add support for opening Raspbian-style named ports Raspbian uses "/dev/serial0" and "/dev/serial1" since a couple of releases, and users might be looking for those. Built from: https://github.com/gohai/java-simple-serial-connector/commit/4b316077c7f054bb76629e0addfb4e359cf0427d --- java/libraries/serial/library/jssc.jar | Bin 40174 -> 19748 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/java/libraries/serial/library/jssc.jar b/java/libraries/serial/library/jssc.jar index 93269cfabe6c4fd659642b50796e358f6bcfa4bf..bf5640670cd9b0c13c78a18e63ef40e8ba664ef0 100644 GIT binary patch literal 19748 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 gl}jtaQQWOx18-o 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 From 9626dfc4545b4c8c221c610ad7a37503de060d5a Mon Sep 17 00:00:00 2001 From: gohai Date: Thu, 15 Mar 2018 20:24:09 -0700 Subject: [PATCH 2/2] Increase the maximum number of lights to 4 for Mesa vc4 Testing on the latest Raspbian release shows that the open-source Mesa driver can handle 4 lights on all P3D examples without tripping up during register allocation. Still an issue with 8 lights, so leave it at 4 for now, and re-test with 6 next time around. --- .../processing/opengl/PGraphicsOpenGL.java | 8 +- .../opengl/shaders/LightVert-brcm.glsl | 154 +++++++++++++++++ .../opengl/shaders/LightVert-vc4.glsl | 4 +- .../opengl/shaders/TexLightVert-brcm.glsl | 160 ++++++++++++++++++ .../opengl/shaders/TexLightVert-vc4.glsl | 4 +- 5 files changed, 324 insertions(+), 6 deletions(-) create mode 100644 core/src/processing/opengl/shaders/LightVert-brcm.glsl create mode 100644 core/src/processing/opengl/shaders/TexLightVert-brcm.glsl diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index f2e64514af..f4cd69ec8b 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6895,8 +6895,12 @@ protected void getGLParameters() { // overwrite the default shaders with vendor specific versions // if needed - if (OPENGL_RENDERER.equals("VideoCore IV HW") || // Broadcom's binary driver for Raspberry Pi - OPENGL_RENDERER.contains("VC4")) { // Mesa driver for same hardware + if (OPENGL_RENDERER.equals("VideoCore IV HW")) { // Broadcom's binary driver for Raspberry Pi + defLightShaderVertURL = + PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/LightVert-brcm.glsl"); + defTexlightShaderVertURL = + PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/TexLightVert-brcm.glsl"); + } else if (OPENGL_RENDERER.contains("VC4")) { // Mesa driver for same hardware defLightShaderVertURL = PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/LightVert-vc4.glsl"); defTexlightShaderVertURL = diff --git a/core/src/processing/opengl/shaders/LightVert-brcm.glsl b/core/src/processing/opengl/shaders/LightVert-brcm.glsl new file mode 100644 index 0000000000..b96caa4b3b --- /dev/null +++ b/core/src/processing/opengl/shaders/LightVert-brcm.glsl @@ -0,0 +1,154 @@ +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2012-15 The Processing Foundation + Copyright (c) 2004-12 Ben Fry and Casey Reas + Copyright (c) 2001-04 Massachusetts Institute of Technology + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation, version 2.1. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +uniform mat4 modelviewMatrix; +uniform mat4 transformMatrix; +uniform mat3 normalMatrix; + +uniform int lightCount; +uniform vec4 lightPosition[8]; +uniform vec3 lightNormal[8]; +uniform vec3 lightAmbient[8]; +uniform vec3 lightDiffuse[8]; +uniform vec3 lightSpecular[8]; +uniform vec3 lightFalloff[8]; +uniform vec2 lightSpot[8]; + +attribute vec4 position; +attribute vec4 color; +attribute vec3 normal; + +attribute vec4 ambient; +attribute vec4 specular; +attribute vec4 emissive; +attribute float shininess; + +varying vec4 vertColor; +varying vec4 backVertColor; + +const float zero_float = 0.0; +const float one_float = 1.0; +const vec3 zero_vec3 = vec3(0.0); +const vec3 minus_one_vec3 = vec3(0.0-1.0); + +float falloffFactor(vec3 lightPos, vec3 vertPos, vec3 coeff) { + vec3 lpv = lightPos - vertPos; + vec3 dist = vec3(one_float); + dist.z = dot(lpv, lpv); + dist.y = sqrt(dist.z); + return one_float / dot(dist, coeff); +} + +float spotFactor(vec3 lightPos, vec3 vertPos, vec3 lightNorm, float minCos, float spotExp) { + vec3 lpv = normalize(lightPos - vertPos); + vec3 nln = minus_one_vec3 * lightNorm; + float spotCos = dot(nln, lpv); + return spotCos <= minCos ? zero_float : pow(spotCos, spotExp); +} + +float lambertFactor(vec3 lightDir, vec3 vecNormal) { + return max(zero_float, dot(lightDir, vecNormal)); +} + +float blinnPhongFactor(vec3 lightDir, vec3 vertPos, vec3 vecNormal, float shine) { + vec3 np = normalize(vertPos); + vec3 ldp = normalize(lightDir - np); + return pow(max(zero_float, dot(ldp, vecNormal)), shine); +} + +void main() { + // Vertex in clip coordinates + gl_Position = transformMatrix * position; + + // Vertex in eye coordinates + vec3 ecVertex = vec3(modelviewMatrix * position); + + // Normal vector in eye coordinates + vec3 ecNormal = normalize(normalMatrix * normal); + vec3 ecNormalInv = ecNormal * minus_one_vec3; + + // Light calculations + vec3 totalAmbient = vec3(0, 0, 0); + + vec3 totalFrontDiffuse = vec3(0, 0, 0); + vec3 totalFrontSpecular = vec3(0, 0, 0); + + vec3 totalBackDiffuse = vec3(0, 0, 0); + vec3 totalBackSpecular = vec3(0, 0, 0); + + // prevent register allocation failure by limiting ourselves to + // two lights for now + for (int i = 0; i < 2; i++) { + if (lightCount == i) break; + + vec3 lightPos = lightPosition[i].xyz; + bool isDir = lightPosition[i].w < one_float; + float spotCos = lightSpot[i].x; + float spotExp = lightSpot[i].y; + + vec3 lightDir; + float falloff; + float spotf; + + if (isDir) { + falloff = one_float; + lightDir = minus_one_vec3 * lightNormal[i]; + } else { + falloff = falloffFactor(lightPos, ecVertex, lightFalloff[i]); + lightDir = normalize(lightPos - ecVertex); + } + + spotf = spotExp > zero_float ? spotFactor(lightPos, ecVertex, lightNormal[i], + spotCos, spotExp) + : one_float; + + if (any(greaterThan(lightAmbient[i], zero_vec3))) { + totalAmbient += lightAmbient[i] * falloff; + } + + if (any(greaterThan(lightDiffuse[i], zero_vec3))) { + totalFrontDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormal); + totalBackDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormalInv); + } + + if (any(greaterThan(lightSpecular[i], zero_vec3))) { + totalFrontSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormal, shininess); + totalBackSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormalInv, shininess); + } + } + + // Calculating final color as result of all lights (plus emissive term). + // Transparency is determined exclusively by the diffuse component. + vertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalFrontDiffuse, 1) * color + + vec4(totalFrontSpecular, 0) * specular + + vec4(emissive.rgb, 0); + + backVertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalBackDiffuse, 1) * color + + vec4(totalBackSpecular, 0) * specular + + vec4(emissive.rgb, 0); +} \ No newline at end of file diff --git a/core/src/processing/opengl/shaders/LightVert-vc4.glsl b/core/src/processing/opengl/shaders/LightVert-vc4.glsl index b96caa4b3b..ba79726767 100644 --- a/core/src/processing/opengl/shaders/LightVert-vc4.glsl +++ b/core/src/processing/opengl/shaders/LightVert-vc4.glsl @@ -96,8 +96,8 @@ void main() { vec3 totalBackSpecular = vec3(0, 0, 0); // prevent register allocation failure by limiting ourselves to - // two lights for now - for (int i = 0; i < 2; i++) { + // four lights for now + for (int i = 0; i < 4; i++) { if (lightCount == i) break; vec3 lightPos = lightPosition[i].xyz; diff --git a/core/src/processing/opengl/shaders/TexLightVert-brcm.glsl b/core/src/processing/opengl/shaders/TexLightVert-brcm.glsl new file mode 100644 index 0000000000..51e88ab056 --- /dev/null +++ b/core/src/processing/opengl/shaders/TexLightVert-brcm.glsl @@ -0,0 +1,160 @@ +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2012-15 The Processing Foundation + Copyright (c) 2004-12 Ben Fry and Casey Reas + Copyright (c) 2001-04 Massachusetts Institute of Technology + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation, version 2.1. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +uniform mat4 modelviewMatrix; +uniform mat4 transformMatrix; +uniform mat3 normalMatrix; +uniform mat4 texMatrix; + +uniform int lightCount; +uniform vec4 lightPosition[8]; +uniform vec3 lightNormal[8]; +uniform vec3 lightAmbient[8]; +uniform vec3 lightDiffuse[8]; +uniform vec3 lightSpecular[8]; +uniform vec3 lightFalloff[8]; +uniform vec2 lightSpot[8]; + +attribute vec4 position; +attribute vec4 color; +attribute vec3 normal; +attribute vec2 texCoord; + +attribute vec4 ambient; +attribute vec4 specular; +attribute vec4 emissive; +attribute float shininess; + +varying vec4 vertColor; +varying vec4 backVertColor; +varying vec4 vertTexCoord; + +const float zero_float = 0.0; +const float one_float = 1.0; +const vec3 zero_vec3 = vec3(0.0); +const vec3 minus_one_vec3 = vec3(0.0-1.0); + +float falloffFactor(vec3 lightPos, vec3 vertPos, vec3 coeff) { + vec3 lpv = lightPos - vertPos; + vec3 dist = vec3(one_float); + dist.z = dot(lpv, lpv); + dist.y = sqrt(dist.z); + return one_float / dot(dist, coeff); +} + +float spotFactor(vec3 lightPos, vec3 vertPos, vec3 lightNorm, float minCos, float spotExp) { + vec3 lpv = normalize(lightPos - vertPos); + vec3 nln = minus_one_vec3 * lightNorm; + float spotCos = dot(nln, lpv); + return spotCos <= minCos ? zero_float : pow(spotCos, spotExp); +} + +float lambertFactor(vec3 lightDir, vec3 vecNormal) { + return max(zero_float, dot(lightDir, vecNormal)); +} + +float blinnPhongFactor(vec3 lightDir, vec3 vertPos, vec3 vecNormal, float shine) { + vec3 np = normalize(vertPos); + vec3 ldp = normalize(lightDir - np); + return pow(max(zero_float, dot(ldp, vecNormal)), shine); +} + +void main() { + // Vertex in clip coordinates + gl_Position = transformMatrix * position; + + // Vertex in eye coordinates + vec3 ecVertex = vec3(modelviewMatrix * position); + + // Normal vector in eye coordinates + vec3 ecNormal = normalize(normalMatrix * normal); + vec3 ecNormalInv = ecNormal * minus_one_vec3; + + // Light calculations + vec3 totalAmbient = vec3(0, 0, 0); + + vec3 totalFrontDiffuse = vec3(0, 0, 0); + vec3 totalFrontSpecular = vec3(0, 0, 0); + + vec3 totalBackDiffuse = vec3(0, 0, 0); + vec3 totalBackSpecular = vec3(0, 0, 0); + + // prevent register allocation failure by limiting ourselves to + // two lights for now + for (int i = 0; i < 2; i++) { + if (lightCount == i) break; + + vec3 lightPos = lightPosition[i].xyz; + bool isDir = lightPosition[i].w < one_float; + float spotCos = lightSpot[i].x; + float spotExp = lightSpot[i].y; + + vec3 lightDir; + float falloff; + float spotf; + + if (isDir) { + falloff = one_float; + lightDir = minus_one_vec3 * lightNormal[i]; + } else { + falloff = falloffFactor(lightPos, ecVertex, lightFalloff[i]); + lightDir = normalize(lightPos - ecVertex); + } + + spotf = spotExp > zero_float ? spotFactor(lightPos, ecVertex, lightNormal[i], + spotCos, spotExp) + : one_float; + + if (any(greaterThan(lightAmbient[i], zero_vec3))) { + totalAmbient += lightAmbient[i] * falloff; + } + + if (any(greaterThan(lightDiffuse[i], zero_vec3))) { + totalFrontDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormal); + totalBackDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormalInv); + } + + if (any(greaterThan(lightSpecular[i], zero_vec3))) { + totalFrontSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormal, shininess); + totalBackSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormalInv, shininess); + } + } + + // Calculating final color as result of all lights (plus emissive term). + // Transparency is determined exclusively by the diffuse component. + vertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalFrontDiffuse, 1) * color + + vec4(totalFrontSpecular, 0) * specular + + vec4(emissive.rgb, 0); + + backVertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalBackDiffuse, 1) * color + + vec4(totalBackSpecular, 0) * specular + + vec4(emissive.rgb, 0); + + // Calculating texture coordinates, with r and q set both to one + vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); +} diff --git a/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl b/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl index 51e88ab056..f54277e812 100644 --- a/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl +++ b/core/src/processing/opengl/shaders/TexLightVert-vc4.glsl @@ -99,8 +99,8 @@ void main() { vec3 totalBackSpecular = vec3(0, 0, 0); // prevent register allocation failure by limiting ourselves to - // two lights for now - for (int i = 0; i < 2; i++) { + // four lights for now + for (int i = 0; i < 4; i++) { if (lightCount == i) break; vec3 lightPos = lightPosition[i].xyz;