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