• 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     numBeamParticles = rsAllocationGetDimX(rsGetAllocation(beamParticles));
93     for(int i=0; i<numBeamParticles; i++) {
94         float z;
95         if(i < 20) {
96             z = rsRand(4.0f, 10.0f)/2.0f;
97         } else {
98             z = rsRand(4.0f, 35.0f)/2.0f;
99         }
100         beamParticles->position.x = rsRand(-1.25f, 1.25f);
101         beamParticles->position.y = rsRand(-1.05f, 1.205f);
102 
103         beamParticles->position.z = z;
104         beamParticles->offsetX = 0;
105         beamParticles++;
106     }
107 }
108 
109 int root() {
110 
111     newOffset = xOffset*2;
112     rsgClearColor(0.0f, 0.f, 0.f,1.0f);
113 
114     if(newOffset != oldOffset) {
115         VertexColor* vert = vertexColors;
116         for(int i=0; i<numVertColors; i++) {
117             vert->offsetX = -xOffset/2.0;
118             vert++;
119         }
120     }
121 
122     rsgBindProgramVertex(vertBg);
123     rsgBindProgramFragment(fragBg);
124 
125     rsgDrawMesh(gBackgroundMesh);
126 
127     Particle_t* beam = beamParticles;
128     Particle_t* particle = dotParticles;
129 
130     for(int i=0; i<numDotParticles; i++) {
131 
132         if(newOffset==oldOffset) {
133             if(beam->position.x/beam->position.z > 0.5) {
134                 beam->position.x = -1.0;
135             }
136             if(particle->position.x/particle->position.z > 0.5) {
137                 particle->position.x = -1.0;
138             }
139 
140             if(beam->position.y > 1.05) {
141                 beam->position.y = -1.05;
142                 beam->position.x = rsRand(-1.25f, 1.25f);
143             } else {
144                 beam->position.y = beam->position.y + 0.000160*beam->position.z;
145             }
146             if(particle->position.y > 1.25) {
147                 particle->position.y = -1.25;
148                 particle->position.x = rsRand(0.0f, 3.0f);
149 
150             } else {
151                 particle->position.y = particle->position.y + 0.00022*particle->position.z;
152             }
153         }
154 
155         beam->position.x = beam->position.x + 0.0001*beam->position.z;
156         beam->offsetX = newOffset;
157         beam++;
158         particle->offsetX = newOffset;
159         particle->position.x = particle->position.x + 0.0001560*beam->position.z;
160         particle++;
161     }
162 
163     rsgBindProgramVertex(vertDots);
164     rsgBindProgramFragment(fragDots);
165 
166     rsgBindTexture(fragDots, 0, textureBeam);
167     rsgDrawMesh(beamMesh);
168 
169     rsgBindTexture(fragDots, 0, textureDot);
170     rsgDrawMesh(dotMesh);
171 
172     oldOffset = newOffset;
173 
174     return 66;
175 
176 }
177