From b0127d746dca5aae3e4d84ac9c92c8160366fda9 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sat, 31 Oct 2020 12:10:15 -0700 Subject: [PATCH] add bool uniform support --- src/extensions/alpha-orbitals/gpu/compute.ts | 2 +- .../alpha-orbitals/gpu/shader.frag.ts | 28 +++++++++---------- src/mol-gl/renderable/schema.ts | 4 +-- src/mol-gl/renderer.ts | 8 +++--- src/mol-gl/shader/chunks/apply-fog.glsl.ts | 2 +- .../chunks/apply-interior-color.glsl.ts | 2 +- .../shader/chunks/common-frag-params.glsl.ts | 4 +-- src/mol-gl/shader/direct-volume.frag.ts | 4 +-- src/mol-gl/webgl/uniform.ts | 6 ++-- src/mol-util/is-little-endian.ts | 3 +- 10 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/extensions/alpha-orbitals/gpu/compute.ts b/src/extensions/alpha-orbitals/gpu/compute.ts index 709cb5217..cb844f5eb 100644 --- a/src/extensions/alpha-orbitals/gpu/compute.ts +++ b/src/extensions/alpha-orbitals/gpu/compute.ts @@ -32,7 +32,7 @@ const AlphaOrbitalsSchema = { uNAlpha: UniformSpec('i'), uNCoeff: UniformSpec('i'), uMaxCoeffs: UniformSpec('i'), - uLittleEndian: UniformSpec('i') // TODO: boolean uniforms + uLittleEndian: UniformSpec('b') }; const AlphaOrbitalsShaderCode = ShaderCode('postprocessing', quad_vert, shader_frag); type AlphaOrbitalsRenderable = ComputeRenderable<Values<typeof AlphaOrbitalsSchema>> diff --git a/src/extensions/alpha-orbitals/gpu/shader.frag.ts b/src/extensions/alpha-orbitals/gpu/shader.frag.ts index 72224aa87..77bd10bf5 100644 --- a/src/extensions/alpha-orbitals/gpu/shader.frag.ts +++ b/src/extensions/alpha-orbitals/gpu/shader.frag.ts @@ -28,7 +28,7 @@ uniform float uWidth; uniform int uNCoeff; uniform int uNAlpha; -uniform int uLittleEndian; +uniform bool uLittleEndian; float shiftRight (float v, float amt) { v = floor(v) + 0.5; @@ -61,9 +61,9 @@ vec4 floatToRgba(float texelFloat) { float byte2 = (last_bit_of_biased_exponent * 128.0 + extractBits(fraction, 16.0, 23.0)) / 255.0; float byte1 = (sign * 128.0 + remaining_bits_of_biased_exponent) / 255.0; return ( - uLittleEndian > 0 - ? vec4(byte4, byte3, byte2, byte1) - : vec4(byte1, byte2, byte3, byte4) + uLittleEndian + ? vec4(byte4, byte3, byte2, byte1) + : vec4(byte1, byte2, byte3, byte4) ); } @@ -118,13 +118,13 @@ float L4(vec3 p, float a0, float a1, float a2, float a3, float a4, float a5, flo float alpha(float offset, float f) { #ifdef uMaxCoeffs - // in webgl1, the value is in the alpha channel! - return texture2D(tAlpha, vec2(offset * f, 0.5)).a; - #endif + // in webgl1, the value is in the alpha channel! + return texture2D(tAlpha, vec2(offset * f, 0.5)).a; + #endif #ifndef uMaxCoeffs - return texture2D(tAlpha, vec2(offset * f, 0.5)).x; - #endif + return texture2D(tAlpha, vec2(offset * f, 0.5)).x; + #endif } float Y(int L, vec3 X, float aO, float fA) { @@ -140,12 +140,12 @@ float Y(int L, vec3 X, float aO, float fA) { ); } else if (L == 3) { return L3(X, - alpha(aO, fA), alpha(aO + 1.0, fA), alpha(aO + 2.0, fA), alpha(aO + 3.0, fA), alpha(aO + 4.0, fA), + alpha(aO, fA), alpha(aO + 1.0, fA), alpha(aO + 2.0, fA), alpha(aO + 3.0, fA), alpha(aO + 4.0, fA), alpha(aO + 5.0, fA), alpha(aO + 6.0, fA) ); } else if (L == 4) { return L4(X, - alpha(aO, fA), alpha(aO + 1.0, fA), alpha(aO + 2.0, fA), alpha(aO + 3.0, fA), alpha(aO + 4.0, fA), + alpha(aO, fA), alpha(aO + 1.0, fA), alpha(aO + 2.0, fA), alpha(aO + 3.0, fA), alpha(aO + 4.0, fA), alpha(aO + 5.0, fA), alpha(aO + 6.0, fA), alpha(aO + 7.0, fA), alpha(aO + 8.0, fA) ); } @@ -182,15 +182,15 @@ float Y(int L, vec3 X, float aO, float fA) { float intDiv(float a, float b) { return float(int(a) / int(b)); } float intMod(float a, float b) { return a - b * float(int(a) / int(b)); } -void main(void) { +void main(void) { float offset = floor(gl_FragCoord.x) + floor(gl_FragCoord.y) * uWidth; - + // axis order fast to slow Z, Y, X // TODO: support arbitrary axis orders? float k = intMod(offset, uDimensions.z), kk = intDiv(offset, uDimensions.z); float j = intMod(kk, uDimensions.y); float i = intDiv(kk, uDimensions.y); - + vec3 xyz = uMin + uDelta * vec3(i, j, k); float fCenter = 1.0 / float(uNCenters - 1); diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index 104b00b1c..b21606fb4 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -129,7 +129,7 @@ export const GlobalUniformSchema = { uFogFar: UniformSpec('f'), uFogColor: UniformSpec('v3'), - uTransparentBackground: UniformSpec('i'), + uTransparentBackground: UniformSpec('b'), uClipObjectType: UniformSpec('i[]'), uClipObjectPosition: UniformSpec('v3[]'), @@ -149,7 +149,7 @@ export const GlobalUniformSchema = { uPickingAlphaThreshold: UniformSpec('f'), uInteriorDarkening: UniformSpec('f'), - uInteriorColorFlag: UniformSpec('i'), + uInteriorColorFlag: UniformSpec('b'), uInteriorColor: UniformSpec('v3'), uHighlightColor: UniformSpec('v3'), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index 3273c4382..32fd6aa12 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -203,7 +203,7 @@ namespace Renderer { uFogNear: ValueCell.create(1), uFogFar: ValueCell.create(10000), uFogColor: ValueCell.create(bgColor), - uTransparentBackground: ValueCell.create(0), + uTransparentBackground: ValueCell.create(false), uClipObjectType: ValueCell.create(clip.objects.type), uClipObjectPosition: ValueCell.create(clip.objects.position), @@ -221,7 +221,7 @@ namespace Renderer { uPickingAlphaThreshold: ValueCell.create(p.pickingAlphaThreshold), uInteriorDarkening: ValueCell.create(p.interiorDarkening), - uInteriorColorFlag: ValueCell.create(p.interiorColorFlag ? 1 : 0), + uInteriorColorFlag: ValueCell.create(p.interiorColorFlag), uInteriorColor: ValueCell.create(Color.toVec3Normalized(Vec3(), p.interiorColor)), uHighlightColor: ValueCell.create(Color.toVec3Normalized(Vec3(), p.highlightColor)), @@ -322,7 +322,7 @@ namespace Renderer { ValueCell.update(globalUniforms.uFogFar, camera.fogFar); ValueCell.update(globalUniforms.uFogNear, camera.fogNear); - ValueCell.update(globalUniforms.uTransparentBackground, transparentBackground ? 1 : 0); + ValueCell.update(globalUniforms.uTransparentBackground, transparentBackground); globalUniformsNeedUpdate = true; state.currentRenderItemId = -1; @@ -409,7 +409,7 @@ namespace Renderer { } if (props.interiorColorFlag !== undefined && props.interiorColorFlag !== p.interiorColorFlag) { p.interiorColorFlag = props.interiorColorFlag; - ValueCell.update(globalUniforms.uInteriorColorFlag, p.interiorColorFlag ? 1 : 0); + ValueCell.update(globalUniforms.uInteriorColorFlag, p.interiorColorFlag); } if (props.interiorColor !== undefined && props.interiorColor !== p.interiorColor) { p.interiorColor = props.interiorColor; diff --git a/src/mol-gl/shader/chunks/apply-fog.glsl.ts b/src/mol-gl/shader/chunks/apply-fog.glsl.ts index 5045fcf0a..e58c39ca1 100644 --- a/src/mol-gl/shader/chunks/apply-fog.glsl.ts +++ b/src/mol-gl/shader/chunks/apply-fog.glsl.ts @@ -2,7 +2,7 @@ export default ` float fogDepth = length(vViewPosition); float fogFactor = smoothstep(uFogNear, uFogFar, fogDepth); float fogAlpha = (1.0 - fogFactor) * gl_FragColor.a; -if (uTransparentBackground == 0) { +if (!uTransparentBackground) { gl_FragColor.rgb = mix(gl_FragColor.rgb, uFogColor, fogFactor); if (gl_FragColor.a < 1.0) gl_FragColor.a = fogAlpha; diff --git a/src/mol-gl/shader/chunks/apply-interior-color.glsl.ts b/src/mol-gl/shader/chunks/apply-interior-color.glsl.ts index 40b9a12e0..37b365fef 100644 --- a/src/mol-gl/shader/chunks/apply-interior-color.glsl.ts +++ b/src/mol-gl/shader/chunks/apply-interior-color.glsl.ts @@ -1,6 +1,6 @@ export default ` if (interior) { - if (uInteriorColorFlag == 1) { + if (uInteriorColorFlag) { gl_FragColor.rgb = uInteriorColor; } else { gl_FragColor.rgb *= 1.0 - uInteriorDarkening; diff --git a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts index a2aeacf42..e5e44da56 100644 --- a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts @@ -37,10 +37,10 @@ uniform vec3 uFogColor; uniform float uAlpha; uniform float uPickingAlphaThreshold; -uniform int uTransparentBackground; +uniform bool uTransparentBackground; uniform float uInteriorDarkening; -uniform int uInteriorColorFlag; +uniform bool uInteriorColorFlag; uniform vec3 uInteriorColor; bool interior; `; \ No newline at end of file diff --git a/src/mol-gl/shader/direct-volume.frag.ts b/src/mol-gl/shader/direct-volume.frag.ts index 33a61fb18..a3182c6c3 100644 --- a/src/mol-gl/shader/direct-volume.frag.ts +++ b/src/mol-gl/shader/direct-volume.frag.ts @@ -51,10 +51,10 @@ uniform vec3 uFogColor; uniform float uAlpha; uniform float uPickingAlphaThreshold; -uniform int uTransparentBackground; +uniform bool uTransparentBackground; uniform float uInteriorDarkening; -uniform int uInteriorColorFlag; +uniform bool uInteriorColorFlag; uniform vec3 uInteriorColor; bool interior; diff --git a/src/mol-gl/webgl/uniform.ts b/src/mol-gl/webgl/uniform.ts index abc415c59..d333fd13b 100644 --- a/src/mol-gl/webgl/uniform.ts +++ b/src/mol-gl/webgl/uniform.ts @@ -11,6 +11,7 @@ import { RenderableSchema } from '../../mol-gl/renderable/schema'; import { ValueOf } from '../../mol-util/type-helpers'; export type UniformKindValue = { + 'b': boolean; 'b[]': boolean[] 'f': number; 'f[]': number[] 'i': number; 'i[]': number[] 'v2': Vec2; 'v2[]': number[] @@ -28,6 +29,7 @@ export type UniformsList = [string, ValueCell<UniformType>][] export function getUniformType(gl: GLRenderingContext, kind: UniformKind) { switch (kind) { + case 'b': case 'b[]': return gl.BOOL; case 'f': case 'f[]': return gl.FLOAT; case 'i': case 'i[]': return gl.INT; case 'v2': case 'v2[]': return gl.FLOAT_VEC2; @@ -56,8 +58,8 @@ function getUniformSetter(kind: UniformKind): UniformSetter { switch (kind) { case 'f': return uniform1f; case 'f[]': return uniform1fv; - case 'i': case 't': return uniform1i; - case 'i[]': case 't[]': return uniform1iv; + case 'i': case 't': case 'b': return uniform1i; + case 'i[]': case 't[]': case 'b[]': return uniform1iv; case 'v2': case 'v2[]': return uniform2fv; case 'v3': case 'v3[]': return uniform3fv; case 'v4': case 'v4[]': return uniform4fv; diff --git a/src/mol-util/is-little-endian.ts b/src/mol-util/is-little-endian.ts index 9f82353c6..2573cebf4 100644 --- a/src/mol-util/is-little-endian.ts +++ b/src/mol-util/is-little-endian.ts @@ -10,6 +10,5 @@ export function isLittleEndian() { const uint16array = new Uint16Array(arrayBuffer); uint8Array[0] = 0xAA; uint8Array[1] = 0xBB; - if (uint16array[0] === 0xBBAA) return 1; - return 0; + return uint16array[0] === 0xBBAA; } \ No newline at end of file -- GitLab