Skip to content

Commit

Permalink
Fix projectPosition in CARTESIAN coordinate system (#4335)
Browse files Browse the repository at this point in the history
  • Loading branch information
Pessimistress committed Mar 3, 2020
1 parent 58f8b84 commit 20d2fec
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 54 deletions.
59 changes: 22 additions & 37 deletions modules/core/src/shaderlib/project/project-functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* TODO: move to Viewport class?
*/
import {COORDINATE_SYSTEM} from '../../lib/constants';
import {LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD} from './viewport-uniforms';
import {getOffsetOrigin} from './viewport-uniforms';

import * as vec4 from 'gl-matrix/vec4';
import * as vec3 from 'gl-matrix/vec3';
Expand Down Expand Up @@ -39,16 +39,6 @@ function normalizeParameters(opts) {
normalizedParams.fromCoordinateOrigin = coordinateOrigin;
}

if (
coordinateSystem === COORDINATE_SYSTEM.LNGLAT &&
viewport.zoom >= LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD
) {
coordinateSystem = COORDINATE_SYSTEM.LNGLAT_OFFSETS;
normalizedParams.coordinateOrigin = [
Math.fround(viewport.longitude),
Math.fround(viewport.latitude)
];
}
normalizedParams.coordinateSystem = coordinateSystem;

return normalizedParams;
Expand Down Expand Up @@ -84,7 +74,7 @@ export function getWorldPosition(

case COORDINATE_SYSTEM.CARTESIAN:
default:
return viewport.projectPosition([x, y, z]);
return viewport.isGeospatial ? [x, y, z] : viewport.projectPosition([x, y, z]);
}
}

Expand Down Expand Up @@ -116,31 +106,26 @@ export function projectPosition(position, params) {
fromCoordinateOrigin
} = normalizeParameters(params);

switch (coordinateSystem) {
case COORDINATE_SYSTEM.LNGLAT_OFFSETS:
case COORDINATE_SYSTEM.METER_OFFSETS: {
const worldPosition = getWorldPosition(position, {
viewport,
modelMatrix,
coordinateSystem: fromCoordinateSystem,
coordinateOrigin: fromCoordinateOrigin,
offsetMode: true
});
const originWorld = lngLatZToWorldPosition(coordinateOrigin, viewport, true);
vec3.sub(worldPosition, worldPosition, originWorld);

return worldPosition;
}
const {geospatialOrigin, shaderCoordinateOrigin, offsetMode} = getOffsetOrigin(
viewport,
coordinateSystem,
coordinateOrigin
);

case COORDINATE_SYSTEM.LNGLAT:
case COORDINATE_SYSTEM.CARTESIAN:
default:
return getWorldPosition(position, {
viewport,
modelMatrix,
coordinateSystem: fromCoordinateSystem,
coordinateOrigin: fromCoordinateOrigin,
offsetMode: false
});
const worldPosition = getWorldPosition(position, {
viewport,
modelMatrix,
coordinateSystem: fromCoordinateSystem,
coordinateOrigin: fromCoordinateOrigin,
offsetMode
});

if (offsetMode) {
const positionCommonSpace = viewport.projectPosition(
geospatialOrigin || shaderCoordinateOrigin
);
vec3.sub(worldPosition, worldPosition, positionCommonSpace);
}

return worldPosition;
}
38 changes: 24 additions & 14 deletions modules/core/src/shaderlib/project/viewport-uniforms.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,20 +35,13 @@ const IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
const DEFAULT_PIXELS_PER_UNIT2 = [0, 0, 0];
const DEFAULT_COORDINATE_ORIGIN = [0, 0, 0];

// Based on viewport-mercator-project/test/fp32-limits.js
export const LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD = 12;

const getMemoizedViewportUniforms = memoize(calculateViewportUniforms);

// The code that utilizes Matrix4 does the same calculation as their mat4 counterparts,
// has lower performance but provides error checking.
// Uncomment when debugging
function calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin) {
const {viewMatrixUncentered, projectionMatrix, projectionMode} = viewport;
let {viewMatrix, viewProjectionMatrix} = viewport;

let projectionCenter = ZERO_VECTOR;
let cameraPosCommon = viewport.cameraPosition;
export function getOffsetOrigin(
viewport,
coordinateSystem,
coordinateOrigin = DEFAULT_COORDINATE_ORIGIN
) {
let shaderCoordinateOrigin = coordinateOrigin;
let geospatialOrigin;
let offsetMode = true;
Expand All @@ -64,7 +57,7 @@ function calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin)
: null;
}

