(function(){ 'use strict'; /** * Google streetview panorama * * [How to get Panorama ID]{@link http://stackoverflow.com/questions/29916149/google-maps-streetview-how-to-get-panorama-id} * @constructor * @param {string} panoId - Panorama id from Google Streetview * @param {number} [radius=5000] - The minimum radius for this panoram */ PANOLENS.GoogleStreetviewPanorama = function ( panoId, radius ) { PANOLENS.ImagePanorama.call( this, undefined, radius ); this.panoId = panoId; this.gsvLoader = undefined; this.loadRequested = false; this.setupGoogleMapAPI(); } PANOLENS.GoogleStreetviewPanorama.prototype = Object.create( PANOLENS.ImagePanorama.prototype ); PANOLENS.GoogleStreetviewPanorama.constructor = PANOLENS.GoogleStreetviewPanorama; /** * Load Google Street View by panorama id * @param {string} panoId - Gogogle Street View panorama id */ PANOLENS.GoogleStreetviewPanorama.prototype.load = function ( panoId ) { this.loadRequested = true; panoId = ( panoId || this.panoId ) || {}; if ( panoId && this.gsvLoader ) { this.loadGSVLoader( panoId ); } else { this.gsvLoader = {}; } }; /** * Setup Google Map API */ PANOLENS.GoogleStreetviewPanorama.prototype.setupGoogleMapAPI = function () { var script = document.createElement( 'script' ); script.src = 'https://maps.googleapis.com/maps/api/js'; script.onreadystatechange = this.setGSVLoader.bind( this ); script.onload = this.setGSVLoader.bind( this ); document.getElementsByTagName('head')[0].appendChild( script ); }; /** * Set GSV Loader */ PANOLENS.GoogleStreetviewPanorama.prototype.setGSVLoader = function () { this.gsvLoader = new GSVPANO.PanoLoader(); if ( this.gsvLoader === {} || this.loadRequested ) { this.load(); } }; /** * Get GSV Loader * @return {object} GSV Loader instance */ PANOLENS.GoogleStreetviewPanorama.prototype.getGSVLoader = function () { return this.gsvLoader; }; /** * Load GSV Loader * @param {string} panoId - Gogogle Street View panorama id */ PANOLENS.GoogleStreetviewPanorama.prototype.loadGSVLoader = function ( panoId ) { this.loadRequested = false; this.gsvLoader.onProgress = this.onProgress.bind( this ); this.gsvLoader.onPanoramaLoad = this.onLoad.bind( this ); this.gsvLoader.setZoom( this.getZoomLevel() ); this.gsvLoader.load( panoId ); this.gsvLoader.loaded = true; }; /** * This will be called when panorama is loaded * @param {HTMLCanvasElement} canvas - Canvas where the tiles have been drawn */ PANOLENS.GoogleStreetviewPanorama.prototype.onLoad = function ( canvas ) { if ( !this.gsvLoader ) { return; } PANOLENS.ImagePanorama.prototype.onLoad.call( this, new THREE.Texture( canvas ) ); }; PANOLENS.GoogleStreetviewPanorama.prototype.reset = function () { this.gsvLoader = undefined; PANOLENS.ImagePanorama.prototype.reset.call( this ); }; })();