package alternativa.engine3d.display {
	import alternativa.engine3d.*;
	import alternativa.engine3d.core.PolyPrimitive;
	import alternativa.engine3d.materials.SurfaceMaterial;
	
	import flash.display.Graphics;
	import flash.display.Sprite;
	
	use namespace alternativa3d;
	
	/**
	 * @private
	 * Контейнер, исползуемый материалами для отрисовки примитивов. Каждый примитив BSP-дерева рисуется в своём контейнере.
	 */
	public class Skin extends Sprite {

		/**
		 * @private
		 * Графика скина (для быстрого доступа)
		 */
		alternativa3d var gfx:Graphics = graphics;

		/**
		 * @private
		 * Ссылка на следующий скин
		 */
		alternativa3d var nextSkin:Skin;
		
		/**
		 * @private
		 * Примитив
		 */
		alternativa3d var primitive:PolyPrimitive;

		/**
		 * @private
		 * Материал, связанный со скином.
		 */
		alternativa3d var material:SurfaceMaterial;
		
		// Хранилище неиспользуемых скинов
		static private var collector:Array = new Array();

		/**
		 * @private
		 * Создание скина.
		 */
		static alternativa3d function createSkin():Skin {
			// Достаём скин из коллектора
			var skin:Skin = collector.pop();
			// Если коллектор пуст, создаём новый скин
			if (skin == null) {
				skin = new Skin();
			}
			return skin;
		}

		/**
		 * @private
		 * Удаление скина, все ссылки должны быть почищены.
		 */
		static alternativa3d function destroySkin(skin:Skin):void {
			collector.push(skin);
		}
	}
}