/src/aerys/minko/example/core/points/PointsShader.as
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}