Skip to content

Commit

Permalink
fix(point-layer): adjust shift bits in vertex compression
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoiver committed May 30, 2019
1 parent 5e0bac0 commit 1104e3a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 23 deletions.
12 changes: 5 additions & 7 deletions src/geom/buffer/point/circleBuffer.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import { packUint8ToFloat } from '../../../util/vertex-compress';

// const LEFT_SHIFT2 = 4.0;
// const LEFT_SHIFT4 = 16.0;
const LEFT_SHIFT8 = 256.0;
const LEFT_SHIFT10 = 1024.0;
// const LEFT_SHIFT12 = 4096.0;
const LEFT_SHIFT18 = 262144.0;
const LEFT_SHIFT20 = 1048576.0;

export default function circleBuffer(layerData) {
const index = [];
Expand All @@ -29,14 +26,15 @@ export default function circleBuffer(layerData) {
[ 1, 1 ],
[ -1, 1 ]
].forEach(extrude => {
// vec4(color, color, (8-bit size, 4-bit extrude), id)
// vec4(color, color, (4-bit extrude, 16-bit size), id)
aPackedData.push(
...packedColor,
size + (extrude[0] + 1) * LEFT_SHIFT8 + (extrude[1] + 1) * LEFT_SHIFT10,
(extrude[0] + 1) * LEFT_SHIFT20 + (extrude[1] + 1) * LEFT_SHIFT18 + size,
id
);
});

// TODO:如果使用相对瓦片坐标,还可以进一步压缩
aPosition.push(...coordinates, ...coordinates, ...coordinates, ...coordinates);
index.push(...[ 0, 1, 2, 0, 2, 3 ].map(n => n + i * 4));
});
Expand Down
16 changes: 8 additions & 8 deletions src/geom/shader/circle_vert.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,20 @@ void main() {
// unpack picking_id
float picking_id = a_packed_data.w;

// unpack data(radius(8-bit), extrude(4-bit))
// unpack data(extrude(4-bit), radius(16-bit))
float compressed = a_packed_data.z;

// extrude(4-bit)
vec2 extrude;
extrude.y = floor(compressed * SHIFT_RIGHT10);
compressed -= extrude.y * SHIFT_LEFT10;
extrude.y = extrude.y - 1.;

extrude.x = floor(compressed * SHIFT_RIGHT8);
compressed -= extrude.x * SHIFT_LEFT8;
extrude.x = floor(compressed * SHIFT_RIGHT20);
compressed -= extrude.x * SHIFT_LEFT20;
extrude.x = extrude.x - 1.;

// radius(8-bit)
extrude.y = floor(compressed * SHIFT_RIGHT18);
compressed -= extrude.y * SHIFT_LEFT18;
extrude.y = extrude.y - 1.;

// radius(16-bit)
float radius = compressed;
v_radius = radius;

Expand Down
12 changes: 4 additions & 8 deletions src/geom/shader/shaderChunks/decode.glsl
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
#define SHIFT_RIGHT2 0.25
#define SHIFT_RIGHT4 0.0625
#define SHIFT_RIGHT8 1.0 / 256.0
#define SHIFT_RIGHT10 1.0 / 1024.0
#define SHIFT_LEFT2 4.0
#define SHIFT_LEFT4 16.0
#define SHIFT_LEFT8 256.0
#define SHIFT_LEFT10 1024.0
#define SHIFT_RIGHT18 1.0 / 262144.0
#define SHIFT_RIGHT20 1.0 / 1048576.0
#define SHIFT_LEFT18 262144.0
#define SHIFT_LEFT20 1048576.0

vec2 unpack_float(const float packedValue) {
int packedIntValue = int(packedValue);
Expand Down

0 comments on commit 1104e3a

Please sign in to comment.