Home | History | Annotate | Download | only in fountainfbo
      1 // Fountain test script
      2 #pragma version(1)
      3 
      4 #pragma rs java_package_name(com.example.android.rs.fountainfbo)
      5 
      6 #pragma stateFragment(parent)
      7 
      8 #include "rs_graphics.rsh"
      9 
     10 static int newPart = 0;
     11 rs_mesh partMesh;
     12 rs_program_vertex gProgramVertex;
     13 
     14 //allocation for color buffer
     15 rs_allocation gColorBuffer;
     16 //fragment shader for rendering without a texture (used for rendering to framebuffer object)
     17 rs_program_fragment gProgramFragment;
     18 //fragment shader for rendering with a texture (used for rendering to default framebuffer)
     19 rs_program_fragment gTextureProgramFragment;
     20 
     21 typedef struct __attribute__((packed, aligned(4))) Point {
     22     float2 delta;
     23     float2 position;
     24     uchar4 color;
     25 } Point_t;
     26 Point_t *point;
     27 
     28 int root() {
     29     float dt = min(rsGetDt(), 0.1f);
     30     rsgClearColor(0.f, 0.f, 0.f, 1.f);
     31     const float height = rsgGetHeight();
     32     const int size = rsAllocationGetDimX(rsGetAllocation(point));
     33     float dy2 = dt * (10.f);
     34     Point_t * p = point;
     35     for (int ct=0; ct < size; ct++) {
     36         p->delta.y += dy2;
     37         p->position += p->delta;
     38         if ((p->position.y > height) && (p->delta.y > 0)) {
     39             p->delta.y *= -0.3f;
     40         }
     41         p++;
     42     }
     43     //Tell Renderscript runtime to render to the frame buffer object
     44     rsgBindColorTarget(gColorBuffer, 0);
     45 
     46     //Begin rendering on a white background
     47     rsgClearColor(1.f, 1.f, 1.f, 1.f);
     48     rsgDrawMesh(partMesh);
     49 
     50     //When done, tell Renderscript runtime to stop rendering to framebuffer object
     51     rsgClearAllRenderTargets();
     52 
     53     //Bind a new fragment shader that declares the framebuffer object to be used as a texture
     54     rsgBindProgramFragment(gTextureProgramFragment);
     55 
     56     //Bind the framebuffer object to the fragment shader at slot 0 as a texture
     57     rsgBindTexture(gTextureProgramFragment, 0, gColorBuffer);
     58 
     59     //Draw a quad using the framebuffer object as the texture
     60     float startX = 10, startY = 10;
     61     float s = 256;
     62     rsgDrawQuadTexCoords(startX, startY, 0, 0, 1,
     63                          startX, startY + s, 0, 0, 0,
     64                          startX + s, startY + s, 0, 1, 0,
     65                          startX + s, startY, 0, 1, 1);
     66 
     67     //Rebind the original fragment shader to render as normal
     68     rsgBindProgramFragment(gProgramFragment);
     69 
     70     //Render the main scene
     71     rsgDrawMesh(partMesh);
     72 
     73     return 1;
     74 }
     75 
     76 static float4 partColor[10];
     77 void addParticles(int rate, float x, float y, int index, bool newColor)
     78 {
     79     if (newColor) {
     80         partColor[index].x = rsRand(0.5f, 1.0f);
     81         partColor[index].y = rsRand(1.0f);
     82         partColor[index].z = rsRand(1.0f);
     83     }
     84     float rMax = ((float)rate) * 0.02f;
     85     int size = rsAllocationGetDimX(rsGetAllocation(point));
     86     uchar4 c = rsPackColorTo8888(partColor[index]);
     87 
     88     Point_t * np = &point[newPart];
     89     float2 p = {x, y};
     90     while (rate--) {
     91         float angle = rsRand(3.14f * 2.f);
     92         float len = rsRand(rMax);
     93         np->delta.x = len * sin(angle);
     94         np->delta.y = len * cos(angle);
     95         np->position = p;
     96         np->color = c;
     97         newPart++;
     98         np++;
     99         if (newPart >= size) {
    100             newPart = 0;
    101             np = &point[newPart];
    102         }
    103     }
    104 }
    105 
    106 
    107