diff options
Diffstat (limited to 'java/Fountain')
-rw-r--r-- | java/Fountain/res/raw/fountain.c | 52 | ||||
-rw-r--r-- | java/Fountain/res/raw/fountain.rs | 69 | ||||
-rw-r--r-- | java/Fountain/res/raw/fountain2.rs | 73 | ||||
-rw-r--r-- | java/Fountain/res/raw/fountain_bc.bc | bin | 0 -> 2048 bytes | |||
-rw-r--r-- | java/Fountain/src/com/android/fountain/FountainRS.java | 88 | ||||
-rw-r--r-- | java/Fountain/src/com/android/fountain/ScriptC_Fountain.java | 49 | ||||
-rw-r--r-- | java/Fountain/src/com/android/fountain/ScriptField_Point.java | 67 |
7 files changed, 216 insertions, 182 deletions
diff --git a/java/Fountain/res/raw/fountain.c b/java/Fountain/res/raw/fountain.c deleted file mode 100644 index 73b819b3..00000000 --- a/java/Fountain/res/raw/fountain.c +++ /dev/null @@ -1,52 +0,0 @@ -// Fountain test script -#pragma version(1) - -int newPart = 0; - -int main(int launchID) { - int ct; - int count = Control->count; - int rate = Control->rate; - float height = getHeight(); - struct point_s * p = (struct point_s *)point; - - if (rate) { - float rMax = ((float)rate) * 0.005f; - int x = Control->x; - int y = Control->y; - int color = ((int)(Control->r * 255.f)) | - ((int)(Control->g * 255.f)) << 8 | - ((int)(Control->b * 255.f)) << 16 | - (0xf0 << 24); - struct point_s * np = &p[newPart]; - - while (rate--) { - vec2Rand((float *)&np->delta.x, rMax); - np->position.x = x; - np->position.y = y; - np->color = color; - newPart++; - np++; - if (newPart >= count) { - newPart = 0; - np = &p[newPart]; - } - } - } - - for (ct=0; ct < count; ct++) { - float dy = p->delta.y + 0.15f; - float posy = p->position.y + dy; - if ((posy > height) && (dy > 0)) { - dy *= -0.3f; - } - p->delta.y = dy; - p->position.x += p->delta.x; - p->position.y = posy; - p++; - } - - uploadToBufferObject(NAMED_PartBuffer); - drawSimpleMesh(NAMED_PartMesh); - return 1; -} diff --git a/java/Fountain/res/raw/fountain.rs b/java/Fountain/res/raw/fountain.rs new file mode 100644 index 00000000..5562a776 --- /dev/null +++ b/java/Fountain/res/raw/fountain.rs @@ -0,0 +1,69 @@ +// Fountain test script +#pragma version(1) + +#include "../../../../scriptc/rs_types.rsh" +#include "../../../../scriptc/rs_math.rsh" +#include "../../../../scriptc/rs_graphics.rsh" + +static int newPart = 0; + +float4 partColor; +rs_mesh partMesh; +rs_allocation partBuffer; + +typedef struct __attribute__((packed, aligned(4))) Point_s { + float2 delta; + rs_position2 pos; + rs_color4u color; +} Point_t; +Point_t *point; + +#pragma rs export_var(point, partColor, partMesh, partBuffer) +//#pragma rs export_type(Point_s) +//#pragma rs export_element(point) + +int root() { + debugPf(1, partColor.x); + debugPi(4, partMesh); + debugPi(5, partBuffer); + + float height = getHeight(); + int size = allocGetDimX(partBuffer); + + Point_t * p = point; + for (int ct=0; ct < size; ct++) { + p->delta.y += 0.15f; + p->pos += p->delta; + if ((p->pos.y > height) && (p->delta.y > 0)) { + p->delta.y *= -0.3f; + } + p++; + } + + uploadToBufferObject(partBuffer); + drawSimpleMesh(partMesh); + return 1; +} + +void addParticles(int rate, int x, int y) +{ + float rMax = ((float)rate) * 0.005f; + int size = allocGetDimX(partBuffer); + + rs_color4u c = convertColorTo8888(partColor.x, partColor.y, partColor.z); + Point_t * np = &point[newPart]; + + float2 p = {x, y}; + while (rate--) { + np->delta = vec2Rand(rMax); + np->pos = p; + np->color = c; + newPart++; + np++; + if (newPart >= size) { + newPart = 0; + np = &point[newPart]; + } + } +} + diff --git a/java/Fountain/res/raw/fountain2.rs b/java/Fountain/res/raw/fountain2.rs deleted file mode 100644 index 5d36e35f..00000000 --- a/java/Fountain/res/raw/fountain2.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Fountain test script -#pragma version(1) - -#include "../../../../scriptc/rs_types.rsh" -#include "../../../../scriptc/rs_math.rsh" -#include "../../../../scriptc/rs_graphics.rsh" - -static int newPart = 0; - -typedef struct Control_s { - int x, y; - int rate; - int count; - float r, g, b; - rs_mesh partMesh; - rs_allocation partBuffer; -} Control_t; -Control_t *Control; - -typedef struct Point_s{ - float2 delta; - rs_position2 pos; - rs_color4u color; -} Point_t; -Point_t *point; - -int main(int launchID) { - int ct; - int count = Control->count; - int rate = Control->rate; - float height = getHeight(); - Point_t * p = point; - - if (rate) { - float rMax = ((float)rate) * 0.005f; - int color = ((int)(Control->r * 255.f)) | - ((int)(Control->g * 255.f)) << 8 | - ((int)(Control->b * 255.f)) << 16 | - (0xf0 << 24); - Point_t * np = &p[newPart]; - - while (rate--) { - np->delta.x = rand(rMax); - np->delta.y = rand(rMax); - //np->delta = vec2Rand(rMax); - np->pos.x = Control->x; - np->pos.y = Control->y; - np->color = color; - newPart++; - np++; - if (newPart >= count) { - newPart = 0; - np = &p[newPart]; - } - } - } - - for (ct=0; ct < count; ct++) { - float dy = p->delta.y + 0.15f; - float posy = p->pos.y + dy; - if ((posy > height) && (dy > 0)) { - dy *= -0.3f; - } - p->delta.y = dy; - p->pos.x += p->delta.x; - p->pos.y = posy; - p++; - } - - uploadToBufferObject(Control->partBuffer); - drawSimpleMesh(Control->partMesh); - return 1; -} diff --git a/java/Fountain/res/raw/fountain_bc.bc b/java/Fountain/res/raw/fountain_bc.bc Binary files differnew file mode 100644 index 00000000..f1470687 --- /dev/null +++ b/java/Fountain/res/raw/fountain_bc.bc diff --git a/java/Fountain/src/com/android/fountain/FountainRS.java b/java/Fountain/src/com/android/fountain/FountainRS.java index 93565796..d193134c 100644 --- a/java/Fountain/src/com/android/fountain/FountainRS.java +++ b/java/Fountain/src/com/android/fountain/FountainRS.java @@ -24,16 +24,6 @@ import android.util.Log; public class FountainRS { public static final int PART_COUNT = 20000; - static class SomeData { - public int x; - public int y; - public int rate; - public int count; - public float r; - public float g; - public float b; - } - public FountainRS() { } @@ -43,21 +33,28 @@ public class FountainRS { initRS(); } + Float4 tmpColor = new Float4(); + boolean holdingColor = false; public void newTouchPosition(int x, int y, int rate) { - if (mSD.rate == 0) { - mSD.r = ((x & 0x1) != 0) ? 0.f : 1.f; - mSD.g = ((x & 0x2) != 0) ? 0.f : 1.f; - mSD.b = ((x & 0x4) != 0) ? 0.f : 1.f; - if ((mSD.r + mSD.g + mSD.b) < 0.9f) { - mSD.r = 0.8f; - mSD.g = 0.5f; - mSD.b = 1.f; + if (rate > 0) { + if (true/*!holdingColor*/) { + tmpColor.x = ((x & 0x1) != 0) ? 0.f : 1.f; + tmpColor.y = ((x & 0x2) != 0) ? 0.f : 1.f; + tmpColor.z = ((x & 0x4) != 0) ? 0.f : 1.f; + if ((tmpColor.x + tmpColor.y + tmpColor.z) < 0.9f) { + tmpColor.x = 0.8f; + tmpColor.y = 0.5f; + tmpColor.z = 1.0f; + } + android.util.Log.e("rs", "set color " + tmpColor.x + ", " + tmpColor.y + ", " + tmpColor.z); + mScript.set_partColor(tmpColor); } + mScript.invokable_addParticles(rate, x, y); + holdingColor = true; + } else { + holdingColor = false; } - mSD.rate = rate; - mSD.x = x; - mSD.y = y; - mIntAlloc.data(mSD); + } @@ -65,49 +62,26 @@ public class FountainRS { private Resources mRes; + private ScriptField_Point mPoints; + private ScriptC_Fountain mScript; private RenderScriptGL mRS; - private Allocation mIntAlloc; private SimpleMesh mSM; - private SomeData mSD; - private Type mSDType; private void initRS() { - mSD = new SomeData(); - mSDType = Type.createFromClass(mRS, SomeData.class, 1, "SomeData"); - mIntAlloc = Allocation.createTyped(mRS, mSDType); - mSD.count = PART_COUNT; - mIntAlloc.data(mSD); - - Element.Builder eb = new Element.Builder(mRS); - eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "delta"); - eb.add(Element.createAttrib(mRS, Element.DataType.FLOAT_32, Element.DataKind.POSITION, 2), "position"); - eb.add(Element.createAttrib(mRS, Element.DataType.UNSIGNED_8, Element.DataKind.COLOR, 4), "color"); - Element primElement = eb.create(); - + mPoints = new ScriptField_Point(mRS, PART_COUNT); SimpleMesh.Builder smb = new SimpleMesh.Builder(mRS); - int vtxSlot = smb.addVertexType(primElement, PART_COUNT); + int vtxSlot = smb.addVertexType(mPoints.getType()); smb.setPrimitive(Primitive.POINT); mSM = smb.create(); - mSM.setName("PartMesh"); - - Allocation partAlloc = mSM.createVertexAllocation(vtxSlot); - partAlloc.setName("PartBuffer"); - mSM.bindVertexAllocation(partAlloc, 0); - - // All setup of named objects should be done by this point - // because we are about to compile the script. - ScriptC.Builder sb = new ScriptC.Builder(mRS); - sb.setScript(mRes, R.raw.fountain); - sb.setRoot(true); - sb.setType(mSDType, "Control", 0); - sb.setType(mSM.getVertexType(0), "point", 1); - Script script = sb.create(); - script.setClearColor(0.0f, 0.0f, 0.0f, 1.0f); - - script.bindAllocation(mIntAlloc, 0); - script.bindAllocation(partAlloc, 1); - mRS.contextBindRootScript(script); + mSM.bindVertexAllocation(mPoints.getAllocation(), vtxSlot); + + mScript = new ScriptC_Fountain(mRS, mRes, true); + mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f); + mScript.set_partMesh(mSM); + mScript.set_partBuffer(mPoints.getAllocation()); + mScript.bind_point(mPoints); + mRS.contextBindRootScript(mScript); } } diff --git a/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java b/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java new file mode 100644 index 00000000..7cff390c --- /dev/null +++ b/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java @@ -0,0 +1,49 @@ + +package com.android.fountain; + +import android.content.res.Resources; +import android.renderscript.*; +import android.util.Log; + +public class ScriptC_Fountain + extends android.renderscript.ScriptC +{ + public ScriptC_Fountain(RenderScript rs, Resources resources, boolean isRoot) { + super(rs, resources, R.raw.fountain_bc, isRoot); + } + + public void set_partColor(Float4 v) { + FieldPacker fp = new FieldPacker(16); + fp.addF32(v); + setVar(0, fp); + } + public void set_partMesh(SimpleMesh v) { + setVar(1, v.getID()); + } + public void set_partBuffer(Allocation v) { + setVar(2, v.getID()); + } + + private ScriptField_Point mField_point; + public void bind_point(ScriptField_Point f) { + mField_point = f; + if (f == null) { + bindAllocation(null, 3); + } else { + bindAllocation(f.getAllocation(), 3); + } + } + public ScriptField_Point get_point() { + return mField_point; + } + + + public void invokable_addParticles(int count, int x, int y) { + FieldPacker fp = new FieldPacker(12); + fp.addI32(count); + fp.addI32(x); + fp.addI32(y); + invokeV(0, fp); + } +} + diff --git a/java/Fountain/src/com/android/fountain/ScriptField_Point.java b/java/Fountain/src/com/android/fountain/ScriptField_Point.java new file mode 100644 index 00000000..edd18d58 --- /dev/null +++ b/java/Fountain/src/com/android/fountain/ScriptField_Point.java @@ -0,0 +1,67 @@ + +package com.android.fountain; + +import android.content.res.Resources; +import android.renderscript.*; +import android.util.Log; + +public class ScriptField_Point + extends android.renderscript.Script.FieldBase +{ + + static public class Item { + Item() { + delta = new Float2(); + pos = new Float2(); + color = new Short4(); + } + + public static final int sizeof = (5*4); + Float2 delta; + Float2 pos; + Short4 color; + } + private Item mItemArray[]; + + + public ScriptField_Point(RenderScript rs, int count) { + // Allocate a pack/unpack buffer + mIOBuffer = new FieldPacker(Item.sizeof * count); + mItemArray = new Item[count]; + + Element.Builder eb = new Element.Builder(rs); + eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 2), "delta"); + eb.add(Element.createAttrib(rs, Element.DataType.FLOAT_32, Element.DataKind.POSITION, 2), "pos"); + eb.add(Element.createAttrib(rs, Element.DataType.UNSIGNED_8, Element.DataKind.COLOR, 4), "color"); + mElement = eb.create(); + + init(rs, count); + } + + private void copyToArray(Item i, int index) { + mIOBuffer.reset(index * Item.sizeof); + mIOBuffer.addF32(i.delta); + mIOBuffer.addF32(i.pos); + mIOBuffer.addU8(i.color); + } + + public void set(Item i, int index, boolean copyNow) { + mItemArray[index] = i; + if (copyNow) { + copyToArray(i, index); + mAllocation.subData1D(index * Item.sizeof, Item.sizeof, mIOBuffer.getData()); + } + } + + public void copyAll() { + for (int ct=0; ct < mItemArray.length; ct++) { + copyToArray(mItemArray[ct], ct); + } + mAllocation.data(mIOBuffer.getData()); + } + + + private FieldPacker mIOBuffer; + + +} |