diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index abcab8569ed6891bcc3439e4811fa80f1377e306..309383416b37c2de4aa1f53572279281a87bf42a 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 b77befbe4c4f4d3f27c226097ba89a7bd1f01607..95ff872116c6519b9e4c4d3e4b1fbba5ae952838 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 444ecddc4a54e069722207540ad33ad1050c8f94..13ce24fd779a45006967dac7bb7384d9376ecd5a 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 562629ec1a59d6f0cdc21c1fbb644e3fd2f38d89..6a25e4eb1b1818e33856d1f99a345b7856a885c0 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 7903bb2d2943b77dd848c81661081dd6a411458a..b7cac5de751c8ed5cd752e3255e90b7fe9923519 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];