diff options
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/java/Fountain/res/raw/fountain.c | 96 | ||||
-rw-r--r-- | libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java | 66 | ||||
-rw-r--r-- | libs/rs/java/Fountain/src/com/android/fountain/FountainView.java | 13 | ||||
-rw-r--r-- | libs/rs/rs.spec | 1 | ||||
-rw-r--r-- | libs/rs/rsScript.cpp | 3 | ||||
-rw-r--r-- | libs/rs/rsScript.h | 1 | ||||
-rw-r--r-- | libs/rs/rsScriptC.cpp | 2 | ||||
-rw-r--r-- | libs/rs/rsScriptC.h | 1 | ||||
-rw-r--r-- | libs/rs/rsScriptC_Lib.cpp | 36 |
9 files changed, 108 insertions, 111 deletions
diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c index 6e6afcd..e7804a5 100644 --- a/libs/rs/java/Fountain/res/raw/fountain.c +++ b/libs/rs/java/Fountain/res/raw/fountain.c @@ -1,86 +1,52 @@ // Fountain test script - #pragma version(1) #pragma stateVertex(default) -#pragma stateFragment(PgmFragParts) -#pragma stateFragmentStore(PFSBlend) - +#pragma stateFragment(default) +#pragma stateFragmentStore(default) int main(int launchID) { int ct; - int count = loadI32(0, OFFSETOF_SomeData_count); - int touch = loadI32(0, OFFSETOF_SomeData_touch); - int rate = 4; - int maxLife = (count / rate) - 1; + int count = Control_count - 1; + int rate = Control_rate; + float *dataF = loadArrayF(1, 0); + float height = getHeight(); - if (touch) { - int x = loadI32(0, OFFSETOF_SomeData_x); - int y = loadI32(0, OFFSETOF_SomeData_y); - int newPart = loadI32(2, 0); - for (ct=0; ct<rate; ct++) { - int idx = newPart * 5 + 1; - storeF(2, idx, randf(1.f) - 0.5f); - storeF(2, idx + 1, randf(1.f) - 0.5f); - storeI32(2, idx + 2, maxLife); - storeF(2, idx + 3, x); - storeF(2, idx + 4, y); + if (rate) { + debugI32("rate", rate); + int *dataI = loadArrayI32(1, 0); + float rMax = ((float)rate) * 0.005f; + int x = Control_x; + int y = Control_y; + int newPart = loadI32(1, count * 5); + int c = colorFloatRGBAtoUNorm8(Control_r, Control_g, Control_b, 0.99f); + + while (rate--) { + int idx = newPart * 5; + vec2Rand(dataF + idx, rMax); + dataF[idx + 2] = x; + dataF[idx + 3] = y; + dataI[idx + 4] = c; newPart++; if (newPart >= count) { newPart = 0; } } - storeI32(2, 0, newPart); + storeI32(1, count * 5, newPart); } - int drawCount = 0; - float height = getHeight(); for (ct=0; ct < count; ct++) { - int srcIdx = ct * 5 + 1; - - int life = loadI32(2, srcIdx + 2); - - if (life) { - float posx = loadF(2, srcIdx + 3); - float posy = loadF(2, srcIdx + 4); - float dx = loadF(2, srcIdx); - float dy = loadF(2, srcIdx + 1); - if (posy < height) { - int dstIdx = drawCount * 9; - int c = 0xcfcfcfcf; - - storeI32(1, dstIdx, c); - storeF(1, dstIdx + 1, posx); - storeF(1, dstIdx + 2, posy); - - storeI32(1, dstIdx + 3, c); - storeF(1, dstIdx + 4, posx + 1.f); - storeF(1, dstIdx + 5, posy + dy); - - storeI32(1, dstIdx + 6, c); - storeF(1, dstIdx + 7, posx - 1.f); - storeF(1, dstIdx + 8, posy + dy); - drawCount ++; - } else { - if (dy > 0) { - dy *= -0.5f; - } - } - - posx = posx + dx; - posy = posy + dy; - dy = dy + 0.05f; - life --; - - //storeI32(2, srcIdx, dx); - storeF(2, srcIdx + 1, dy); - storeI32(2, srcIdx + 2, life); - storeF(2, srcIdx + 3, posx); - storeF(2, srcIdx + 4, posy); + float dy = dataF[1] + 0.15f; + float posy = dataF[3] + dy; + if ((posy > height) && (dy > 0)) { + dy *= -0.3f; } + dataF[1] = dy; + dataF[2] += dataF[0]; + dataF[3] = posy; + dataF += 5; } - //drawTriangleArray(NAMED_PartBuffer, drawCount); uploadToBufferObject(NAMED_PartBuffer); - drawSimpleMeshRange(NAMED_PartMesh, 0, drawCount * 3); + drawSimpleMeshRange(NAMED_PartMesh, 0, count); return 1; } diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java index da4eeb4..da9eda8 100644 --- a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java +++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java @@ -16,26 +16,22 @@ package com.android.fountain; -import java.io.Writer; - -import android.content.Context; import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.renderscript.*; import android.util.Log; public class FountainRS { - public static final int PART_COUNT = 4000; + public static final int PART_COUNT = 20000; static class SomeData { public int x; public int y; - public int touch; public int rate; public int count; + public float r; + public float g; + public float b; } public FountainRS() { @@ -47,8 +43,18 @@ public class FountainRS { initRS(); } - public void newTouchPosition(int x, int y) { - mSD.touch = 1; + 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; + } + } + mSD.rate = rate; mSD.x = x; mSD.y = y; mIntAlloc.data(mSD); @@ -62,50 +68,29 @@ public class FountainRS { private RenderScript mRS; private Allocation mIntAlloc; private Allocation mPartAlloc; - private Allocation mVertAlloc; private Script mScript; - private ProgramStore mPFS; - private ProgramFragment mPF; private SimpleMesh mSM; - - private Bitmap mBackground; - - SomeData mSD = new SomeData(); + 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); - mVertAlloc = Allocation.createSized(mRS, Element.USER_I32, PART_COUNT * 5 + 1); - - ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null); - bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA, ProgramStore.BlendDstFunc.ONE); - bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); - bs.setDepthMask(false); - bs.setDitherEnable(false); - mPFS = bs.create(); - mPFS.setName("PFSBlend"); - - ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS, null, null); - mPF = bf.create(); - mPF.setName("PgmFragParts"); - mSD.count = PART_COUNT; mIntAlloc.data(mSD); Element.Builder eb = new Element.Builder(mRS); - eb.add(Element.DataType.UNSIGNED, Element.DataKind.RED, true, 8); - eb.add(Element.DataType.UNSIGNED, Element.DataKind.GREEN, true, 8); - eb.add(Element.DataType.UNSIGNED, Element.DataKind.BLUE, true, 8); - eb.add(Element.DataType.UNSIGNED, Element.DataKind.ALPHA, true, 8); - eb.add(Element.DataType.FLOAT, Element.DataKind.X, false, 32); - eb.add(Element.DataType.FLOAT, Element.DataKind.Y, false, 32); + eb.addFloat(Element.DataKind.USER); //dx + eb.addFloat(Element.DataKind.USER); //dy + eb.addFloatXY(); + eb.addUNorm8RGBA(); Element primElement = eb.create(); + SimpleMesh.Builder smb = new SimpleMesh.Builder(mRS); - int vtxSlot = smb.addVertexType(primElement, PART_COUNT * 3); - smb.setPrimitive(Primitive.TRIANGLE); + int vtxSlot = smb.addVertexType(primElement, PART_COUNT); + smb.setPrimitive(Primitive.POINT); mSM = smb.create(); mSM.setName("PartMesh"); @@ -118,13 +103,12 @@ public class FountainRS { ScriptC.Builder sb = new ScriptC.Builder(mRS); sb.setScript(mRes, R.raw.fountain); sb.setRoot(true); - sb.setType(mSDType, 0); + sb.setType(mSDType, "Control", 0); mScript = sb.create(); mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f); mScript.bindAllocation(mIntAlloc, 0); mScript.bindAllocation(mPartAlloc, 1); - mScript.bindAllocation(mVertAlloc, 2); mRS.contextBindRootScript(mScript); } diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java index be8b24e..2768e2c 100644 --- a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java +++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java @@ -61,13 +61,18 @@ public class FountainView extends RSSurfaceView { @Override public boolean onTouchEvent(MotionEvent ev) { - boolean ret = true; int act = ev.getAction(); if (act == ev.ACTION_UP) { - ret = false; + mRender.newTouchPosition(0, 0, 0); + return false; } - mRender.newTouchPosition((int)ev.getX(), (int)ev.getY()); - return ret; + float rate = (ev.getPressure() * 50.f); + rate *= rate; + if(rate > 2000.f) { + rate = 2000.f; + } + mRender.newTouchPosition((int)ev.getX(), (int)ev.getY(), (int)rate); + return true; } } diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index 105142b..0df237f 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -315,6 +315,7 @@ ScriptSetClearStencil { ScriptSetType { param RsType type param uint32_t slot + param bool isWritable param const char * name } diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp index 75c994b..6bcb8f2 100644 --- a/libs/rs/rsScript.cpp +++ b/libs/rs/rsScript.cpp @@ -76,11 +76,12 @@ void rsi_ScriptSetClearStencil(Context * rsc, RsScript vs, uint32_t v) s->mEnviroment.mClearStencil = v; } -void rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, const char *name) +void rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, bool writable, const char *name) { ScriptCState *ss = &rsc->mScriptC; const Type *t = static_cast<const Type *>(vt); ss->mConstantBufferTypes[slot].set(t); + ss->mSlotWritable[slot] = writable; if (name) { ss->mSlotNames[slot].setTo(name); } else { diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h index dc66763..60f83a6 100644 --- a/libs/rs/rsScript.h +++ b/libs/rs/rsScript.h @@ -61,6 +61,7 @@ public: ObjectBaseRef<Allocation> mSlots[MAX_SCRIPT_BANKS]; ObjectBaseRef<const Type> mTypes[MAX_SCRIPT_BANKS]; String8 mSlotNames[MAX_SCRIPT_BANKS]; + bool mSlotWritable[MAX_SCRIPT_BANKS]; virtual bool run(Context *, uint32_t launchID) = 0; }; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index ced2516..db4fd09 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -93,6 +93,7 @@ void ScriptCState::clear() for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) { mConstantBufferTypes[ct].clear(); mSlotNames[ct].setTo(""); + mSlotWritable[ct] = false; } memset(&mEnviroment, 0, sizeof(mEnviroment)); @@ -341,6 +342,7 @@ RsScript rsi_ScriptCCreate(Context * rsc) for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get()); s->mSlotNames[ct] = ss->mSlotNames[ct]; + s->mSlotWritable[ct] = ss->mSlotWritable[ct]; } ss->clear(); diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 32a9079..302515e 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -70,6 +70,7 @@ public: ObjectBaseRef<const Type> mConstantBufferTypes[MAX_SCRIPT_BANKS]; String8 mSlotNames[MAX_SCRIPT_BANKS]; + bool mSlotWritable[MAX_SCRIPT_BANKS]; void clear(); void runCompiler(Context *rsc); diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp index c13894b..0ecdf9a 100644 --- a/libs/rs/rsScriptC_Lib.cpp +++ b/libs/rs/rsScriptC_Lib.cpp @@ -465,6 +465,14 @@ static void SC_matrixTranslate(rsc_Matrix *mat, float x, float y, float z) } +static void SC_vec2Rand(float *vec, float maxLen) +{ + float angle = SC_randf(PI * 2); + float len = SC_randf(maxLen); + vec[0] = len * sinf(angle); + vec[1] = len * cosf(angle); +} + ////////////////////////////////////////////////////////////////////////////// @@ -780,6 +788,24 @@ static uint32_t SC_getHeight() return rsc->getHeight(); } +static uint32_t SC_colorFloatRGBAtoUNorm8(float r, float g, float b, float a) +{ + uint32_t c = 0; + c |= (uint32_t)(r * 255.f + 0.5f); + c |= ((uint32_t)(g * 255.f + 0.5f)) << 8; + c |= ((uint32_t)(b * 255.f + 0.5f)) << 16; + c |= ((uint32_t)(a * 255.f + 0.5f)) << 24; + return c; +} + +static uint32_t SC_colorFloatRGBAto565(float r, float g, float b) +{ + uint32_t ir = (uint32_t)(r * 255.f + 0.5f); + uint32_t ig = (uint32_t)(g * 255.f + 0.5f); + uint32_t ib = (uint32_t)(b * 255.f + 0.5f); + return rs888to565(ir, ig, ib); +} + ////////////////////////////////////////////////////////////////////////////// // Class implementation ////////////////////////////////////////////////////////////////////////////// @@ -937,6 +963,10 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = { { "matrixTranslate", (void *)&SC_matrixTranslate, "void", "(float *mat, float x, float y, float z)" }, + // vector + { "vec2Rand", (void *)&SC_vec2Rand, + "void", "(float *vec, float maxLen)" }, + // context { "bindProgramFragment", (void *)&SC_bindProgramFragment, "void", "(int)" }, @@ -999,6 +1029,12 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = { { "uploadToBufferObject", (void *)&SC_uploadToBufferObject, "void", "(int)" }, + { "colorFloatRGBAtoUNorm8", (void *)&SC_colorFloatRGBAtoUNorm8, + "int", "(float, float, float, float)" }, + { "colorFloatRGBto565", (void *)&SC_colorFloatRGBAto565, + "int", "(float, float, float)" }, + + { "getWidth", (void *)&SC_getWidth, "int", "()" }, { "getHeight", (void *)&SC_getHeight, |