PageRenderTime 25ms CodeModel.GetById 12ms app.highlight 10ms RepoModel.GetById 0ms app.codeStats 0ms

/src/aerys/minko/example/core/points/PointsShader.as

https://bitbucket.org/HopeSky/mars_nd2d
ActionScript | 97 lines | 78 code | 19 blank | 0 comment | 0 complexity | 7b6a7c70bbb299825c9b8ee80be27da3 MD5 | raw file
 1package aerys.minko.example.core.points
 2{
 3	import aerys.minko.render.RenderTarget;
 4	import aerys.minko.render.geometry.stream.format.VertexComponent;
 5	import aerys.minko.render.geometry.stream.format.VertexComponentType;
 6	import aerys.minko.render.geometry.stream.format.VertexFormat;
 7	import aerys.minko.render.shader.SFloat;
 8	import aerys.minko.render.shader.Shader;
 9	import aerys.minko.render.shader.ShaderSettings;
10	import aerys.minko.type.enum.Blending;
11	import aerys.minko.type.enum.DepthTest;
12	import aerys.minko.type.enum.TriangleCulling;
13	
14	public class PointsShader extends Shader
15	{
16		public static const POINT_OFFSET	: VertexComponent	= new VertexComponent(
17			['phase', 'speed'],
18			VertexComponentType.FLOAT_2
19		);
20		public static const POINT_DATA		: VertexComponent	= new VertexComponent(
21			['offsetX', 'offsetY'],
22			VertexComponentType.FLOAT_2
23		);
24		
25		public static const VERTEX_FORMAT	: VertexFormat	= new VertexFormat(
26			POINT_DATA,
27			POINT_OFFSET,
28			VertexComponent.XYZ,
29			VertexComponent.RGB
30		);
31		
32		private static const TIMESCALE	: Number	= 0.30;
33		
34		private var _varColor	: SFloat	= null;
35		private var _shiftColor	: SFloat	= null;
36		
37		public function PointsShader(target : RenderTarget = null, priority : Number = 0.0)
38		{
39			super(target, priority);
40		}
41		
42		override protected function initializeSettings(settings:ShaderSettings):void
43		{
44			super.initializeSettings(settings);
45			
46			settings.triangleCulling = TriangleCulling.NONE;
47			settings.blending = Blending.ADDITIVE;
48			settings.depthWriteEnabled = false;
49			settings.depthTest = DepthTest.ALWAYS;
50		}
51		
52		override protected function getVertexPosition() : SFloat
53		{
54			var time 		: SFloat 	= multiply(this.time, 0.001, TIMESCALE);
55			var uv 			: SFloat 	= getVertexAttribute(POINT_DATA).xy;
56			var shift		: SFloat	= cos(add(multiply(time, uv.y), uv.x));
57			
58			_varColor = vertexRGBColor;
59			_shiftColor = multiply(
60				min(1, add(6, multiply(5.75, shift))),
61				min(1, subtract(multiply(2, time), uv.x))
62			);
63			
64			var pointSize	: SFloat	= meshBindings.getParameter('pointSize', 1);
65			var position 	: SFloat 	= getVertexAttribute(VertexComponent.XYZ);
66			var corner 		: SFloat 	= multiply(
67				getVertexAttribute(POINT_OFFSET),
68				float4(pointSize.xx, 0, 0)
69			);
70			
71			position = add(position, float4(0, power(multiply(shift, 0.1), 1.5), 0, 0));
72			
73			position = localToView(position);
74			position.incrementBy(corner);
75			
76			return multiply4x4(position, projectionMatrix);
77		}
78		
79		override protected function getPixelColor() : SFloat
80		{
81			var xy : SFloat = interpolate(getVertexAttribute(POINT_OFFSET).xy);
82			var d : SFloat = dotProduct2(xy, xy);
83			
84			d = subtract(1, multiply(d, 4));
85			
86			kill(subtract(d, .2));
87			
88			var c : SFloat = interpolate(_varColor);
89			
90			c.scaleBy(power(d, 3));
91			c.incrementBy(multiply(0.5, power(d, 20)));
92			c.scaleBy(interpolate(_shiftColor));
93			
94			return c;
95		}
96	}
97}