Skip to content
Snippets Groups Projects
Commit 75b7e0b4 authored by Alexander Rose's avatar Alexander Rose
Browse files

support to 'invert' clip object test

- e.g. to cut away everything but a sphere
parent ee4ce2fd
No related branches found
No related tags found
No related merge requests found
...@@ -135,6 +135,7 @@ export const GlobalUniformSchema = { ...@@ -135,6 +135,7 @@ export const GlobalUniformSchema = {
uTransparentBackground: UniformSpec('b'), uTransparentBackground: UniformSpec('b'),
uClipObjectType: UniformSpec('i[]'), uClipObjectType: UniformSpec('i[]'),
uClipObjectInvert: UniformSpec('b[]'),
uClipObjectPosition: UniformSpec('v3[]'), uClipObjectPosition: UniformSpec('v3[]'),
uClipObjectRotation: UniformSpec('v4[]'), uClipObjectRotation: UniformSpec('v4[]'),
uClipObjectScale: UniformSpec('v3[]'), uClipObjectScale: UniformSpec('v3[]'),
......
...@@ -96,10 +96,11 @@ export const RendererParams = { ...@@ -96,10 +96,11 @@ export const RendererParams = {
variant: PD.Select('instance', PD.arrayToOptions<Clipping.Variant>(['instance', 'pixel'])), variant: PD.Select('instance', PD.arrayToOptions<Clipping.Variant>(['instance', 'pixel'])),
objects: PD.ObjectList({ objects: PD.ObjectList({
type: PD.Select('plane', PD.objectToOptions(Clipping.Type, t => stringToWords(t))), type: PD.Select('plane', PD.objectToOptions(Clipping.Type, t => stringToWords(t))),
invert: PD.Boolean(false),
position: PD.Vec3(Vec3()), position: PD.Vec3(Vec3()),
rotation: PD.Group({ rotation: PD.Group({
axis: PD.Vec3(Vec3.create(1, 0, 0)), 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 }), }, { isExpanded: true }),
scale: PD.Vec3(Vec3.create(1, 1, 1)), scale: PD.Vec3(Vec3.create(1, 1, 1)),
}, o => stringToWords(o.type)) }, o => stringToWords(o.type))
...@@ -144,6 +145,7 @@ type Clip = { ...@@ -144,6 +145,7 @@ type Clip = {
objects: { objects: {
count: number count: number
type: number[] type: number[]
invert: boolean[]
position: number[] position: number[]
rotation: number[] rotation: number[]
scale: number[] scale: number[]
...@@ -152,8 +154,9 @@ type Clip = { ...@@ -152,8 +154,9 @@ type Clip = {
const tmpQuat = Quat(); const tmpQuat = Quat();
function getClip(props: RendererProps['clip'], clip?: Clip): Clip { 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), type: (new Array(5)).fill(1),
invert: (new Array(5)).fill(false),
position: (new Array(5 * 3)).fill(0), position: (new Array(5 * 3)).fill(0),
rotation: (new Array(5 * 4)).fill(0), rotation: (new Array(5 * 4)).fill(0),
scale: (new Array(5 * 3)).fill(1), scale: (new Array(5 * 3)).fill(1),
...@@ -161,13 +164,14 @@ function getClip(props: RendererProps['clip'], clip?: Clip): Clip { ...@@ -161,13 +164,14 @@ function getClip(props: RendererProps['clip'], clip?: Clip): Clip {
for (let i = 0, il = props.objects.length; i < il; ++i) { for (let i = 0, il = props.objects.length; i < il; ++i) {
const p = props.objects[i]; const p = props.objects[i];
type[i] = Clipping.Type[p.type]; type[i] = Clipping.Type[p.type];
invert[i] = p.invert;
Vec3.toArray(p.position, position, i * 3); Vec3.toArray(p.position, position, i * 3);
Quat.toArray(Quat.setAxisAngle(tmpQuat, p.rotation.axis, degToRad(p.rotation.angle)), rotation, i * 4); Quat.toArray(Quat.setAxisAngle(tmpQuat, p.rotation.axis, degToRad(p.rotation.angle)), rotation, i * 4);
Vec3.toArray(p.scale, scale, i * 3); Vec3.toArray(p.scale, scale, i * 3);
} }
return { return {
variant: props.variant, 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 { ...@@ -232,6 +236,7 @@ namespace Renderer {
uTransparentBackground: ValueCell.create(false), uTransparentBackground: ValueCell.create(false),
uClipObjectType: ValueCell.create(clip.objects.type), uClipObjectType: ValueCell.create(clip.objects.type),
uClipObjectInvert: ValueCell.create(clip.objects.invert),
uClipObjectPosition: ValueCell.create(clip.objects.position), uClipObjectPosition: ValueCell.create(clip.objects.position),
uClipObjectRotation: ValueCell.create(clip.objects.rotation), uClipObjectRotation: ValueCell.create(clip.objects.rotation),
uClipObjectScale: ValueCell.create(clip.objects.scale), uClipObjectScale: ValueCell.create(clip.objects.scale),
......
...@@ -92,8 +92,10 @@ export default ` ...@@ -92,8 +92,10 @@ export default `
for (int i = 0; i < dClipObjectCount; ++i) { for (int i = 0; i < dClipObjectCount; ++i) {
if (flag == 0 || hasBit(flag, i + 1)) { if (flag == 0 || hasBit(flag, i + 1)) {
// TODO take sphere radius into account? // 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 true;
}
} }
} }
return false; return false;
......
...@@ -5,6 +5,7 @@ uniform int uGroupCount; ...@@ -5,6 +5,7 @@ uniform int uGroupCount;
#if dClipObjectCount != 0 #if dClipObjectCount != 0
uniform int uClipObjectType[dClipObjectCount]; uniform int uClipObjectType[dClipObjectCount];
uniform bool uClipObjectInvert[dClipObjectCount];
uniform vec3 uClipObjectPosition[dClipObjectCount]; uniform vec3 uClipObjectPosition[dClipObjectCount];
uniform vec4 uClipObjectRotation[dClipObjectCount]; uniform vec4 uClipObjectRotation[dClipObjectCount];
uniform vec3 uClipObjectScale[dClipObjectCount]; uniform vec3 uClipObjectScale[dClipObjectCount];
......
...@@ -10,6 +10,7 @@ uniform vec4 uInvariantBoundingSphere; ...@@ -10,6 +10,7 @@ uniform vec4 uInvariantBoundingSphere;
#if dClipObjectCount != 0 #if dClipObjectCount != 0
uniform int uClipObjectType[dClipObjectCount]; uniform int uClipObjectType[dClipObjectCount];
uniform bool uClipObjectInvert[dClipObjectCount];
uniform vec3 uClipObjectPosition[dClipObjectCount]; uniform vec3 uClipObjectPosition[dClipObjectCount];
uniform vec4 uClipObjectRotation[dClipObjectCount]; uniform vec4 uClipObjectRotation[dClipObjectCount];
uniform vec3 uClipObjectScale[dClipObjectCount]; uniform vec3 uClipObjectScale[dClipObjectCount];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment