89 lines
2.6 KiB
JavaScript
89 lines
2.6 KiB
JavaScript
|
|
import Geo3DBuilder from '../common/Geo3DBuilder';
|
||
|
|
import * as echarts from 'echarts/lib/echarts';
|
||
|
|
import graphicGL from '../../util/graphicGL';
|
||
|
|
import OrbitControl from '../../util/OrbitControl';
|
||
|
|
import SceneHelper from '../common/SceneHelper';
|
||
|
|
export default echarts.ComponentView.extend({
|
||
|
|
type: 'geo3D',
|
||
|
|
__ecgl__: true,
|
||
|
|
init: function (ecModel, api) {
|
||
|
|
this._geo3DBuilder = new Geo3DBuilder(api);
|
||
|
|
this.groupGL = new graphicGL.Node();
|
||
|
|
this._lightRoot = new graphicGL.Node();
|
||
|
|
this._sceneHelper = new SceneHelper(this._lightRoot);
|
||
|
|
|
||
|
|
this._sceneHelper.initLight(this._lightRoot);
|
||
|
|
|
||
|
|
this._control = new OrbitControl({
|
||
|
|
zr: api.getZr()
|
||
|
|
});
|
||
|
|
|
||
|
|
this._control.init();
|
||
|
|
},
|
||
|
|
render: function (geo3DModel, ecModel, api) {
|
||
|
|
this.groupGL.add(this._geo3DBuilder.rootNode);
|
||
|
|
var geo3D = geo3DModel.coordinateSystem;
|
||
|
|
|
||
|
|
if (!geo3D || !geo3D.viewGL) {
|
||
|
|
return;
|
||
|
|
} // Always have light.
|
||
|
|
|
||
|
|
|
||
|
|
geo3D.viewGL.add(this._lightRoot);
|
||
|
|
|
||
|
|
if (geo3DModel.get('show')) {
|
||
|
|
geo3D.viewGL.add(this.groupGL);
|
||
|
|
} else {
|
||
|
|
geo3D.viewGL.remove(this.groupGL);
|
||
|
|
}
|
||
|
|
|
||
|
|
var control = this._control;
|
||
|
|
control.setViewGL(geo3D.viewGL);
|
||
|
|
var viewControlModel = geo3DModel.getModel('viewControl');
|
||
|
|
control.setFromViewControlModel(viewControlModel, 0);
|
||
|
|
|
||
|
|
this._sceneHelper.setScene(geo3D.viewGL.scene);
|
||
|
|
|
||
|
|
this._sceneHelper.updateLight(geo3DModel); // Set post effect
|
||
|
|
|
||
|
|
|
||
|
|
geo3D.viewGL.setPostEffect(geo3DModel.getModel('postEffect'), api);
|
||
|
|
geo3D.viewGL.setTemporalSuperSampling(geo3DModel.getModel('temporalSuperSampling')); // Must update after geo3D.viewGL.setPostEffect
|
||
|
|
|
||
|
|
this._geo3DBuilder.update(geo3DModel, ecModel, api, 0, geo3DModel.getData().count());
|
||
|
|
|
||
|
|
var srgbDefineMethod = geo3D.viewGL.isLinearSpace() ? 'define' : 'undefine';
|
||
|
|
|
||
|
|
this._geo3DBuilder.rootNode.traverse(function (mesh) {
|
||
|
|
if (mesh.material) {
|
||
|
|
mesh.material[srgbDefineMethod]('fragment', 'SRGB_DECODE');
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
control.off('update');
|
||
|
|
control.on('update', function () {
|
||
|
|
api.dispatchAction({
|
||
|
|
type: 'geo3DChangeCamera',
|
||
|
|
alpha: control.getAlpha(),
|
||
|
|
beta: control.getBeta(),
|
||
|
|
distance: control.getDistance(),
|
||
|
|
center: control.getCenter(),
|
||
|
|
from: this.uid,
|
||
|
|
geo3DId: geo3DModel.id
|
||
|
|
});
|
||
|
|
});
|
||
|
|
control.update();
|
||
|
|
},
|
||
|
|
afterRender: function (geo3DModel, ecModel, api, layerGL) {
|
||
|
|
var renderer = layerGL.renderer;
|
||
|
|
|
||
|
|
this._sceneHelper.updateAmbientCubemap(renderer, geo3DModel, api);
|
||
|
|
|
||
|
|
this._sceneHelper.updateSkybox(renderer, geo3DModel, api);
|
||
|
|
},
|
||
|
|
dispose: function () {
|
||
|
|
this._control.dispose();
|
||
|
|
|
||
|
|
this._geo3DBuilder.dispose();
|
||
|
|
}
|
||
|
|
});
|