1 /*************************************** 2 * Copyright 2011, 2012 GlobWeb contributors. 3 * 4 * This file is part of GlobWeb. 5 * 6 * GlobWeb is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU Lesser General Public License as published by 8 * the Free Software Foundation, version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * GlobWeb is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with GlobWeb. If not, see <http://www.gnu.org/licenses/>. 18 ***************************************/ 19 20 define( function() { 21 22 /**************************************************************************************************************/ 23 24 /** 25 @class Manage the various vector renderer. 26 @constructor 27 @param globe the globe 28 */ 29 var VectorRendererManager = function(globe) 30 { 31 this.globe = globe; 32 this.factories = []; 33 34 // Clone 'global' factories to this instance 35 var globalFactories = VectorRendererManager.globalFactories; 36 for ( var i = 0; i < globalFactories.length; i++ ) 37 { 38 this.factories.push( { id: globalFactories[i].id, creator: globalFactories[i].creator, canApply: globalFactories[i].canApply, instance: null } ); 39 } 40 } 41 42 /**************************************************************************************************************/ 43 44 /** 45 A global array that contains a factory for each vector renderer 46 A factory is just two function : 47 @see VectorRendererManager.registerRenderer 48 */ 49 VectorRendererManager.globalFactories = []; 50 51 52 /**************************************************************************************************************/ 53 54 /** 55 Register a renderer in the manager 56 @param factory the factory to create a renderer 57 @param factory.creator a function to create a renderer 58 @param factory.canApply a function to check if the renderer can be applied 59 */ 60 VectorRendererManager.registerRenderer = function(factory) 61 { 62 VectorRendererManager.globalFactories.push( factory ); 63 } 64 65 /**************************************************************************************************************/ 66 67 /** 68 Get a renderer compatible for the given type and style 69 */ 70 VectorRendererManager.prototype.getRenderer = function(id) 71 { 72 for ( var i = 0; i < this.factories.length; i++ ) 73 { 74 var factory = this.factories[i]; 75 if ( factory.id == id ) 76 { 77 if ( !factory.instance ) 78 { 79 factory.instance = factory.creator(this.globe); 80 this.globe.tileManager.addPostRenderer(factory.instance); 81 } 82 return factory.instance; 83 } 84 } 85 86 return null; 87 } 88 89 /**************************************************************************************************************/ 90 91 /** 92 Add a geometry to renderers 93 */ 94 VectorRendererManager.prototype.addGeometry = function(geometry,layer,style) 95 { 96 var type = geometry['type']; 97 for ( var i = 0; i < this.factories.length; i++ ) 98 { 99 var factory = this.factories[i]; 100 if ( factory.canApply(type,style) ) 101 { 102 if ( !factory.instance ) 103 { 104 factory.instance = factory.creator(this.globe); 105 this.globe.tileManager.addPostRenderer(factory.instance); 106 } 107 factory.instance.addGeometry(geometry,layer,style); 108 } 109 } 110 } 111 112 /**************************************************************************************************************/ 113 114 /** 115 Remove a geometry from renderers 116 */ 117 VectorRendererManager.prototype.removeGeometry = function(geometry,layer) 118 { 119 for ( var i = 0; i < this.factories.length; i++ ) 120 { 121 var factory = this.factories[i]; 122 if ( factory.instance ) 123 { 124 factory.instance.removeGeometry(geometry,layer); 125 } 126 } 127 } 128 129 /**************************************************************************************************************/ 130 131 return VectorRendererManager; 132 133 }); 134