From 3a1ea9334f386f7b582d17ef1be8b3ab7f605353 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 3 Aug 2009 17:29:05 -0700 Subject: [PATCH] Add anti-aliasing to Grass RS. --- libs/rs/java/Grass/res/drawable-hdpi/aa.png | Bin 0 -> 2803 bytes libs/rs/java/Grass/res/raw/grass.c | 42 ++++++----- .../src/com/android/grass/rs/GrassRS.java | 67 +++++++++++++----- 3 files changed, 76 insertions(+), 33 deletions(-) create mode 100644 libs/rs/java/Grass/res/drawable-hdpi/aa.png diff --git a/libs/rs/java/Grass/res/drawable-hdpi/aa.png b/libs/rs/java/Grass/res/drawable-hdpi/aa.png new file mode 100644 index 0000000000000000000000000000000000000000..34cd8914f476917e1a9697442d2ee8384636c714 GIT binary patch literal 2803 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 0; i--) { - float nextX = currentX - cosf(angle) * size * lengthX; - float nextY = currentY - sinf(angle) * size * lengthY; + float nextX = currentX - cosf(angle) * size * lx; + float nextY = currentY - sinf(angle) * size * ly; angle += degree * hardness; - drawQuad(nextX + (i - 1) * scale, nextY, 0.0f, - nextX - (i - 1) * scale, nextY, 0.0f, - currentX - i * scale, currentY + 0.7f, 0.0f, - currentX + i * scale, currentY + 0.7f, 0.0f); + drawQuad(nextX + (i - 1) * ss, nextY, 0.0f, + nextX - (i - 1) * ss, nextY, 0.0f, + currentX - i * ss, currentY + sh, 0.0f, + currentX + i * ss, currentY + sh, 0.0f); currentX = nextX; currentY = nextY; @@ -149,7 +156,10 @@ void drawBlade(int index, float now) { } void drawBlades(float now) { - bindTexture(NAMED_PFBackground, 0, 0); + // For anti-aliasing + bindProgramFragmentStore(NAMED_PFSGrass); + bindProgramFragment(NAMED_PFGrass); + bindTexture(NAMED_PFGrass, 0, loadI32(RSID_TEXTURES, RSID_GRASS_TEXTURE)); int bladesCount = loadI32(RSID_STATE, RSID_BLADES_COUNT); int count = bladesCount * BLADE_STRUCT_FIELDS_COUNT; @@ -188,7 +198,7 @@ int main(int launchID) { alpha(1.0f - normf(DUSK, 1.0f, now)); drawSunset(); } - + drawBlades(now); frameCount++; diff --git a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java index 435b5ce6797f2..cf7affc85fc68 100644 --- a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java +++ b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java @@ -24,12 +24,13 @@ import static android.renderscript.RenderScript.DepthFunc.*; import static android.renderscript.RenderScript.BlendSrcFunc; import static android.renderscript.RenderScript.BlendDstFunc; import android.renderscript.RenderScript; -import android.renderscript.Element; import android.renderscript.Allocation; import android.renderscript.ProgramVertexAlloc; import static android.renderscript.Element.*; import static android.util.MathUtils.*; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import java.util.TimeZone; @@ -39,7 +40,7 @@ class GrassRS { private static final int RSID_STATE_BLADES_COUNT = 1; private static final int RSID_SKY_TEXTURES = 1; - private static final int SKY_TEXTURES_COUNT = 4; + private static final int SKY_TEXTURES_COUNT = 5; private static final int RSID_BLADES = 2; private static final int BLADES_COUNT = 100; @@ -59,6 +60,7 @@ class GrassRS { private Resources mResources; private RenderScript mRS; + private final BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options(); private final int mWidth; private final int mHeight; @@ -77,19 +79,25 @@ class GrassRS { private ProgramVertexAlloc mPvOrthoAlloc; @SuppressWarnings({"FieldCanBeLocal"}) - private Allocation mSkyTexturesIDs; + private Allocation mTexturesIDs; @SuppressWarnings({"FieldCanBeLocal"}) - private Allocation[] mSkyTextures; + private Allocation[] mTextures; @SuppressWarnings({"FieldCanBeLocal"}) - private int[] mSkyBufferIDs; + private int[] mTextureBufferIDs; @SuppressWarnings({"FieldCanBeLocal"}) private Allocation mState; @SuppressWarnings({"FieldCanBeLocal"}) private Allocation mBlades; + @SuppressWarnings({"FieldCanBeLocal"}) + private RenderScript.ProgramFragment mPfGrass; + @SuppressWarnings({"FieldCanBeLocal"}) + private RenderScript.ProgramFragmentStore mPfsGrass; public GrassRS(int width, int height) { mWidth = width; mHeight = height; + mBitmapOptions.inScaled = false; + mBitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; } public void init(RenderScript rs, Resources res) { @@ -114,7 +122,7 @@ class GrassRS { loadSkyTextures(); mScript.bindAllocation(mState, RSID_STATE); - mScript.bindAllocation(mSkyTexturesIDs, RSID_SKY_TEXTURES); + mScript.bindAllocation(mTexturesIDs, RSID_SKY_TEXTURES); mScript.bindAllocation(mBlades, RSID_BLADES); mRS.contextBindRootScript(mScript); @@ -146,23 +154,24 @@ class GrassRS { blades[index + BLADE_STRUCT_LENGTHX] = random(4.5f) + 3.0f; blades[index + BLADE_STRUCT_LENGTHY] = random(5.5f) + 2.0f; blades[index + BLADE_STRUCT_HARDNESS] = random(1.0f) + 0.2f; - blades[index + BLADE_STRUCT_H] = (51.0f + random(5.0f)) / 255.0f; - blades[index + BLADE_STRUCT_S] = (200.0f + random(55.0f)) / 255.0f; - blades[index + BLADE_STRUCT_B] = (90.0f + random(165.0f)) / 255.0f; + blades[index + BLADE_STRUCT_H] = random(0.02f) + 0.2f; + blades[index + BLADE_STRUCT_S] = random(0.22f) + 0.78f; + blades[index + BLADE_STRUCT_B] = random(0.65f) + 0.35f; } private void loadSkyTextures() { - mSkyBufferIDs = new int[SKY_TEXTURES_COUNT]; - mSkyTextures = new Allocation[SKY_TEXTURES_COUNT]; - mSkyTexturesIDs = Allocation.createSized(mRS, USER_FLOAT, SKY_TEXTURES_COUNT); + mTextureBufferIDs = new int[SKY_TEXTURES_COUNT]; + mTextures = new Allocation[SKY_TEXTURES_COUNT]; + mTexturesIDs = Allocation.createSized(mRS, USER_FLOAT, SKY_TEXTURES_COUNT); - final Allocation[] textures = mSkyTextures; + final Allocation[] textures = mTextures; textures[0] = loadTexture(R.drawable.night, "night"); textures[1] = loadTexture(R.drawable.sunrise, "sunrise"); textures[2] = loadTexture(R.drawable.sky, "sky"); textures[3] = loadTexture(R.drawable.sunset, "sunset"); + textures[4] = loadTextureARGB(R.drawable.aa, "aa"); - final int[] bufferIds = mSkyBufferIDs; + final int[] bufferIds = mTextureBufferIDs; final int count = textures.length; for (int i = 0; i < count; i++) { @@ -171,12 +180,21 @@ class GrassRS { bufferIds[i] = texture.getID(); } - mSkyTexturesIDs.data(bufferIds); + mTexturesIDs.data(bufferIds); } private Allocation loadTexture(int id, String name) { - Allocation allocation = Allocation.createFromBitmapResource(mRS, mResources, id, - Element.RGB_565, false); + final Allocation allocation = Allocation.createFromBitmapResource(mRS, mResources, + id, RGB_565, false); + allocation.setName(name); + return allocation; + } + + private Allocation loadTextureARGB(int id, String name) { + // Forces ARGB 32 bits, because pngcrush sometimes optimize our PNGs to + // indexed pictures, which are not well supported + final Bitmap b = BitmapFactory.decodeResource(mResources, id, mBitmapOptions); + final Allocation allocation = Allocation.createFromBitmap(mRS, b, RGBA_8888, false); allocation.setName(name); return allocation; } @@ -195,6 +213,13 @@ class GrassRS { mPfBackground = mRS.programFragmentCreate(); mPfBackground.setName("PFBackground"); mPfBackground.bindSampler(mSampler, 0); + + mRS.programFragmentBegin(null, null); + mRS.programFragmentSetTexEnable(0, true); + mRS.programFragmentSetTexEnvMode(0, MODULATE); + mPfGrass = mRS.programFragmentCreate(); + mPfGrass.setName("PFGrass"); + mPfGrass.bindSampler(mSampler, 0); } private void createProgramFragmentStore() { @@ -205,6 +230,14 @@ class GrassRS { mRS.programFragmentStoreDepthMask(false); mPfsBackground = mRS.programFragmentStoreCreate(); mPfsBackground.setName("PFSBackground"); + + mRS.programFragmentStoreBegin(null, null); + mRS.programFragmentStoreDepthFunc(ALWAYS); + mRS.programFragmentStoreBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE_MINUS_SRC_ALPHA); + mRS.programFragmentStoreDitherEnable(true); + mRS.programFragmentStoreDepthMask(false); + mPfsGrass = mRS.programFragmentStoreCreate(); + mPfsGrass.setName("PFSGrass"); } private void createProgramVertex() {