mirror of https://gitee.com/antv-l7/antv-l7
fix(scene): 高清方案DPR
This commit is contained in:
parent
13e66a17fb
commit
f39f4c62bb
|
@ -80,4 +80,5 @@ L7 是由蚂蚁金服 AntV 数据可视化团队推出的基于 WebGL 的开源
|
|||
|
||||
L7 相关技术问题,需求反馈,我们会及时响应
|
||||
|
||||
![地理空间可视化L7支持群](https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*ePmsRbK4lZgAAAAAAAAAAABkARQnAQ)
|
||||
群号:30460926
|
||||
![地理空间可视化L7支持群](https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*W7IFQr6QSZYAAAAAAAAAAAAAARQnAQ)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { decodePickingColor, encodePickingColor } from '@antv/l7-utils';
|
||||
import { decodePickingColor, DOM, encodePickingColor } from '@antv/l7-utils';
|
||||
import { inject, injectable } from 'inversify';
|
||||
import {
|
||||
IMapService,
|
||||
|
@ -52,8 +52,8 @@ export default class PickingService implements IPickingService {
|
|||
width,
|
||||
height,
|
||||
} = (getContainer() as HTMLElement).getBoundingClientRect();
|
||||
width *= window.devicePixelRatio;
|
||||
height *= window.devicePixelRatio;
|
||||
width *= DOM.DPR;
|
||||
height *= DOM.DPR;
|
||||
this.pickBufferScale =
|
||||
this.configService.getSceneConfig(id).pickBufferScale || 1;
|
||||
// 创建 picking framebuffer,后续实时 resize
|
||||
|
@ -92,8 +92,8 @@ export default class PickingService implements IPickingService {
|
|||
width,
|
||||
height,
|
||||
} = (getContainer() as HTMLElement).getBoundingClientRect();
|
||||
width *= window.devicePixelRatio;
|
||||
height *= window.devicePixelRatio;
|
||||
width *= DOM.DPR;
|
||||
height *= DOM.DPR;
|
||||
if (this.width !== width || this.height !== height) {
|
||||
this.pickingFBO.resize({
|
||||
width: Math.round(width / this.pickBufferScale),
|
||||
|
@ -133,16 +133,16 @@ export default class PickingService implements IPickingService {
|
|||
width,
|
||||
height,
|
||||
} = (getContainer() as HTMLElement).getBoundingClientRect();
|
||||
width *= window.devicePixelRatio;
|
||||
height *= window.devicePixelRatio;
|
||||
width *= DOM.DPR;
|
||||
height *= DOM.DPR;
|
||||
const { enableHighlight, enableSelect } = layer.getLayerConfig();
|
||||
|
||||
const xInDevicePixel = x * window.devicePixelRatio;
|
||||
const yInDevicePixel = y * window.devicePixelRatio;
|
||||
const xInDevicePixel = x * DOM.DPR;
|
||||
const yInDevicePixel = y * DOM.DPR;
|
||||
if (
|
||||
xInDevicePixel > width - 1 * window.devicePixelRatio ||
|
||||
xInDevicePixel > width - 1 * DOM.DPR ||
|
||||
xInDevicePixel < 0 ||
|
||||
yInDevicePixel > height - 1 * window.devicePixelRatio ||
|
||||
yInDevicePixel > height - 1 * DOM.DPR ||
|
||||
yInDevicePixel < 0
|
||||
) {
|
||||
return false;
|
||||
|
@ -151,9 +151,7 @@ export default class PickingService implements IPickingService {
|
|||
pickedColors = readPixels({
|
||||
x: Math.floor(xInDevicePixel / this.pickBufferScale),
|
||||
// 视口坐标系原点在左上,而 WebGL 在左下,需要翻转 Y 轴
|
||||
y: Math.floor(
|
||||
(height - (y + 1) * window.devicePixelRatio) / this.pickBufferScale,
|
||||
),
|
||||
y: Math.floor((height - (y + 1) * DOM.DPR) / this.pickBufferScale),
|
||||
width: 1,
|
||||
height: 1,
|
||||
data: new Uint8Array(1 * 1 * 4),
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { decodePickingColor, encodePickingColor } from '@antv/l7-utils';
|
||||
import { decodePickingColor, DOM, encodePickingColor } from '@antv/l7-utils';
|
||||
import { inject, injectable } from 'inversify';
|
||||
import { TYPES } from '../../../types';
|
||||
import {
|
||||
|
@ -141,8 +141,8 @@ export default class PixelPickingPass<
|
|||
const { width, height } = getViewportSize();
|
||||
const { enableHighlight, enableSelect } = this.layer.getLayerConfig();
|
||||
|
||||
const xInDevicePixel = x * window.devicePixelRatio;
|
||||
const yInDevicePixel = y * window.devicePixelRatio;
|
||||
const xInDevicePixel = x * DOM.DPR;
|
||||
const yInDevicePixel = y * DOM.DPR;
|
||||
if (
|
||||
xInDevicePixel > width ||
|
||||
xInDevicePixel < 0 ||
|
||||
|
@ -157,7 +157,7 @@ export default class PixelPickingPass<
|
|||
pickedColors = readPixels({
|
||||
x: Math.round(xInDevicePixel),
|
||||
// 视口坐标系原点在左上,而 WebGL 在左下,需要翻转 Y 轴
|
||||
y: Math.round(height - (y + 1) * window.devicePixelRatio),
|
||||
y: Math.round(height - (y + 1) * DOM.DPR),
|
||||
width: 1,
|
||||
height: 1,
|
||||
data: new Uint8Array(1 * 1 * 4),
|
||||
|
|
|
@ -318,7 +318,7 @@ export default class Scene extends EventEmitter implements ISceneService {
|
|||
}
|
||||
};
|
||||
private initContainer() {
|
||||
const pixelRatio = window.devicePixelRatio;
|
||||
const pixelRatio = DOM.DPR;
|
||||
const w = this.$container?.clientWidth || 400;
|
||||
const h = this.$container?.clientHeight || 300;
|
||||
const canvas = this.canvas;
|
||||
|
@ -337,7 +337,7 @@ export default class Scene extends EventEmitter implements ISceneService {
|
|||
}
|
||||
|
||||
private setCanvas() {
|
||||
const pixelRatio = window.devicePixelRatio;
|
||||
const pixelRatio = DOM.DPR;
|
||||
const w = this.$container?.clientWidth || 400;
|
||||
const h = this.$container?.clientHeight || 300;
|
||||
const canvas = this.canvas;
|
||||
|
|
|
@ -95,6 +95,7 @@ export function polygonTriangulation(feature: IEncodeFeature) {
|
|||
const { coordinates } = feature;
|
||||
const flattengeo = earcut.flatten(coordinates as number[][][]);
|
||||
const { vertices, dimensions, holes } = flattengeo;
|
||||
|
||||
return {
|
||||
indices: earcut(vertices, holes, dimensions),
|
||||
vertices,
|
||||
|
|
|
@ -53,7 +53,7 @@ export default class ShaderUniformPlugin implements ILayerPlugin {
|
|||
[CoordinateUniform.PixelsPerMeter]: this.coordinateSystemService.getPixelsPerMeter(),
|
||||
// 其他参数,例如视口大小、DPR 等
|
||||
u_ViewportSize: [width, height],
|
||||
u_DevicePixelRatio: window.devicePixelRatio,
|
||||
u_DevicePixelRatio: DOM.DPR,
|
||||
u_ModelMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
|
||||
u_PickingBuffer: layer.getLayerConfig().pickingBuffer || 0,
|
||||
}),
|
||||
|
|
|
@ -359,7 +359,7 @@ export class Map extends Camera {
|
|||
}
|
||||
|
||||
private resizeCanvas(width: number, height: number) {
|
||||
const pixelRatio = window.devicePixelRatio || 1;
|
||||
const pixelRatio = DOM.DPR || 1;
|
||||
this.canvas.width = pixelRatio * width;
|
||||
this.canvas.height = pixelRatio * height;
|
||||
|
||||
|
|
|
@ -152,3 +152,15 @@ export function printCanvas(canvas: HTMLCanvasElement) {
|
|||
// tslint:disable-next-line:no-console
|
||||
console.log('%c\n', css.join(''));
|
||||
}
|
||||
|
||||
export function getViewPortScale() {
|
||||
const meta = document.querySelector('meta[name="viewport"]');
|
||||
const contentItems = meta.content.split(',');
|
||||
const scale = contentItems.find((item) => {
|
||||
const [key, value] = item.split('=');
|
||||
return key === 'initial-scale';
|
||||
});
|
||||
return scale ? scale.split('=')[1] * 1 : 1;
|
||||
}
|
||||
|
||||
export const DPR = getViewPortScale() < 1 ? 1 : window.devicePixelRatio;
|
||||
|
|
|
@ -5,6 +5,6 @@
|
|||
"no-implicit-dependencies": false
|
||||
},
|
||||
"linterOptions": {
|
||||
"exclude": ["**/*.d.ts", "**/data/*.ts", "**/*.{test,story}.ts{,x}", "node_modules/**/*.d.ts"]
|
||||
"exclude": ["packages/l7/node_modules/**","**/*.d.ts", "**/data/*.ts", "**/*.{test,story}.ts{,x}", "node_modules/**/*.d.ts"]
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue