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