mirror of https://gitee.com/antv-l7/antv-l7
fix(scene): event on map
This commit is contained in:
parent
d300669fee
commit
cf5444f0a6
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@antv/l7",
|
"name": "@antv/l7",
|
||||||
"version": "1.0.1",
|
"version": "1.0.3",
|
||||||
"description": "Large-scale WebGL-powered Geospatial Data Visualization",
|
"description": "Large-scale WebGL-powered Geospatial Data Visualization",
|
||||||
"main": "build/l7.js",
|
"main": "build/l7.js",
|
||||||
"browser": "build/l7.js",
|
"browser": "build/l7.js",
|
||||||
|
|
|
@ -9,10 +9,7 @@ class Picking {
|
||||||
this._camera = camera;
|
this._camera = camera;
|
||||||
this._raycaster = new THREE.Raycaster();
|
this._raycaster = new THREE.Raycaster();
|
||||||
this.scene = scene;
|
this.scene = scene;
|
||||||
this._envents = [];
|
this._raycaster.linePrecision = 10;
|
||||||
|
|
||||||
// TODO: Match this with the line width used in the picking layers
|
|
||||||
this._raycaster.linePrecision = 3;
|
|
||||||
this._pickingScene = PickingScene;
|
this._pickingScene = PickingScene;
|
||||||
const size = this._renderer.getSize();
|
const size = this._renderer.getSize();
|
||||||
this._width = size.width;
|
this._width = size.width;
|
||||||
|
@ -21,7 +18,7 @@ class Picking {
|
||||||
magFilter: THREE.LinearFilter,
|
magFilter: THREE.LinearFilter,
|
||||||
format: THREE.RGBAFormat,
|
format: THREE.RGBAFormat,
|
||||||
stencilBuffer: false,
|
stencilBuffer: false,
|
||||||
depthBuffer: false
|
depthBuffer: true
|
||||||
};
|
};
|
||||||
|
|
||||||
this._pickingTexture = new THREE.WebGLRenderTarget(this._width, this._height, parameters);
|
this._pickingTexture = new THREE.WebGLRenderTarget(this._width, this._height, parameters);
|
||||||
|
@ -35,38 +32,15 @@ class Picking {
|
||||||
_initEvents() {
|
_initEvents() {
|
||||||
this._resizeHandler = this._resizeTexture.bind(this);
|
this._resizeHandler = this._resizeTexture.bind(this);
|
||||||
window.addEventListener('resize', this._resizeHandler, false);
|
window.addEventListener('resize', this._resizeHandler, false);
|
||||||
|
|
||||||
// this._mouseUpHandler = this._onMouseUp.bind(this);
|
|
||||||
// this._world._container.addEventListener('mouseup', this._mouseUpHandler, false);
|
|
||||||
// this._world._container.addEventListener('mousemove', this._mouseUpHandler, false);
|
|
||||||
// this._world._container.addEventListener('mousemove', this._onWorldMove.bind(this), false);
|
|
||||||
}
|
}
|
||||||
pickdata(event) {
|
pickdata(event) {
|
||||||
const point = { x: event.clientX, y: event.clientY, type: event.type };
|
const point = { x: event.pixel.x, y: event.pixel.y, type: event.type };
|
||||||
|
|
||||||
const normalisedPoint = { x: 0, y: 0 };
|
const normalisedPoint = { x: 0, y: 0 };
|
||||||
normalisedPoint.x = (point.x / this._width) * 2 - 1;
|
normalisedPoint.x = (point.x / this._width) * 2 - 1;
|
||||||
normalisedPoint.y = -(point.y / this._height) * 2 + 1;
|
normalisedPoint.y = -(point.y / this._height) * 2 + 1;
|
||||||
this._pickAllObject(point, normalisedPoint);
|
this._pickAllObject(point, normalisedPoint);
|
||||||
}
|
}
|
||||||
_onMouseUp(event) {
|
|
||||||
// Only react to main button click
|
|
||||||
// if (event.button !== 0) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
const point = { x: event.clientX, y: event.clientY, type: event.type };
|
|
||||||
const normalisedPoint = { x: 0, y: 0 };
|
|
||||||
normalisedPoint.x = (point.x / this._width) * 2 - 1;
|
|
||||||
normalisedPoint.y = -(point.y / this._height) * 2 + 1;
|
|
||||||
this._pickAllObject(point, normalisedPoint);
|
|
||||||
// this._pick(point, normalisedPoint);
|
|
||||||
}
|
|
||||||
_onWorldMove() {
|
|
||||||
|
|
||||||
this._needUpdate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Ensure this doesn't get out of sync issue with the renderer resize
|
|
||||||
_resizeTexture() {
|
_resizeTexture() {
|
||||||
const size = this._renderer.getSize();
|
const size = this._renderer.getSize();
|
||||||
|
|
||||||
|
@ -80,28 +54,11 @@ class Picking {
|
||||||
_update(point) {
|
_update(point) {
|
||||||
|
|
||||||
const texture = this._pickingTexture;
|
const texture = this._pickingTexture;
|
||||||
// if (this._needUpdate) {
|
|
||||||
this._renderer.render(this._pickingScene, this._camera, this._pickingTexture);
|
this._renderer.render(this._pickingScene, this._camera, this._pickingTexture);
|
||||||
// this._needUpdate = false;
|
|
||||||
// }
|
|
||||||
this.pixelBuffer = new Uint8Array(4);
|
this.pixelBuffer = new Uint8Array(4);
|
||||||
this._renderer.readRenderTargetPixels(texture, point.x, this._height - point.y, 1, 1, this.pixelBuffer);
|
this._renderer.readRenderTargetPixels(texture, point.x, this._height - point.y, 1, 1, this.pixelBuffer);
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
// 添加dom事件 支持 mousedown ,mouseenter mouseleave mousemove mouseover mouseout mouse up
|
|
||||||
on(type) {
|
|
||||||
|
|
||||||
this._mouseUpHandler = this._onMouseUp.bind(this);
|
|
||||||
this._world._container.addEventListener(type, this._mouseUpHandler, false);
|
|
||||||
this._envents.push([ type, this._mouseUpHandler ]);
|
|
||||||
}
|
|
||||||
off(type, hander) {
|
|
||||||
this._world._container.removeEventListener(type, this._mouseUpHandler, false);
|
|
||||||
this._envents = this._envents.filter(item => {
|
|
||||||
return item[0] === 'type' && hander === item[1];
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
_filterObject(id) {
|
_filterObject(id) {
|
||||||
this._pickingScene.children.forEach((object, index) => {
|
this._pickingScene.children.forEach((object, index) => {
|
||||||
|
@ -124,9 +81,7 @@ class Picking {
|
||||||
|
|
||||||
_pick(point, normalisedPoint, layerId) {
|
_pick(point, normalisedPoint, layerId) {
|
||||||
this._update(point);
|
this._update(point);
|
||||||
// Interpret the pixel as an ID
|
|
||||||
let id = (this.pixelBuffer[2] * 255 * 255) + (this.pixelBuffer[1] * 255) + (this.pixelBuffer[0]);
|
let id = (this.pixelBuffer[2] * 255 * 255) + (this.pixelBuffer[1] * 255) + (this.pixelBuffer[0]);
|
||||||
// Skip if ID is 16646655 (white) as the background returns this
|
|
||||||
if (id === 16646655 || this.pixelBuffer[3] === 0) {
|
if (id === 16646655 || this.pixelBuffer[3] === 0) {
|
||||||
id = -999;
|
id = -999;
|
||||||
// return;
|
// return;
|
||||||
|
@ -134,9 +89,6 @@ class Picking {
|
||||||
|
|
||||||
this._raycaster.setFromCamera(normalisedPoint, this._camera);
|
this._raycaster.setFromCamera(normalisedPoint, this._camera);
|
||||||
|
|
||||||
// Perform ray intersection on picking scene
|
|
||||||
//
|
|
||||||
// TODO: Only perform intersection test on the relevant picking mesh
|
|
||||||
const intersects = this._raycaster.intersectObjects(this._pickingScene.children, true);
|
const intersects = this._raycaster.intersectObjects(this._pickingScene.children, true);
|
||||||
const _point2d = { x: point.x, y: point.y };
|
const _point2d = { x: point.x, y: point.y };
|
||||||
|
|
||||||
|
@ -144,11 +96,6 @@ class Picking {
|
||||||
if (intersects.length > 0) {
|
if (intersects.length > 0) {
|
||||||
_point3d = intersects[0].point;
|
_point3d = intersects[0].point;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass along as much data as possible for now until we know more about how
|
|
||||||
// people use the picking API and what the returned data should be
|
|
||||||
//
|
|
||||||
// TODO: Look into the leak potential for passing so much by reference here
|
|
||||||
const item = {
|
const item = {
|
||||||
layerId,
|
layerId,
|
||||||
featureId: id - 1,
|
featureId: id - 1,
|
||||||
|
|
|
@ -83,14 +83,6 @@ export default class Scene extends Base {
|
||||||
getLayers() {
|
getLayers() {
|
||||||
return this._layers;
|
return this._layers;
|
||||||
}
|
}
|
||||||
_addLight() {
|
|
||||||
// const scene = this._engine._scene;
|
|
||||||
// //const ambientLight = new THREE.AmbientLight(0xaaaaaa);
|
|
||||||
// scene.add(ambientLight);
|
|
||||||
|
|
||||||
// const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
|
|
||||||
// scene.add(directionalLight);
|
|
||||||
}
|
|
||||||
_addLayer() {
|
_addLayer() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -102,11 +94,12 @@ export default class Scene extends Base {
|
||||||
'mousedown',
|
'mousedown',
|
||||||
'mouseleave',
|
'mouseleave',
|
||||||
'mouseup',
|
'mouseup',
|
||||||
|
'rightclick',
|
||||||
'click',
|
'click',
|
||||||
'dblclick'
|
'dblclick'
|
||||||
];
|
];
|
||||||
events.forEach(event => {
|
events.forEach(event => {
|
||||||
this._container.addEventListener(event, e => {
|
this.map.on(event, e => {
|
||||||
// 要素拾取
|
// 要素拾取
|
||||||
this._engine._picking.pickdata(e);
|
this._engine._picking.pickdata(e);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
|
@ -37,7 +37,7 @@ export default class GeojsonSource extends Source {
|
||||||
return selectFeatureIds;
|
return selectFeatureIds;
|
||||||
|
|
||||||
}
|
}
|
||||||
getSelectFeature(featureId){
|
getSelectFeature(featureId) {
|
||||||
const data = this.get('data');
|
const data = this.get('data');
|
||||||
return data.features[featureId];
|
return data.features[featureId];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue