From 75b7e0b4d988cc73f16aacc9a55c55842275ee3c Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sun, 20 Dec 2020 20:06:52 -0800 Subject: [PATCH] support to 'invert' clip object test - e.g. to cut away everything but a sphere --- src/mol-gl/renderable/schema.ts | 1 + src/mol-gl/renderer.ts | 11 ++++++++--- src/mol-gl/shader/chunks/common-clip.glsl.ts | 4 +++- src/mol-gl/shader/chunks/common-frag-params.glsl.ts | 1 + src/mol-gl/shader/chunks/common-vert-params.glsl.ts | 1 + 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index abcab8569..309383416 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -135,6 +135,7 @@ export const GlobalUniformSchema = { uTransparentBackground: UniformSpec('b'), uClipObjectType: UniformSpec('i[]'), + uClipObjectInvert: UniformSpec('b[]'), uClipObjectPosition: UniformSpec('v3[]'), uClipObjectRotation: UniformSpec('v4[]'), uClipObjectScale: UniformSpec('v3[]'), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index b77befbe4..95ff87211 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -96,10 +96,11 @@ export const RendererParams = { variant: PD.Select('instance', PD.arrayToOptions<Clipping.Variant>(['instance', 'pixel'])), objects: PD.ObjectList({ type: PD.Select('plane', PD.objectToOptions(Clipping.Type, t => stringToWords(t))), + invert: PD.Boolean(false), position: PD.Vec3(Vec3()), rotation: PD.Group({ axis: PD.Vec3(Vec3.create(1, 0, 0)), - angle: PD.Numeric(0, { min: -180, max: 180, step: 0.1 }, { description: 'Angle in Degrees' }), + angle: PD.Numeric(0, { min: -180, max: 180, step: 1 }, { description: 'Angle in Degrees' }), }, { isExpanded: true }), scale: PD.Vec3(Vec3.create(1, 1, 1)), }, o => stringToWords(o.type)) @@ -144,6 +145,7 @@ type Clip = { objects: { count: number type: number[] + invert: boolean[] position: number[] rotation: number[] scale: number[] @@ -152,8 +154,9 @@ type Clip = { const tmpQuat = Quat(); function getClip(props: RendererProps['clip'], clip?: Clip): Clip { - const { type, position, rotation, scale } = clip?.objects || { + const { type, invert, position, rotation, scale } = clip?.objects || { type: (new Array(5)).fill(1), + invert: (new Array(5)).fill(false), position: (new Array(5 * 3)).fill(0), rotation: (new Array(5 * 4)).fill(0), scale: (new Array(5 * 3)).fill(1), @@ -161,13 +164,14 @@ function getClip(props: RendererProps['clip'], clip?: Clip): Clip { for (let i = 0, il = props.objects.length; i < il; ++i) { const p = props.objects[i]; type[i] = Clipping.Type[p.type]; + invert[i] = p.invert; Vec3.toArray(p.position, position, i * 3); Quat.toArray(Quat.setAxisAngle(tmpQuat, p.rotation.axis, degToRad(p.rotation.angle)), rotation, i * 4); Vec3.toArray(p.scale, scale, i * 3); } return { variant: props.variant, - objects: { count: props.objects.length, type, position, rotation, scale } + objects: { count: props.objects.length, type, invert, position, rotation, scale } }; } @@ -232,6 +236,7 @@ namespace Renderer { uTransparentBackground: ValueCell.create(false), uClipObjectType: ValueCell.create(clip.objects.type), + uClipObjectInvert: ValueCell.create(clip.objects.invert), uClipObjectPosition: ValueCell.create(clip.objects.position), uClipObjectRotation: ValueCell.create(clip.objects.rotation), uClipObjectScale: ValueCell.create(clip.objects.scale), diff --git a/src/mol-gl/shader/chunks/common-clip.glsl.ts b/src/mol-gl/shader/chunks/common-clip.glsl.ts index 444ecddc4..13ce24fd7 100644 --- a/src/mol-gl/shader/chunks/common-clip.glsl.ts +++ b/src/mol-gl/shader/chunks/common-clip.glsl.ts @@ -92,8 +92,10 @@ export default ` for (int i = 0; i < dClipObjectCount; ++i) { if (flag == 0 || hasBit(flag, i + 1)) { // TODO take sphere radius into account? - if (getSignedDistance(sphere.xyz, uClipObjectType[i], uClipObjectPosition[i], uClipObjectRotation[i], uClipObjectScale[i]) <= 0.0) + bool test = getSignedDistance(sphere.xyz, uClipObjectType[i], uClipObjectPosition[i], uClipObjectRotation[i], uClipObjectScale[i]) <= 0.0; + if ((!uClipObjectInvert[i] && test) || (uClipObjectInvert[i] && !test)) { return true; + } } } return false; 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 562629ec1..6a25e4eb1 100644 --- a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts @@ -5,6 +5,7 @@ uniform int uGroupCount; #if dClipObjectCount != 0 uniform int uClipObjectType[dClipObjectCount]; + uniform bool uClipObjectInvert[dClipObjectCount]; uniform vec3 uClipObjectPosition[dClipObjectCount]; uniform vec4 uClipObjectRotation[dClipObjectCount]; uniform vec3 uClipObjectScale[dClipObjectCount]; diff --git a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts index 7903bb2d2..b7cac5de7 100644 --- a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts @@ -10,6 +10,7 @@ uniform vec4 uInvariantBoundingSphere; #if dClipObjectCount != 0 uniform int uClipObjectType[dClipObjectCount]; + uniform bool uClipObjectInvert[dClipObjectCount]; uniform vec3 uClipObjectPosition[dClipObjectCount]; uniform vec4 uClipObjectRotation[dClipObjectCount]; uniform vec3 uClipObjectScale[dClipObjectCount]; -- GitLab