@deck.gl/experimental-layers
Version:
Experimental layers for deck.gl
70 lines (56 loc) • 1.77 kB
JavaScript
export default `
// Scale the model
uniform float sizeScale;
// Primitive attributes
attribute vec3 positions;
attribute vec3 normals;
attribute vec2 texCoords;
// Instance attributes
attribute vec3 instancePositions;
attribute vec2 instancePositions64xy;
attribute vec3 instanceRotations;
attribute vec4 instanceColors;
attribute vec3 instancePickingColors;
// Outputs to fragment shader
varying vec2 vTexCoord;
varying vec4 vColor;
varying float vLightWeight;
// yaw(z) pitch(y) roll(x)
mat3 getRotationMatrix(vec3 rotation) {
float sr = sin(rotation.x);
float sp = sin(rotation.y);
float sw = sin(rotation.z);
float cr = cos(rotation.x);
float cp = cos(rotation.y);
float cw = cos(rotation.z);
return mat3(
cw * cp, // 0,0
sw * cp, // 1,0
-sp, // 2,0
-sw * cr + cw * sp * sr, // 0,1
cw * cr + sw * sp * sr, // 1,1
cp * sr, // 2,1
sw * sr + cw * sp * cr, // 0,2
-cw * sr + sw * sp * cr, // 1,2
cp * cr // 2,2
);
}
void main(void) {
mat3 rotationMatrix = getRotationMatrix(instanceRotations);
vec3 pos = positions;
pos = rotationMatrix * pos;
pos = project_scale(pos * sizeScale);
// TODO - backward compatibility, remove in next major release
if (project_uPixelsPerMeter.y < 0.0) {
pos.y = -pos.y;
}
vec4 worldPosition;
gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xy, pos, worldPosition);
// TODO - transform normals
picking_setPickingColor(instancePickingColors);
vTexCoord = texCoords;
vColor = instanceColors;
vLightWeight = lighting_getLightWeight(worldPosition.xyz, project_normal(normals));
}
`;