Skip to content

Commit

Permalink
clean up layer passes
Browse files Browse the repository at this point in the history
  • Loading branch information
Xiaoji Chen committed Oct 3, 2019
1 parent d0d33c6 commit 078917e
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 56 deletions.
4 changes: 2 additions & 2 deletions modules/core/src/passes/draw-layers-pass.js
Expand Up @@ -2,8 +2,8 @@ import LayersPass from './layers-pass';

export default class DrawLayersPass extends LayersPass {
// PRIVATE
getModuleParameters(layer, effects, effectProps) {
const moduleParameters = super.getModuleParameters(layer, effects, effectProps);
getModuleParameters(layer, effects) {
const moduleParameters = {};
for (const effect of effects) {
Object.assign(moduleParameters, effect.getParameters(layer));
}
Expand Down
42 changes: 23 additions & 19 deletions modules/core/src/passes/layers-pass.js
@@ -1,6 +1,6 @@
import GL from '@luma.gl/constants';
import Pass from './pass';
import {clear, setParameters, withParameters, cssToDeviceRatio} from '@luma.gl/core';
import {clear, withParameters, cssToDeviceRatio} from '@luma.gl/core';

export default class LayersPass extends Pass {
render(props) {
Expand Down Expand Up @@ -44,7 +44,7 @@ export default class LayersPass extends Pass {
// intersect with the picking rect
drawLayersInViewport(
gl,
{layers, layerFilter, viewport, view, parameters, pass = 'unknown', effects, effectProps}
{layers, layerFilter, viewport, view, pass = 'unknown', effects, effectProps}
) {
const glViewport = getGLViewport(gl, {viewport});

Expand All @@ -68,8 +68,6 @@ export default class LayersPass extends Pass {
pickableCount: 0
};

setParameters(gl, parameters || {});

// render layers in normal colors
layers.forEach((layer, layerIndex) => {
// Check if we should draw layer
Expand All @@ -87,9 +85,9 @@ export default class LayersPass extends Pass {
if (shouldDrawLayer) {
renderStatus.visibleCount++;

const moduleParameters = this.getModuleParameters(layer, effects, effectProps);
const moduleParameters = this._getModuleParameters(layer, effects, effectProps);
const uniforms = Object.assign({}, layer.context.uniforms, {layerIndex});
const layerParameters = this.getLayerParameters(layer, layerIndex, glViewport, parameters);
const layerParameters = this._getLayerParameters(layer, layerIndex, glViewport);

layer.drawLayer({
moduleParameters,
Expand All @@ -102,6 +100,20 @@ export default class LayersPass extends Pass {
return renderStatus;
}

/* Methods for subclass overrides */
shouldDrawLayer(layer) {
return true;
}

getModuleParameters(layer, effects) {
return null;
}

getLayerParameters(layer, layerIndex) {
return null;
}

/* Private */
_shouldDrawLayer(layer, viewport, pass, layerFilter) {
let shouldDrawLayer = this.shouldDrawLayer(layer) && !layer.isComposite && layer.props.visible;

Expand All @@ -111,30 +123,22 @@ export default class LayersPass extends Pass {
return shouldDrawLayer;
}

/* Methods for subclass overrides */
shouldDrawLayer(layer) {
return true;
}

getModuleParameters(layer, effects, effectProps) {
_getModuleParameters(layer, effects, effectProps) {
const moduleParameters = Object.assign(Object.create(layer.props), {
viewport: layer.context.viewport,
mousePosition: layer.context.mousePosition,
pickingActive: 0,
devicePixelRatio: cssToDeviceRatio(this.gl)
});
return Object.assign(moduleParameters, effectProps);
return Object.assign(moduleParameters, this.getModuleParameters(layer, effects), effectProps);
}

getLayerParameters(layer, layerIndex, glViewport, parameters) {
_getLayerParameters(layer, layerIndex, glViewport) {
// All parameter resolving is done here instead of the layer
// Blend parameters must not be overridden
const layerParameters = Object.assign({}, layer.props.parameters || {}, parameters);

Object.assign(layerParameters, {
// Blend parameters must not be overridden during picking
return Object.assign({}, layer.props.parameters, this.getLayerParameters(layer, layerIndex), {
viewport: glViewport
});
return layerParameters;
}
}

Expand Down
54 changes: 23 additions & 31 deletions modules/core/src/passes/pick-layers-pass.js
@@ -1,5 +1,11 @@
import LayersPass from './layers-pass';
import {withParameters} from '@luma.gl/core';
import GL from '@luma.gl/constants';

const PICKING_PARAMETERS = {
blendFunc: [GL.ONE, GL.ZERO, GL.CONSTANT_ALPHA, GL.ZERO],
blendEquation: GL.FUNC_ADD
};

export default class PickLayersPass extends LayersPass {
render(props) {
Expand All @@ -25,9 +31,9 @@ export default class PickLayersPass extends LayersPass {
redrawReason,
pickZ
}) {
effectProps.pickingAttribute = pickZ;

const gl = this.gl;
this.pickZ = pickZ;

// Make sure we clear scissor test and fbo bindings in case of exceptions
// We are only interested in one pixel, no need to render anything else
// Note that the callback here is called synchronously.
Expand All @@ -46,29 +52,20 @@ export default class PickLayersPass extends LayersPass {
depthMask: true,
depthTest: true,
depthRange: [0, 1],
colorMask: [true, true, true, true]
colorMask: [true, true, true, true],
// Blending
...PICKING_PARAMETERS,
blend: !pickZ
},
() => {
const parameters = {
blend: true,
blendFunc: [gl.ONE, gl.ZERO, gl.CONSTANT_ALPHA, gl.ZERO],
blendEquation: gl.FUNC_ADD,
blendColor: [0, 0, 0, 0]
};

if (pickZ) {
parameters.blend = false;
}

this.drawLayers({
layers,
layerFilter,
viewports,
onViewportActive,
pass,
redrawReason,
effectProps,
parameters
effectProps
});
}
);
Expand All @@ -79,22 +76,17 @@ export default class PickLayersPass extends LayersPass {
return layer.props.pickable;
}

getModuleParameters(layer, effects, effectProps) {
const moduleParameters = super.getModuleParameters(layer, effects, effectProps);
moduleParameters.pickingActive = 1;
return moduleParameters;
getModuleParameters() {
return {
pickingActive: 1,
pickingAttribute: this.pickZ
};
}

getLayerParameters(layer, layerIndex, glViewport, parameters) {
// All parameter resolving is done here instead of the layer
// Blend parameters must not be overridden
const layerParameters = Object.assign({}, layer.props.parameters || {}, parameters);

Object.assign(layerParameters, {
viewport: glViewport,
blendColor: [0, 0, 0, (layerIndex + 1) / 255]
});

return layerParameters;
getLayerParameters(layer, layerIndex) {
// These will override any layer parameters
return this.pickZ
? {blend: false}
: {...PICKING_PARAMETERS, blend: true, blendColor: [0, 0, 0, (layerIndex + 1) / 255]};
}
}
8 changes: 4 additions & 4 deletions modules/core/src/passes/shadow-pass.js
Expand Up @@ -70,10 +70,10 @@ export default class ShadowPass extends LayersPass {
return layer.props.shadowEnabled !== false;
}

getModuleParameters(layer, effects, effectProps) {
const moduleParameters = super.getModuleParameters(layer, effects, effectProps);
moduleParameters.drawToShadowMap = true;
return moduleParameters;
getModuleParameters() {
return {
drawToShadowMap: true
};
}

delete() {
Expand Down

0 comments on commit 078917e

Please sign in to comment.