summaryrefslogtreecommitdiffstats
path: root/src/com/android/galaxy4/galaxy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/galaxy4/galaxy.rs')
-rw-r--r--src/com/android/galaxy4/galaxy.rs179
1 files changed, 179 insertions, 0 deletions
diff --git a/src/com/android/galaxy4/galaxy.rs b/src/com/android/galaxy4/galaxy.rs
new file mode 100644
index 0000000..5117024
--- /dev/null
+++ b/src/com/android/galaxy4/galaxy.rs
@@ -0,0 +1,179 @@
+#pragma version(1)
+
+#pragma rs java_package_name(com.android.galaxy4)
+#include "rs_graphics.rsh"
+#pragma stateVertex(parent);
+#pragma stateStore(parent);
+
+typedef struct __attribute__((packed, aligned(4))) Particle {
+ float3 position;
+ uchar4 color;
+} Particle_t;
+
+typedef struct VpConsts {
+ rs_matrix4x4 MVP;
+} VpConsts_t;
+VpConsts_t *vpConstants;
+
+
+// hold clouds
+Particle_t *spaceClouds;
+
+// hold bg stars
+Particle_t *bgStars;
+
+rs_mesh spaceCloudsMesh;
+rs_mesh bgStarsMesh;
+
+rs_program_vertex vertSpaceClouds;
+rs_program_vertex vertBgStars;
+rs_program_fragment fragSpaceClouds;
+rs_program_fragment fragBgStars;
+rs_program_vertex vertBg;
+rs_program_fragment fragBg;
+
+rs_allocation textureSpaceCloud;
+rs_allocation textureFGStar;
+rs_allocation textureBg;
+
+static int gGalaxyRadius = 250;
+
+float xOffset;
+
+#define PI 3.1415f
+#define TWO_PI 6.283f
+
+/**
+ * Helper function to generate the stars.
+ */
+static float randomGauss() {
+ float x1;
+ float x2;
+ float w = 2.f;
+
+ while (w >= 1.0f) {
+ x1 = rsRand(2.0f) - 1.0f;
+ x2 = rsRand(2.0f) - 1.0f;
+ w = x1 * x1 + x2 * x2;
+ }
+
+ w = sqrt(-2.0f * log(w) / w);
+ return x1 * w;
+}
+
+static float mapf(float minStart, float minStop, float maxStart, float maxStop, float value) {
+ return maxStart + (maxStart - maxStop) * ((value - minStart) / (minStop - minStart));
+}
+
+
+
+void positionParticles(){
+ rsDebug("************************&&&&&&&&&&&&&&& Called positionBGStars", rsUptimeMillis());
+
+ float width = rsgGetWidth();
+ float height = rsgGetHeight();
+
+ float scale = gGalaxyRadius / (width * 0.5f);
+
+ // space clouds
+ Particle_t* particle = spaceClouds;
+ int size = rsAllocationGetDimX(rsGetAllocation(spaceClouds));
+ for(int i=0; i<size; i++){
+
+ float d = fabs(randomGauss()) * gGalaxyRadius * 0.5f + rsRand(64.0f);
+
+ d = mapf(-4.0f, gGalaxyRadius + 4.0f, 0.0f, scale, d);
+
+ float id = d / gGalaxyRadius;
+ float z = randomGauss() * 0.4f * (1.0f - id);
+
+ if (d > gGalaxyRadius * 0.15f) {
+ z *= 0.6f * (1.0f - id);
+ } else {
+ z *= 0.72f;
+ }
+
+ particle->position.x = rsRand(TWO_PI);
+ particle->position.y = d;
+ particle->position.z = z/5.0f;
+ particle->color = rsPackColorTo8888(1.0f, 0.0f, 1.0f);
+ particle++;
+ }
+
+ // bg stars
+ size = rsAllocationGetDimX(rsGetAllocation(bgStars));
+ particle = bgStars;
+ for(int i=0; i<size; i++){
+ float d = fabs(randomGauss()) * gGalaxyRadius * 0.5f + rsRand(64.0f);
+
+ d = mapf(-4.0f, gGalaxyRadius + 4.0f, 0.0f, scale, d);
+
+ float id = d / gGalaxyRadius;
+ float z = randomGauss() * 0.4f * (1.0f - id);
+
+ if (d > gGalaxyRadius * 0.15f) {
+ z *= 0.6f * (1.0f - id);
+ } else {
+ z *= 0.72f;
+ }
+
+ particle->position.x = rsRand(TWO_PI);
+ particle->position.y = d;
+ particle->position.z = z/5.0f;
+ particle->color = rsPackColorTo8888(1.0f, 0.0f, 1.0f);
+ particle++;
+ }
+
+
+}
+
+static void drawBg(int width, int height){
+ rsgBindTexture(fragBg, 0, textureBg);
+ rsgDrawRect(0.0f, 0.0f, width, height, 0.0f);
+}
+
+int root(){
+ float width = rsgGetWidth();
+ float height = rsgGetHeight();
+
+
+ rsgClearColor(0.0f, 0.f, 0.f, 0.5f);
+
+ // bg
+ rsgBindProgramVertex(vertBg);
+ rsgBindProgramFragment(fragBg);
+ drawBg(width, height);
+
+
+ // space cloud
+ rsgBindProgramVertex(vertSpaceClouds);
+ int size = rsAllocationGetDimX(rsGetAllocation(spaceClouds));
+ Particle_t *particle = spaceClouds;
+
+ for(int i=0; i<size; i++){
+ particle->position.x -= .065;
+ particle++;
+ }
+ rsgBindProgramFragment(fragSpaceClouds);
+ rsgBindTexture(fragSpaceClouds, 0, textureSpaceCloud);
+ rsgBindTexture(fragSpaceClouds, 1, textureFGStar);
+ rsgDrawMesh(spaceCloudsMesh);
+
+
+
+ // bg stars
+ rsgBindProgramVertex(vertBgStars);
+ size = rsAllocationGetDimX(rsGetAllocation(bgStars));
+ particle = bgStars;
+
+ for(int i=0; i<size; i++){
+ particle->position.x -= .007;
+ particle++;
+ }
+ rsgBindProgramFragment(fragBgStars);
+ rsgDrawMesh(bgStarsMesh);
+
+
+ return 40;
+}
+