switch (projectionMode) {
switch (viewport.projectionMode) {
case PROJECTION_MODE.WEB_MERCATOR:
if (
coordinateSystem === COORDINATE_SYSTEM.LNGLAT ||
Expand Down Expand Up @@ -99,6 +92,23 @@ function calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin)

shaderCoordinateOrigin[2] = shaderCoordinateOrigin[2] || 0;

return {geospatialOrigin, shaderCoordinateOrigin, offsetMode};
}

// The code that utilizes Matrix4 does the same calculation as their mat4 counterparts,
// has lower performance but provides error checking.
function calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin) {
const {viewMatrixUncentered, projectionMatrix} = viewport;
let {viewMatrix, viewProjectionMatrix} = viewport;

let projectionCenter = ZERO_VECTOR;
let cameraPosCommon = viewport.cameraPosition;
const {geospatialOrigin, shaderCoordinateOrigin, offsetMode} = getOffsetOrigin(
viewport,
coordinateSystem,
coordinateOrigin
);

if (offsetMode) {
// Calculate transformed projectionCenter (using 64 bit precision JS)
// This is the key to offset mode precision
Expand Down Expand Up @@ -154,7 +164,7 @@ export function getUniformsFromViewport({
modelMatrix = null,
// Match Layer.defaultProps
coordinateSystem = COORDINATE_SYSTEM.DEFAULT,
coordinateOrigin = DEFAULT_COORDINATE_ORIGIN,
coordinateOrigin,
wrapLongitude = false,
// Deprecated
projectionMode,
Expand Down
38 changes: 35 additions & 3 deletions test/modules/core/shaderlib/project/project-functions.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

import test from 'tape-catch';

import {COORDINATE_SYSTEM, WebMercatorViewport} from 'deck.gl';
import {COORDINATE_SYSTEM, WebMercatorViewport, OrthographicView} from 'deck.gl';
import {project} from '@deck.gl/core/shaderlib';
import {projectPosition} from '@deck.gl/core/shaderlib/project/project-functions';
import {equals, config} from 'math.gl';
Expand All @@ -41,7 +41,7 @@ const TEST_COORDINATE_ORIGIN = [-122.45, 37.78, 0];

const TEST_CASES = [
{
title: 'LNGLAT',
title: 'LNGLAT:WEB_MERCATOR',
position: [-70, 41, 1000],
params: {
viewport: TEST_VIEWPORT_2,
Expand All @@ -50,14 +50,46 @@ const TEST_CASES = [
result: [156.44444444444446, 320.0378755678335, 0.01687089818244227]
},
{
title: 'LNGLAT_AUTO_OFFSET',
title: 'LNGLAT:WEB_MERCATOR_AUTO_OFFSET',
position: [-122.46, 37.8, 1000],
params: {
viewport: TEST_VIEWPORT,
coordinateSystem: COORDINATE_SYSTEM.DEFAULT
},
result: [-0.014226562499999318, 0.03599588695612965, 0.016187212628251565]
},
{
title: 'CARTESIAN:IDENTITY',
position: [-10, 10, 10],
params: {
viewport: new OrthographicView().makeViewport({
viewState: {
target: [3.1416, 2.7183, 0],
zoom: 4
}
}),
coordinateSystem: COORDINATE_SYSTEM.DEFAULT
},
result: [-13.1416, 7.2817, 10]
},
{
title: 'CARTESIAN:WEB_MERCATOR',
position: [256, 256, 0],
params: {
viewport: TEST_VIEWPORT_2,
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN
},
result: [256, 256, 0]
},
{
title: 'CARTESIAN:WEB_MERCATOR_AUTO_OFFSET',
position: [256, 256, 0],
params: {
viewport: TEST_VIEWPORT,
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN
},
result: [174.15111111111113, -58.11045723102637, 0]
},
{
title: 'LNGLAT_OFFSETS',
position: [-0.05, 0.06, 50],
Expand Down

0 comments on commit 20d2fec

Please sign in to comment.