1e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams// Fountain test script
2e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams#pragma version(1)
3e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams#pragma rs_fp_relaxed
4e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
5e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams#pragma rs java_package_name(com.example.android.rs.fountain)
6e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
7e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams#pragma stateFragment(parent)
8e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
9e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams#include "rs_graphics.rsh"
10e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
11e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsstatic int newPart = 0;
12e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsrs_mesh partMesh;
13e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
14e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samstypedef struct __attribute__((packed, aligned(4))) Point {
15e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    float2 delta;
16e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    float2 position;
17e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    uchar4 color;
18e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams} Point_t;
19e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason SamsPoint_t *point;
20e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
21e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsint root() {
22e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    float dt = min(rsGetDt(), 0.1f);
23e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    rsgClearColor(0.f, 0.f, 0.f, 1.f);
24e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    const float height = rsgGetHeight();
25e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    const int size = rsAllocationGetDimX(rsGetAllocation(point));
26e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    float dy2 = dt * (10.f);
27e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Point_t * p = point;
28e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    for (int ct=0; ct < size; ct++) {
29e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        p->delta.y += dy2;
30e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        p->position += p->delta;
31e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        if ((p->position.y > height) && (p->delta.y > 0)) {
32e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            p->delta.y *= -0.3f;
33e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        }
34e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        p++;
35e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
36e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
37e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    rsgDrawMesh(partMesh);
38e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    return 1;
39e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams}
40e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
41e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsstatic float4 partColor[10];
42e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsvoid addParticles(int rate, float x, float y, int index, bool newColor)
43e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams{
44e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    if (newColor) {
45e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        partColor[index].x = rsRand(0.5f, 1.0f);
46e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        partColor[index].y = rsRand(1.0f);
47e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        partColor[index].z = rsRand(1.0f);
48e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
49e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    float rMax = ((float)rate) * 0.02f;
50e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    int size = rsAllocationGetDimX(rsGetAllocation(point));
51e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    uchar4 c = rsPackColorTo8888(partColor[index]);
52e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
53e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Point_t * np = &point[newPart];
54e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    float2 p = {x, y};
55e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    while (rate--) {
56e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        float angle = rsRand(3.14f * 2.f);
57e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        float len = rsRand(rMax);
58e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        np->delta.x = len * sin(angle);
59e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        np->delta.y = len * cos(angle);
60e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        np->position = p;
61e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        np->color = c;
62e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        newPart++;
63e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        np++;
64e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        if (newPart >= size) {
65e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            newPart = 0;
66e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            np = &point[newPart];
67e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        }
68e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
69e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams}
70e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
71