summaryrefslogtreecommitdiff
path: root/java/Fountain
diff options
context:
space:
mode:
Diffstat (limited to 'java/Fountain')
-rw-r--r--java/Fountain/res/raw/fountain.c52
-rw-r--r--java/Fountain/res/raw/fountain.rs69
-rw-r--r--java/Fountain/res/raw/fountain2.rs73
-rw-r--r--java/Fountain/res/raw/fountain_bc.bcbin0 -> 2048 bytes
-rw-r--r--java/Fountain/src/com/android/fountain/FountainRS.java88
-rw-r--r--java/Fountain/src/com/android/fountain/ScriptC_Fountain.java49
-rw-r--r--java/Fountain/src/com/android/fountain/ScriptField_Point.java67
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
new file mode 100644
index 00000000..f1470687
--- /dev/null
+++ b/java/Fountain/res/raw/fountain_bc.bc
Binary files differ
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;
+
+
+}