summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Sakhartchouk <alexst@google.com>2010-09-13 20:39:30 -0700
committerAlex Sakhartchouk <alexst@google.com>2010-09-13 20:39:30 -0700
commita459fdb58267ada5d7f49929c53ba1af2be08c2d (patch)
treee922c0b4c9511953252f7d104cbb0a083be92d9a /src
parent8e49a3c7e029944074084bf8ea884dca3bf240ee (diff)
downloadandroid_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.java6
-rw-r--r--src/com/android/wallpaper/fall/fall.rs1
-rw-r--r--src/com/android/wallpaper/galaxy/GalaxyRS.java52
-rw-r--r--src/com/android/wallpaper/galaxy/galaxy.rs21
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);