110 lines
3.1 KiB
JavaScript
110 lines
3.1 KiB
JavaScript
import * as echarts from 'echarts/lib/echarts';
|
|
import graphicGL from '../../util/graphicGL';
|
|
import OrbitControl from '../../util/OrbitControl';
|
|
import SceneHelper from '../../component/common/SceneHelper';
|
|
import Geo3DBuilder from '../../component/common/Geo3DBuilder';
|
|
export default echarts.ChartView.extend({
|
|
type: 'map3D',
|
|
__ecgl__: true,
|
|
init: function (ecModel, api) {
|
|
this._geo3DBuilder = new Geo3DBuilder(api);
|
|
this.groupGL = new graphicGL.Node();
|
|
},
|
|
render: function (map3DModel, ecModel, api) {
|
|
var coordSys = map3DModel.coordinateSystem;
|
|
|
|
if (!coordSys || !coordSys.viewGL) {
|
|
return;
|
|
}
|
|
|
|
this.groupGL.add(this._geo3DBuilder.rootNode);
|
|
coordSys.viewGL.add(this.groupGL);
|
|
var geo3D;
|
|
|
|
if (coordSys.type === 'geo3D') {
|
|
geo3D = coordSys;
|
|
|
|
if (!this._sceneHelper) {
|
|
this._sceneHelper = new SceneHelper();
|
|
|
|
this._sceneHelper.initLight(this.groupGL);
|
|
}
|
|
|
|
this._sceneHelper.setScene(coordSys.viewGL.scene);
|
|
|
|
this._sceneHelper.updateLight(map3DModel); // Set post effect
|
|
|
|
|
|
coordSys.viewGL.setPostEffect(map3DModel.getModel('postEffect'), api);
|
|
coordSys.viewGL.setTemporalSuperSampling(map3DModel.getModel('temporalSuperSampling'));
|
|
var control = this._control;
|
|
|
|
if (!control) {
|
|
control = this._control = new OrbitControl({
|
|
zr: api.getZr()
|
|
});
|
|
|
|
this._control.init();
|
|
}
|
|
|
|
var viewControlModel = map3DModel.getModel('viewControl');
|
|
control.setViewGL(coordSys.viewGL);
|
|
control.setFromViewControlModel(viewControlModel, 0);
|
|
control.off('update');
|
|
control.on('update', function () {
|
|
api.dispatchAction({
|
|
type: 'map3DChangeCamera',
|
|
alpha: control.getAlpha(),
|
|
beta: control.getBeta(),
|
|
distance: control.getDistance(),
|
|
from: this.uid,
|
|
map3DId: map3DModel.id
|
|
});
|
|
});
|
|
this._geo3DBuilder.extrudeY = true;
|
|
} else {
|
|
if (this._control) {
|
|
this._control.dispose();
|
|
|
|
this._control = null;
|
|
}
|
|
|
|
if (this._sceneHelper) {
|
|
this._sceneHelper.dispose();
|
|
|
|
this._sceneHelper = null;
|
|
}
|
|
|
|
geo3D = map3DModel.getData().getLayout('geo3D');
|
|
this._geo3DBuilder.extrudeY = false;
|
|
}
|
|
|
|
this._geo3DBuilder.update(map3DModel, ecModel, api, 0, map3DModel.getData().count()); // Must update after geo3D.viewGL.setPostEffect to determine linear space
|
|
|
|
|
|
var srgbDefineMethod = coordSys.viewGL.isLinearSpace() ? 'define' : 'undefine';
|
|
|
|
this._geo3DBuilder.rootNode.traverse(function (mesh) {
|
|
if (mesh.material) {
|
|
mesh.material[srgbDefineMethod]('fragment', 'SRGB_DECODE');
|
|
}
|
|
});
|
|
},
|
|
afterRender: function (map3DModel, ecModel, api, layerGL) {
|
|
var renderer = layerGL.renderer;
|
|
var coordSys = map3DModel.coordinateSystem;
|
|
|
|
if (coordSys && coordSys.type === 'geo3D') {
|
|
this._sceneHelper.updateAmbientCubemap(renderer, map3DModel, api);
|
|
|
|
this._sceneHelper.updateSkybox(renderer, map3DModel, api);
|
|
}
|
|
},
|
|
dispose: function () {
|
|
this.groupGL.removeAll();
|
|
|
|
this._control.dispose();
|
|
|
|
this._geo3DBuilder.dispose();
|
|
}
|
|
}); |