NexusRS.java revision 6a500a1d5e15bd5a563995f31d0796552cc13640
1af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron/*
2af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * Copyright (C) 2009 The Android Open Source Project
3af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron *
4af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * Licensed under the Apache License, Version 2.0 (the "License");
5af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * you may not use this file except in compliance with the License.
6af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * You may obtain a copy of the License at
7af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron *
8af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron *      http://www.apache.org/licenses/LICENSE-2.0
9af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron *
10af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * Unless required by applicable law or agreed to in writing, software
11af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * distributed under the License is distributed on an "AS IS" BASIS,
12af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * See the License for the specific language governing permissions and
14af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron * limitations under the License.
15af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron */
16af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
17af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronpackage com.android.wallpaper.nexus;
18af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
19af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport static android.renderscript.Element.RGBA_8888;
20af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport static android.renderscript.Element.RGB_565;
21af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport static android.renderscript.ProgramStore.DepthFunc.ALWAYS;
22af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport static android.renderscript.Sampler.Value.LINEAR;
236a500a1d5e15bd5a563995f31d0796552cc13640Jason Samsimport static android.renderscript.Sampler.Value.CLAMP;
24af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport static android.renderscript.Sampler.Value.WRAP;
25af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
26af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport com.android.wallpaper.R;
27af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport com.android.wallpaper.RenderScriptScene;
28af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
296a500a1d5e15bd5a563995f31d0796552cc13640Jason Samsimport android.content.res.Resources;
30af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.graphics.Bitmap;
31af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.graphics.BitmapFactory;
32af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.graphics.Rect;
33af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.os.Bundle;
34af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.Allocation;
35af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.ProgramFragment;
36af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.ProgramStore;
37af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.ProgramVertex;
38af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.Sampler;
39af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.Script;
40af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.ScriptC;
41af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.Type;
42af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.ProgramStore.BlendDstFunc;
43af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.renderscript.ProgramStore.BlendSrcFunc;
44af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport android.view.SurfaceHolder;
45af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
46af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronimport java.util.TimeZone;
47af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
48af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleronclass NexusRS extends RenderScriptScene {
49af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
50af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private static final int RSID_STATE = 0;
51c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
52af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private static final int RSID_COMMAND = 1;
53af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
54af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private static final int TEXTURES_COUNT = 3;
55af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
56af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
57af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
58af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private ProgramFragment mPfTexture;
596a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams    private ProgramFragment mPfTexture565;
60c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
61af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private ProgramFragment mPfColor;
62af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
63af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private ProgramStore mPsSolid;
64c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
65af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private ProgramStore mPsBlend;
66c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
67af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private ProgramVertex mPvOrtho;
68c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
69af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private ProgramVertex.MatrixAllocation mPvOrthoAlloc;
70af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
716a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams    private Sampler mClampSampler;
726a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams    private Sampler mWrapSampler;
73af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
74af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private Allocation mState;
75c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
76af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private Type mStateType;
77af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
78af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private WorldState mWorldState;
79c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
80af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private Allocation mCommandAllocation;
81c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
82af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private Type mCommandType;
83af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
84af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private CommandState mCommand;
85af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
86c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams    private Allocation[] mTextures = new Allocation[TEXTURES_COUNT];
87c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
88af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    public NexusRS(int width, int height) {
89af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        super(width, height);
90af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
91af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mOptionsARGB.inScaled = false;
92af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
93af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
94af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
95af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    @Override
96af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    public void setOffset(float xOffset, float yOffset, int xPixels, int yPixels) {
97af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.xOffset = xOffset;
98af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mState.data(mWorldState);
99af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
100c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
101af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    @Override
102af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    public void start() {
103af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        super.start();
104af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
105af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
106af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    @Override
107af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    public void resize(int width, int height) {
108af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        super.resize(width, height);
109af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
110af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.width = width;
111af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.height = height;
112af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.rotate = width > height ? 1 : 0;
113af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mState.data(mWorldState);
114af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
115af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPvOrthoAlloc.setupOrthoWindow(mWidth, mHeight);
116af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
117af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
118af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    @Override
119af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    protected ScriptC createScript() {
120af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        createProgramVertex();
121af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        createProgramFragmentStore();
122af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        createProgramFragment();
123af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        createState();
124af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        loadTextures();
125af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
126af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        ScriptC.Builder sb = new ScriptC.Builder(mRS);
127af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sb.setType(mStateType, "State", RSID_STATE);
128af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sb.setType(mCommandType, "Command", RSID_COMMAND);
129af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sb.setScript(mResources, R.raw.nexus);
130af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        Script.Invokable invokable = sb.addInvokable("initPulses");
131af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sb.setRoot(true);
132af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
133af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        ScriptC script = sb.create();
134af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        script.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
135af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        script.setTimeZone(TimeZone.getDefault().getID());
136af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
137af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        script.bindAllocation(mState, RSID_STATE);
138af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        script.bindAllocation(mCommandAllocation, RSID_COMMAND);
139c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
140af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        invokable.execute();
141c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
142af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        return script;
143af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
144af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
145af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    static class WorldState {
146af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public int width;
147af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public int height;
148af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public float glWidth;
149af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public float glHeight;
150af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public int rotate;
151af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public int isPreview;
152af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public float xOffset;
1536a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        public int mode;
154af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
155af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
156af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    static class CommandState {
157af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public int x;
158af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public int y;
159af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        public int command;
160af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
161af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
162af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private void createState() {
163af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState = new WorldState();
164af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.width = mWidth;
165af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.height = mHeight;
166af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.rotate = mWidth > mHeight ? 1 : 0;
167af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mWorldState.isPreview = isPreview() ? 1 : 0;
168af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
1696a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        try {
1706a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams            mWorldState.mode = mResources.getInteger(R.integer.nexus_mode);
1716a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        } catch (Resources.NotFoundException exc) {
1726a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams            mWorldState.mode = 0; // standard nexus mode
1736a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        }
1746a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams
175af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mStateType = Type.createFromClass(mRS, WorldState.class, 1, "WorldState");
176af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mState = Allocation.createTyped(mRS, mStateType);
177af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mState.data(mWorldState);
178c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
179af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommand = new CommandState();
180af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommand.x = -1;
181af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommand.y = -1;
182af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommand.command = 0;
183af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
184af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommandType = Type.createFromClass(mRS, CommandState.class, 1, "DropState");
185af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommandAllocation = Allocation.createTyped(mRS, mCommandType);
186af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommandAllocation.data(mCommand);
187af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
188af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
189af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private void loadTextures() {
190c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams        mTextures[0] = loadTexture(R.drawable.pyramid_background, "TBackground");
191c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams        mTextures[1] = loadTextureARGB(R.drawable.pulse, "TPulse");
192c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams        mTextures[2] = loadTextureARGB(R.drawable.glow, "TGlow");
193c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
194c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams        final int count = mTextures.length;
195af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        for (int i = 0; i < count; i++) {
196c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams            mTextures[i].uploadToTexture(0);
197af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        }
198af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
199af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
200af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private Allocation loadTexture(int id, String name) {
201af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        final Allocation allocation = Allocation.createFromBitmapResource(mRS, mResources,
202af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron                id, RGB_565(mRS), false);
203af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        allocation.setName(name);
204af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        return allocation;
205af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
206af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
207af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private Allocation loadTextureARGB(int id, String name) {
208af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        Bitmap b = BitmapFactory.decodeResource(mResources, id, mOptionsARGB);
209af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        final Allocation allocation = Allocation.createFromBitmap(mRS, b, RGBA_8888(mRS), false);
210af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        allocation.setName(name);
211af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        return allocation;
212af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
213af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
214af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private void createProgramFragment() {
2156a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        // sampler and program fragment for pulses
216af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        Sampler.Builder sampleBuilder = new Sampler.Builder(mRS);
217af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sampleBuilder.setMin(LINEAR);
218af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sampleBuilder.setMag(LINEAR);
219af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sampleBuilder.setWrapS(WRAP);
220af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        sampleBuilder.setWrapT(WRAP);
2216a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        mWrapSampler = sampleBuilder.create();
2226a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        ProgramFragment.Builder builder = new ProgramFragment.Builder(mRS);
2236a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        builder.setTexture(ProgramFragment.Builder.EnvMode.MODULATE,
2246a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams                           ProgramFragment.Builder.Format.RGBA, 0);
225af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPfTexture = builder.create();
226af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPfTexture.setName("PFTexture");
2276a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        mPfTexture.bindSampler(mWrapSampler, 0);
228c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
2296a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        builder = new ProgramFragment.Builder(mRS);
2306a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        builder.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
2316a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams                           ProgramFragment.Builder.Format.RGB, 0);
232af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPfColor = builder.create();
233af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPfColor.setName("PFColor");
2346a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        mPfColor.bindSampler(mWrapSampler, 0);
2356a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams
2366a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        // sampler and program fragment for background image
2376a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        sampleBuilder.setWrapS(CLAMP);
2386a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        sampleBuilder.setWrapT(CLAMP);
2396a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        mClampSampler = sampleBuilder.create();
2406a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        builder = new ProgramFragment.Builder(mRS);
2416a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        builder.setTexture(ProgramFragment.Builder.EnvMode.MODULATE,
2426a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams                           ProgramFragment.Builder.Format.RGB, 0);
2436a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        mPfTexture565 = builder.create();
2446a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        mPfTexture565.setName("PFTexture565");
2456a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams        mPfTexture565.bindSampler(mClampSampler, 0);
246af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
247af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
248af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private void createProgramFragmentStore() {
249af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        ProgramStore.Builder builder = new ProgramStore.Builder(mRS, null, null);
250af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setDepthFunc(ALWAYS);
251af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
252af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setDitherEnable(false);
253af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setDepthMask(true);
254af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPsSolid = builder.create();
255af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPsSolid.setName("PSSolid");
256c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
257af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder = new ProgramStore.Builder(mRS, null, null);
258af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setDepthFunc(ALWAYS);
259af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron       //  builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
260af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE);
261af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
262af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setDitherEnable(false);
263af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        builder.setDepthMask(true);
264af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPsBlend = builder.create();
265af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPsBlend.setName("PSBlend");
266af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
267af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
268af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private void createProgramVertex() {
269af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPvOrthoAlloc = new ProgramVertex.MatrixAllocation(mRS);
270af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPvOrthoAlloc.setupOrthoWindow(mWidth, mHeight);
271af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
272af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
273af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        pvb.setTextureMatrixEnable(true);
274af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPvOrtho = pvb.create();
275af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPvOrtho.bindAllocation(mPvOrthoAlloc);
276af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mPvOrtho.setName("PVOrtho");
277af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
278af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
279af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    @Override
280af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    public Bundle onCommand(String action, int x, int y, int z, Bundle extras,
281af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron            boolean resultRequested) {
282af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
283af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        final int dw = mWorldState.width;
284af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        final int bw = 960;
285af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        x = (int) (x + mWorldState.xOffset * (bw-dw));
286c27d65349acd38f6ee8fd74bb01518062b0c0b0dJason Sams
287af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        if ("android.wallpaper.tap".equals(action)) {
288af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron            sendCommand(1, x, y);
289af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        } else if ("android.home.drop".equals(action)) {
290af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron            sendCommand(2, x, y);
291af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        }
292af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        return null;
293af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
294af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron
295af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    private void sendCommand(int command, int x, int y) {
296af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommand.x = x;
297af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommand.y = y;
298af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommand.command = command;
299af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron        mCommandAllocation.data(mCommand);
300af45d444c61a510f2f477a2a7ec01b2bdce25910Mike Cleron    }
3016a500a1d5e15bd5a563995f31d0796552cc13640Jason Sams}
302