mirror of
				https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
				synced 2025-10-30 17:05:17 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			197 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			ActionScript
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			ActionScript
		
	
	
	
	
	
| package alternativa.engine3d.materials {
 | ||
| 	import alternativa.engine3d.*;
 | ||
| 	import alternativa.engine3d.core.Camera3D;
 | ||
| 	import alternativa.engine3d.core.Mesh;
 | ||
| 	import alternativa.engine3d.core.PolyPrimitive;
 | ||
| 	import alternativa.engine3d.core.Scene3D;
 | ||
| 	import alternativa.engine3d.core.Surface;
 | ||
| 	import alternativa.engine3d.display.Skin;
 | ||
| 	
 | ||
| 	import flash.display.BlendMode;
 | ||
| 	
 | ||
| 	use namespace alternativa3d;
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Базовый класс для материалов полигональных поверхностей.
 | ||
| 	 */	
 | ||
| 	public class SurfaceMaterial extends Material {
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Поверхность
 | ||
| 		 */
 | ||
| 		alternativa3d var _surface:Surface;
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Альфа
 | ||
| 		 */
 | ||
| 		alternativa3d var _alpha:Number;
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Режим наложения цвета
 | ||
| 		 */
 | ||
| 		alternativa3d var _blendMode:String = BlendMode.NORMAL;
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Материал использует информация об UV-координатах
 | ||
| 		 */
 | ||
| 		alternativa3d var useUV:Boolean = false;
 | ||
| 
 | ||
| 		/**
 | ||
| 		 * Создание экземпляра класса.
 | ||
| 		 * 
 | ||
| 		 * @param alpha коэффициент непрозрачности материала. Значение 1 соответствует полной непрозрачности, значение 0 соответствует полной прозрачности.
 | ||
| 		 * @param blendMode режим наложения цвета
 | ||
| 		 */
 | ||
| 		public function SurfaceMaterial(alpha:Number = 1, blendMode:String = BlendMode.NORMAL) {
 | ||
| 			_alpha = alpha;
 | ||
| 			_blendMode = blendMode;
 | ||
| 		}
 | ||
| 
 | ||
| 		/**
 | ||
| 		 * Поверхность, которой назначен материал.
 | ||
| 		 */
 | ||
| 		public function get surface():Surface {
 | ||
| 			return _surface;
 | ||
| 		}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Добавление на сцену
 | ||
| 		 * 
 | ||
| 		 * @param scene
 | ||
| 		 */		
 | ||
| 		alternativa3d function addToScene(scene:Scene3D):void {}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Удаление из сцены
 | ||
| 		 * 
 | ||
| 		 * @param scene
 | ||
| 		 */
 | ||
| 		alternativa3d function removeFromScene(scene:Scene3D):void {}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Добавление к мешу
 | ||
| 		 * 
 | ||
| 		 * @param mesh
 | ||
| 		 */
 | ||
| 		alternativa3d function addToMesh(mesh:Mesh):void {}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Удаление из меша
 | ||
| 		 * 
 | ||
| 		 * @param mesh
 | ||
| 		 */
 | ||
| 		alternativa3d function removeFromMesh(mesh:Mesh):void {}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Добавление на поверхность
 | ||
| 		 * 
 | ||
| 		 * @param surface
 | ||
| 		 */
 | ||
| 		alternativa3d function addToSurface(surface:Surface):void {
 | ||
| 			// Сохраняем поверхность
 | ||
| 			_surface = surface;
 | ||
| 		}
 | ||
| 
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Удаление с поверхности
 | ||
| 		 * 
 | ||
| 		 * @param surface
 | ||
| 		 */
 | ||
| 		alternativa3d function removeFromSurface(surface:Surface):void {
 | ||
| 			// Удаляем ссылку на поверхность
 | ||
| 			_surface = null;
 | ||
| 		}
 | ||
| 
 | ||
| 		/**
 | ||
| 		 * Коэффициент непрозрачности материала. Значение 1 соответствует полной непрозрачности, значение 0 соответствует полной прозрачности.
 | ||
| 		 */		
 | ||
| 		public function get alpha():Number {
 | ||
| 			return _alpha;
 | ||
| 		}
 | ||
| 
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 */		
 | ||
| 		public function set alpha(value:Number):void {
 | ||
| 			if (_alpha != value) {
 | ||
| 				_alpha = value;
 | ||
| 				if (_surface != null) {
 | ||
| 					_surface.addMaterialChangedOperationToScene();
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * Режим наложения цвета.
 | ||
| 		 */		
 | ||
| 		public function get blendMode():String {
 | ||
| 			return _blendMode;
 | ||
| 		}
 | ||
| 				
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 */		
 | ||
| 		public function set blendMode(value:String):void {
 | ||
| 			if (_blendMode != value) {
 | ||
| 				_blendMode = value;
 | ||
| 				if (_surface != null) {
 | ||
| 					_surface.addMaterialChangedOperationToScene();
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Метод определяет, может ли материал нарисовать указанный примитив. Метод используется в системе отрисовки сцены и должен использоваться
 | ||
| 		 * наследниками для указания видимости связанной с материалом поверхности или отдельного примитива. Реализация по умолчанию возвращает
 | ||
| 		 * <code>true</code>.
 | ||
| 		 * 
 | ||
| 		 * @param primitive примитив для проверки
 | ||
| 		 * 
 | ||
| 		 * @return <code>true</code>, если материал может отрисовать указанный примитив, иначе <code>false</code>
 | ||
| 		 */		
 | ||
| 		alternativa3d function canDraw(primitive:PolyPrimitive):Boolean {
 | ||
| 			return true;
 | ||
| 		}
 | ||
| 
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Метод очищает переданный скин (нарисованную графику, дочерние объекты и т.д.).
 | ||
| 		 * 
 | ||
| 		 * @param skin скин для очистки
 | ||
| 		 */
 | ||
| 		alternativa3d function clear(skin:Skin):void {
 | ||
| 			skin.gfx.clear();
 | ||
| 		}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @private
 | ||
| 		 * Метод выполняет отрисовку в заданный скин.
 | ||
| 		 * 
 | ||
| 		 * @param camera камера, вызвавшая метод
 | ||
| 		 * @param skin скин, в котором нужно рисовать
 | ||
| 		 * @param length длина массива points
 | ||
| 		 * @param points массив точек, определяющих отрисовываемый полигон. Каждый элемент массива является объектом класса
 | ||
| 		 *   <code>alternativa.engine3d.materials.DrawPoint</code>
 | ||
| 		 * 
 | ||
| 		 * @see DrawPoint
 | ||
| 		 */
 | ||
| 		alternativa3d function draw(camera:Camera3D, skin:Skin, length:uint, points:Array):void {
 | ||
| 			skin.alpha = _alpha;
 | ||
| 			skin.blendMode = _blendMode;
 | ||
| 		}
 | ||
| 		
 | ||
| 		/**
 | ||
| 		 * @inheritDoc
 | ||
| 		 */		
 | ||
| 		override public function clone():Material {
 | ||
| 			return new SurfaceMaterial(_alpha, _blendMode);
 | ||
| 		}
 | ||
| 	}
 | ||
| } | 
