mirror of
https://github.com/openglobus/openglobus.git
synced 2025-12-08 19:25:27 +00:00
231 lines
7.6 KiB
JavaScript
231 lines
7.6 KiB
JavaScript
/**
|
|
* @module og/Globe
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
import { EmptyTerrain } from './terrain/EmptyTerrain.js';
|
|
import { Handler } from './webgl/Handler.js';
|
|
import { Planet } from './scene/Planet.js';
|
|
import { Renderer } from './renderer/Renderer.js';
|
|
import { wgs84 } from './ellipsoid/wgs84.js';
|
|
import { isEmpty } from './utils/shared.js';
|
|
|
|
import { EarthCoordinates } from './control/EarthCoordinates.js';
|
|
import { MouseNavigation } from './control/MouseNavigation.js';
|
|
import { TouchNavigation } from './control/TouchNavigation.js';
|
|
import { Sun } from './control/Sun.js';
|
|
import { ZoomControl } from './control/ZoomControl.js';
|
|
|
|
/** @const {string} */
|
|
const CANVAS_ID_PREFIX = "globus_viewport_";
|
|
/** @const {string} */
|
|
const PLANET_NAME_PREFIX = "globus_planet_";
|
|
|
|
/**
|
|
* Creates a WebGL context with globe.
|
|
* @class
|
|
*
|
|
* @example <caption>Basic initialization</caption>
|
|
* globus = new og.Globe({
|
|
* 'atmosphere': false,
|
|
* 'target': 'globus',
|
|
* 'name': 'Earth',
|
|
* 'controls': [
|
|
* new og.control.MouseNavigation({ autoActivate: true }),
|
|
* new og.control.KeyboardNavigation({ autoActivate: true }),
|
|
* new og.control.EarthCoordinates({ autoActivate: true, center: false }),
|
|
* new og.control.LayerSwitcher({ autoActivate: true }),
|
|
* new og.control.ZoomControl({ autoActivate: true }),
|
|
* new og.control.TouchNavigation({ autoActivate: true }),
|
|
* new og.control.Sun({ autoActivate: true })
|
|
* ],
|
|
* 'terrain': new og.terrain.GlobusTerrain(),
|
|
* 'layers': [
|
|
* new og.layer.XYZ("OpenStreetMap", { isBaseLayer: true, url: "http://b.tile.openstreetmap.org/{z}/{x}/{y}.png", visibility: true, attribution: 'Data @ <a href="http://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="http://www.openstreetmap.org/copyright">ODbL</a>' })
|
|
* ],
|
|
* 'autoActivate': true
|
|
* });
|
|
*
|
|
* @param {object} options - Options:
|
|
* @param {string} options.target - HTML element id where planet canvas have to be created.
|
|
* @param {og.scene.RenderNode} [options.skybox] - Render skybox. null - default.
|
|
* @param {string} [options.name] - Planet name. Default is unic identifier.
|
|
* @param {og.terrain.Terrain} [options.terrain] - Terrain provider. Default no terrain - og.terrain.EmptyTerrain.
|
|
* @param {Array.<og.control.Control>} [options.controls] - Renderer controls array.
|
|
* @param {Array.<og.Layer>} [options.layers] - Planet layers.
|
|
* @param {og.Extent} [options.viewExtent] - Viewable starting extent.
|
|
* @param {boolean} [options.autoActivate] - Globe rendering auto activation flag. True is default.
|
|
*/
|
|
class Globe {
|
|
constructor(options) {
|
|
|
|
//Canvas creation.
|
|
var _canvasId = CANVAS_ID_PREFIX + Globe._staticCounter++;
|
|
|
|
this._canvas = document.createElement("canvas");
|
|
this._canvas.id = _canvasId;
|
|
this._canvas.style.width = "100%";
|
|
this._canvas.style.height = "100%";
|
|
this._canvas.style.display = "block";
|
|
this._canvas.style.opacity = "0.0";
|
|
this._canvas.style.transition = "opacity 1.0s";
|
|
|
|
/**
|
|
* Dom element where WebGL canvas creates
|
|
* @public
|
|
* @type {Element}
|
|
*/
|
|
this.div = document.getElementById(options.target);
|
|
this.div.appendChild(this._canvas);
|
|
this.div.classList.add("ogViewport");
|
|
function _disableWheel() { return false; }
|
|
function _enableWheel() { return true; }
|
|
this.div.onmouseenter = function () { document.onmousewheel = _disableWheel; };
|
|
this.div.onmouseleave = function () { document.onmousewheel = _enableWheel; };
|
|
|
|
/**
|
|
* Interface for the renderer context(events, input states, renderer nodes etc.)
|
|
* @public
|
|
* @type {og.Renderer}
|
|
*/
|
|
this.renderer = new Renderer(new Handler(_canvasId, {
|
|
'alpha': false,
|
|
'antialias': false
|
|
}), {
|
|
'autoActivate': false
|
|
});
|
|
this.renderer.initialize();
|
|
this.renderer.div = this.div;
|
|
this.renderer.div.attributions = document.createElement("div");
|
|
this.renderer.div.attributions.classList.add("ogAttribution");
|
|
this.div.appendChild(this.renderer.div.attributions);
|
|
|
|
//Skybox
|
|
if (options.skybox) {
|
|
this.renderer.addRenderNode(options.skybox);
|
|
}
|
|
|
|
/**
|
|
* Planet node name. Access with this.renderer.<name>
|
|
* @private
|
|
* @type {String}
|
|
*/
|
|
this._planetName = options.name ? options.name : PLANET_NAME_PREFIX + Globe._staticCounter;
|
|
|
|
if (options.atmosphere) {
|
|
/**
|
|
* Render node renders a planet.
|
|
* @public
|
|
* @type {og.scene.Planet|og.scene.PlanetAtmosphere}
|
|
*/
|
|
|
|
//TODO:
|
|
|
|
} else {
|
|
this.planet = new Planet(this._planetName, options.ellipsoid ? options.ellipsoid : wgs84);
|
|
}
|
|
|
|
//Attach terrain provider
|
|
if (options.terrain) {
|
|
this.planet.setTerrain(options.terrain);
|
|
} else {
|
|
this.planet.setTerrain(new EmptyTerrain());
|
|
}
|
|
|
|
this.renderer.addRenderNode(this.planet);
|
|
|
|
this.sun;
|
|
|
|
//Add controls
|
|
if (options.controls) {
|
|
this.planet.addControls(options.controls);
|
|
} else {
|
|
this.planet.addControls([
|
|
new MouseNavigation(),
|
|
new TouchNavigation(),
|
|
new ZoomControl(),
|
|
new EarthCoordinates()
|
|
]);
|
|
}
|
|
|
|
var _controls = this.renderer.controls;
|
|
for (var i in _controls) {
|
|
if (_controls[i] instanceof Sun) {
|
|
this.sun = _controls[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!this.sun) {
|
|
this.sun = new Sun();
|
|
this.planet.addControl(this.sun);
|
|
}
|
|
|
|
if (options.sun) {
|
|
if (options.sun.active !== undefined && !options.sun.active) {
|
|
this.sun.deactivate();
|
|
}
|
|
}
|
|
|
|
if (options.layers) {
|
|
this.planet.addLayers(options.layers);
|
|
}
|
|
|
|
//TODO: view center, altitude, extent
|
|
if (options.viewExtent) {
|
|
this.planet.viewToExtent(options.viewExtent);
|
|
}
|
|
|
|
this._opacityCounter = 0;
|
|
this._fadeHandler = null;
|
|
this._stopHandler = null;
|
|
|
|
//Run!
|
|
if (options.autoActivate || isEmpty(options.autoActivate)) {
|
|
this.renderer.start();
|
|
this.fadeIn();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Starts screen brightness fading in effect by the duration time.
|
|
* @public
|
|
*/
|
|
fadeIn() {
|
|
this._canvas.style.opacity = 1.0;
|
|
}
|
|
|
|
/**
|
|
* Starts screen brightness fading out effect by the duration time.
|
|
* @public
|
|
* @param {number} duration - Fadeout duration time.
|
|
*/
|
|
fadeOut() {
|
|
this._canvas.style.opacity = 0.0;
|
|
}
|
|
|
|
static get _staticCounter() {
|
|
if (!this._counter && this._counter !== 0) {
|
|
this._counter = 0;
|
|
}
|
|
return this._counter;
|
|
}
|
|
|
|
static set _staticCounter(n) {
|
|
this._counter = n;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the object pointer is undefined.
|
|
* @function
|
|
* @param {Object} obj - Object pointer.
|
|
* @returns {boolean} Returns true if object is undefined.
|
|
*/
|
|
static isUndefined(obj) {
|
|
return obj === void 0;
|
|
}
|
|
};
|
|
|
|
export { Globe };
|