diff options
author | Alex Sakhartchouk <alexst@google.com> | 2010-09-13 20:39:30 -0700 |
---|---|---|
committer | Alex Sakhartchouk <alexst@google.com> | 2010-09-13 20:39:30 -0700 |
commit | a459fdb58267ada5d7f49929c53ba1af2be08c2d (patch) | |
tree | e922c0b4c9511953252f7d104cbb0a083be92d9a /src | |
parent | 8e49a3c7e029944074084bf8ea884dca3bf240ee (diff) | |
download | android_packages_wallpapers_Basic-a459fdb58267ada5d7f49929c53ba1af2be08c2d.tar.gz android_packages_wallpapers_Basic-a459fdb58267ada5d7f49929c53ba1af2be08c2d.tar.bz2 android_packages_wallpapers_Basic-a459fdb58267ada5d7f49929c53ba1af2be08c2d.zip |
Updating wallpapers to use more generalized shader constant binding.
Change-Id: Ic9579cb8f91951916f97451f2545b78a2d731e64
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/wallpaper/fall/FallRS.java | 6 | ||||
-rw-r--r-- | src/com/android/wallpaper/fall/fall.rs | 1 | ||||
-rw-r--r-- | src/com/android/wallpaper/galaxy/GalaxyRS.java | 52 | ||||
-rw-r--r-- | src/com/android/wallpaper/galaxy/galaxy.rs | 21 |
4 files changed, 65 insertions, 15 deletions
diff --git a/src/com/android/wallpaper/fall/FallRS.java b/src/com/android/wallpaper/fall/FallRS.java index bdb75db..9f21dfa 100644 --- a/src/com/android/wallpaper/fall/FallRS.java +++ b/src/com/android/wallpaper/fall/FallRS.java @@ -323,6 +323,9 @@ class FallRS extends RenderScriptScene { ProgramVertex.ShaderBuilder sb = new ProgramVertex.ShaderBuilder(mRS); String t = "\n" + + "varying vec4 varColor;\n" + + "varying vec4 varTex0;\n" + + "vec2 addDrop(vec4 d, vec2 pos, float dxMul) {\n" + " vec2 ret = vec2(0.0, 0.0);\n" + " vec2 delta = d.xy - pos;\n" + @@ -373,8 +376,7 @@ class FallRS extends RenderScriptScene { sb.addConstant(mUniformAlloc.getType()); sb.addInput(mMesh.getVertexAllocation(0).getType().getElement()); mPvWater = sb.create(); - mPvWater.bindAllocation(mPvOrthoAlloc); - mPvWater.bindConstants(mUniformAlloc, 1); + mPvWater.bindConstants(mUniformAlloc, 0); mScript.set_g_PVWater(mPvWater); diff --git a/src/com/android/wallpaper/fall/fall.rs b/src/com/android/wallpaper/fall/fall.rs index 63717f1..b64f804 100644 --- a/src/com/android/wallpaper/fall/fall.rs +++ b/src/com/android/wallpaper/fall/fall.rs @@ -381,6 +381,7 @@ int root(int launchID) { rsgBindProgramVertex(g_PVWater); generateRipples(); + rsAllocationMarkDirty(rsGetAllocation(g_Constants)); drawRiverbed(); drawLeaves(); diff --git a/src/com/android/wallpaper/galaxy/GalaxyRS.java b/src/com/android/wallpaper/galaxy/GalaxyRS.java index 98048ba..a8c16b3 100644 --- a/src/com/android/wallpaper/galaxy/GalaxyRS.java +++ b/src/com/android/wallpaper/galaxy/GalaxyRS.java @@ -25,6 +25,7 @@ import android.renderscript.Allocation; import android.renderscript.Sampler; import android.renderscript.Element; import android.renderscript.Mesh; +import android.renderscript.Matrix4f; import android.renderscript.Primitive; import android.renderscript.Type; import static android.renderscript.ProgramStore.DepthFunc.*; @@ -44,6 +45,7 @@ class GalaxyRS extends RenderScriptScene { private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options(); private ProgramVertex.MatrixAllocation mPvOrthoAlloc; private ProgramVertex.MatrixAllocation mPvProjectionAlloc; + private ScriptField_VpConsts mPvStarAlloc; private Mesh mParticlesMesh; private ScriptC_Galaxy mScript; @@ -86,6 +88,41 @@ class GalaxyRS extends RenderScriptScene { mScript.bind_Particles(p); } + private Matrix4f getProjectionNormalized(int w, int h) { + // range -1,1 in the narrow axis at z = 0. + Matrix4f m1 = new Matrix4f(); + Matrix4f m2 = new Matrix4f(); + + if(w > h) { + float aspect = ((float)w) / h; + m1.loadFrustum(-aspect,aspect, -1,1, 1,100); + } else { + float aspect = ((float)h) / w; + m1.loadFrustum(-1,1, -aspect,aspect, 1,100); + } + + m2.loadRotate(180, 0, 1, 0); + m1.loadMultiply(m1, m2); + + m2.loadScale(-2, 2, 1); + m1.loadMultiply(m1, m2); + + m2.loadTranslate(0, 0, 2); + m1.loadMultiply(m1, m2); + return m1; + } + + private void updateProjectionMatrices() { + mPvOrthoAlloc.setupOrthoWindow(mWidth, mHeight); + + Matrix4f projNorm = getProjectionNormalized(mWidth, mHeight); + ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item(); + i.Proj = projNorm; + i.MVP = projNorm; + mPvStarAlloc.set(i, 0, true); + mPvProjectionAlloc.loadProjection(projNorm); + } + @Override public void setOffset(float xOffset, float yOffset, int xPixels, int yPixels) { mScript.set_gXOffset(xOffset); @@ -95,8 +132,7 @@ class GalaxyRS extends RenderScriptScene { public void resize(int width, int height) { super.resize(width, height); - mPvOrthoAlloc.setupOrthoWindow(mWidth, mHeight); - mPvProjectionAlloc.setupProjectionNormalized(mWidth, mHeight); + updateProjectionMatrices(); } private void loadTextures() { @@ -149,15 +185,16 @@ class GalaxyRS extends RenderScriptScene { private void createProgramVertex() { mPvOrthoAlloc = new ProgramVertex.MatrixAllocation(mRS); - mPvOrthoAlloc.setupOrthoWindow(mWidth, mHeight); ProgramVertex.Builder builder = new ProgramVertex.Builder(mRS, null, null); ProgramVertex pvbo = builder.create(); pvbo.bindAllocation(mPvOrthoAlloc); mRS.contextBindProgramVertex(pvbo); + mPvStarAlloc = new ScriptField_VpConsts(mRS, 1); + mScript.bind_vpConstants(mPvStarAlloc); mPvProjectionAlloc = new ProgramVertex.MatrixAllocation(mRS); - mPvProjectionAlloc.setupProjectionNormalized(mWidth, mHeight); + updateProjectionMatrices(); builder = new ProgramVertex.Builder(mRS, null, null); ProgramVertex pvbp = builder.create(); @@ -165,7 +202,9 @@ class GalaxyRS extends RenderScriptScene { mScript.set_gPVBkProj(pvbp); ProgramVertex.ShaderBuilder sb = new ProgramVertex.ShaderBuilder(mRS); - String t = "void main() {\n" + + String t = "varying vec4 varColor;\n" + + "varying vec4 varTex0;\n" + + "void main() {\n" + " float dist = ATTRIB_position.y;\n" + " float angle = ATTRIB_position.x;\n" + " float x = dist * sin(angle);\n" + @@ -185,8 +224,9 @@ class GalaxyRS extends RenderScriptScene { "}\n"; sb.setShader(t); sb.addInput(mParticlesMesh.getVertexAllocation(0).getType().getElement()); + sb.addConstant(mPvStarAlloc.getType()); ProgramVertex pvs = sb.create(); - pvs.bindAllocation(mPvProjectionAlloc); + pvs.bindConstants(mPvStarAlloc.getAllocation(), 0); mScript.set_gPVStars(pvs); } diff --git a/src/com/android/wallpaper/galaxy/galaxy.rs b/src/com/android/wallpaper/galaxy/galaxy.rs index 4d439b7..7437bf2 100644 --- a/src/com/android/wallpaper/galaxy/galaxy.rs +++ b/src/com/android/wallpaper/galaxy/galaxy.rs @@ -55,8 +55,13 @@ typedef struct __attribute__((packed, aligned(4))) Particle { } Particle_t; Particle_t *Particles; +typedef struct VpConsts { + rs_matrix4x4 Proj; + rs_matrix4x4 MVP; +} VpConsts_t; +VpConsts_t *vpConstants; -#pragma rs export_var(gXOffset, gIsPreview, gPFBackground, gPFStars, gPVStars, gPVBkProj, gPSLights, gTSpace, gTFlares, gTLight1, gParticlesMesh, Particles) +#pragma rs export_var(gXOffset, gIsPreview, gPFBackground, gPFStars, gPVStars, gPVBkProj, gPSLights, gTSpace, gTFlares, gTLight1, gParticlesMesh, Particles, vpConstants) #pragma rs export_func() static float mapf(float minStart, float minStop, float maxStart, float maxStop, float value) { @@ -163,11 +168,6 @@ static void drawLights() { } static void drawParticles(float offset) { - rsgBindProgramVertex(gPVStars); - rsgBindProgramFragment(gPFStars); - rsgBindProgramStore(gPSLights); - rsgBindTexture(gPFStars, 0, gTFlares); - float a = offset * angle; float absoluteAngle = fabs(a); @@ -180,7 +180,14 @@ static void drawParticles(float offset) { } rsMatrixRotate(&matrix, absoluteAngle, 1.0f, 0.0f, 0.0f); rsMatrixRotate(&matrix, a, 0.0f, 0.4f, 0.1f); - rsgProgramVertexLoadModelMatrix(&matrix); + rsMatrixLoad(&vpConstants->MVP, &vpConstants->Proj); + rsMatrixMultiply(&vpConstants->MVP, &matrix); + rsAllocationMarkDirty(rsGetAllocation(vpConstants)); + + rsgBindProgramVertex(gPVStars); + rsgBindProgramFragment(gPFStars); + rsgBindProgramStore(gPSLights); + rsgBindTexture(gPFStars, 0, gTFlares); Particle_t *vtx = Particles; int count = rsAllocationGetDimX(gParticlesBuffer); |