• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #pragma version(1)
2 
3 #pragma rs java_package_name(com.android.phasebeam)
4 
5 #include "rs_graphics.rsh"
6 #pragma stateVertex(parent);
7 #pragma stateStore(parent);
8 
9 rs_allocation textureDot;
10 rs_allocation textureBeam;
11 
12 rs_program_vertex vertBg;
13 rs_program_fragment fragBg;
14 
15 rs_program_vertex vertDots;
16 rs_program_fragment fragDots;
17 
18 static int numBeamParticles;
19 static int numDotParticles;
20 static int numVertColors;
21 
22 typedef struct __attribute__((packed, aligned(4))) Particle {
23     float3 position;
24     float offsetX;
25 } Particle_t;
26 
27 typedef struct VpConsts {
28     rs_matrix4x4 MVP;
29     float scaleSize;
30 } VpConsts_t;
31 VpConsts_t *vpConstants;
32 
33 typedef struct VertexColor_s {
34     float3 position;
35     float offsetX;
36     float4 color;
37 } VertexColor;
38 
39 VertexColor* vertexColors;
40 Particle_t *dotParticles;
41 Particle_t *beamParticles;
42 rs_mesh dotMesh;
43 rs_mesh beamMesh;
44 rs_mesh gBackgroundMesh;
45 
46 float densityDPI;
47 float xOffset = 0.5;
48 
49 static float screenWidth;
50 static float screenHeight;
51 static float halfScreenWidth;
52 static float quarterScreenWidth;
53 static float quarterScreenHeight;
54 static float halfScreenHeight;
55 
56 static float newOffset = 0.5;
57 static float oldOffset = 0.5;
58 
59 void positionParticles() {
60     screenWidth = rsgGetWidth();
61     screenHeight = rsgGetHeight();
62     halfScreenWidth = screenWidth/2.0f;
63     halfScreenHeight = screenHeight/2.0f;
64     quarterScreenWidth = screenWidth/4.0f;
65     quarterScreenHeight = screenHeight/4.0f;
66     Particle_t* particle = dotParticles;
67     numDotParticles = rsAllocationGetDimX(rsGetAllocation(dotParticles));
68     numVertColors = rsAllocationGetDimX(rsGetAllocation(vertexColors));
69     for(int i=0; i<numDotParticles; i++) {
70         particle->position.x = rsRand(0.0f, 3.0f);
71         particle->position.y = rsRand(-1.25f, 1.25f);
72 
73         float z;
74         if (i < 3) {
75             z = 14.0f;
76         } else if(i < 7) {
77             z = 25.0f;
78         } else if(i < 4) {
79             z = rsRand(10.f, 20.f);
80         } else if(i == 10) {
81             z = 24.0f;
82             particle->position.x = 1.0;
83         } else {
84             z = rsRand(6.0f, 14.0f);
85         }
86         particle->position.z = z;
87         particle->offsetX = 0;
88 
89         particle++;
90     }
91 
92     Particle_t* beam = beamParticles;
93     numBeamParticles = rsAllocationGetDimX(rsGetAllocation(beamParticles));
94     for(int i=0; i<numBeamParticles; i++) {
95         float z;
96         if(i < 20) {
97             z = rsRand(4.0f, 10.0f)/2.0f;
98         } else {
99             z = rsRand(4.0f, 35.0f)/2.0f;
100         }
101         beamParticles->position.x = rsRand(-1.25f, 1.25f);
102         beamParticles->position.y = rsRand(-1.05f, 1.205f);
103 
104         beamParticles->position.z = z;
105         beamParticles->offsetX = 0;
106         beamParticles++;
107     }
108 }
109 
110 int root() {
111 
112     newOffset = xOffset*2;
113     rsgClearColor(0.0f, 0.f, 0.f,1.0f);
114 
115     if(newOffset != oldOffset) {
116         VertexColor* vert = vertexColors;
117         for(int i=0; i<numVertColors; i++) {
118             vert->offsetX = -xOffset/2.0;
119             vert++;
120         }
121     }
122 
123     rsgBindProgramVertex(vertBg);
124     rsgBindProgramFragment(fragBg);
125 
126     rsgDrawMesh(gBackgroundMesh);
127 
128     Particle_t* beam = beamParticles;
129     Particle_t* particle = dotParticles;
130 
131     for(int i=0; i<numDotParticles; i++) {
132 
133         if(newOffset==oldOffset) {
134             if(beam->position.x/beam->position.z > 0.5) {
135                 beam->position.x = -1.0;
136             }
137             if(particle->position.x/particle->position.z > 0.5) {
138                 particle->position.x = -1.0;
139             }
140 
141             if(beam->position.y > 1.05) {
142                 beam->position.y = -1.05;
143                 beam->position.x = rsRand(-1.25f, 1.25f);
144             } else {
145                 beam->position.y = beam->position.y + 0.000160*beam->position.z;
146             }
147             if(particle->position.y > 1.25) {
148                 particle->position.y = -1.25;
149                 particle->position.x = rsRand(0.0f, 3.0f);
150 
151             } else {
152                 particle->position.y = particle->position.y + 0.00022*particle->position.z;
153             }
154         }
155 
156         beam->position.x = beam->position.x + 0.0001*beam->position.z;
157         beam->offsetX = newOffset;
158         beam++;
159         particle->offsetX = newOffset;
160         particle->position.x = particle->position.x + 0.0001560*beam->position.z;
161         particle++;
162     }
163 
164     rsgBindProgramVertex(vertDots);
165     rsgBindProgramFragment(fragDots);
166 
167     rsgBindTexture(fragDots, 0, textureBeam);
168     rsgDrawMesh(beamMesh);
169 
170     rsgBindTexture(fragDots, 0, textureDot);
171     rsgDrawMesh(dotMesh);
172 
173     oldOffset = newOffset;
174 
175     return 66;
176 
177 }
178