1423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen/*
2423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Copyright (C) 2009 The Android Open Source Project
3423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *
4423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
5423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * you may not use this file except in compliance with the License.
6423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * You may obtain a copy of the License at
7423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *
8423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
9423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *
10423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Unless required by applicable law or agreed to in writing, software
11423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
12423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * See the License for the specific language governing permissions and
14423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * limitations under the License.
15423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen */
16423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
17423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpackage com.android.magicsmoke;
18423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
19423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport static android.renderscript.Sampler.Value.LINEAR;
20423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport static android.renderscript.Sampler.Value.WRAP;
21423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
22423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport com.android.magicsmoke.R;
23423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
24423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.Context;
25423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.SharedPreferences;
26423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.SharedPreferences.Editor;
27423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;
28423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.graphics.Bitmap;
29423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.graphics.BitmapFactory;
30423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.media.MediaPlayer;
31423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.os.Handler;
3293e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchoukimport android.renderscript.*;
33423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.renderscript.Element.Builder;
34423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.renderscript.ProgramStore.BlendDstFunc;
35423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.renderscript.ProgramStore.BlendSrcFunc;
36423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.util.Log;
37423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.MotionEvent;
3831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchoukimport android.os.Bundle;
39423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
40423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport java.util.TimeZone;
41423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
42423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenclass MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChangeListener {
43423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
44423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    static class WorldState {
45423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public float mXOffset;
468d57c78704797dff5df2df2b10a08dec885fe489Marco Nelissen        public float mYOffset;
47423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mPreset;
48423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mTextureMask;
49423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mRotate;
50423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mTextureSwap;
51100f6bf08f1153ea6f38776f52cc1dbc7683d867Marco Nelissen        public int   mProcessTextureMode;
52423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mBackCol;
53423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mLowCol;
54423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mHighCol;
55423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public float mAlphaMul;
56423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int   mPreMul;
57423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
58423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    WorldState mWorldState = new WorldState();
5931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk    //private Type mStateType;
6031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk    //private Allocation mState;
61423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
62229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private ProgramStore mPStore;
63229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private ProgramFragment mPF5tex;
64229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private ProgramFragment mPF4tex;
65229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private Sampler[] mSampler;
66423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private Allocation[] mSourceTextures;
67423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private Allocation[] mRealTextures;
688a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
691a1e3e46628df575cf7bcf7b449bed4c97873a6bStephen Hines    private ScriptC_clouds mScript;
7031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
71229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private ScriptField_VertexShaderConstants_s mVSConst;
72229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private ScriptField_FragmentShaderConstants_s mFSConst;
73229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom
74229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private ProgramVertex mPV5tex;
75229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom    private ProgramVertex mPV4tex;
7693e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk    private ProgramVertexFixedFunction.Constants mPVAlloc;
77423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
78423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_STATE = 0;
79423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    //private static final int RSID_PROGRAMVERTEX = 3;
80423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISESRC1 = 1;
81423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISESRC2 = 2;
82423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISESRC3 = 3;
83423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISESRC4 = 4;
84423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISESRC5 = 5;
85423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISEDST1 = 6;
86423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISEDST2 = 7;
87423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISEDST3 = 8;
88423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISEDST4 = 9;
89423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private static final int RSID_NOISEDST5 = 10;
90423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
91423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private Context mContext;
92423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private SharedPreferences mSharedPref;
938a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
94423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    static class Preset {
95100f6bf08f1153ea6f38776f52cc1dbc7683d867Marco Nelissen        Preset(int processmode, int backcol, int locol, int hicol, float mul, int mask,
968792d8164337191fe53c161ad21a7da02843cadeStephen Hines                 boolean rot, boolean texswap, boolean premul) {
97100f6bf08f1153ea6f38776f52cc1dbc7683d867Marco Nelissen            mProcessTextureMode = processmode;
98423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mBackColor = backcol;
99423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mLowColor = locol;
100423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mHighColor = hicol;
101423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mAlphaMul = mul;
102423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mTextureMask = mask;
103423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mRotate = rot;
104423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mTextureSwap = texswap;
105423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mPreMul = premul;
106423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
107100f6bf08f1153ea6f38776f52cc1dbc7683d867Marco Nelissen        public int mProcessTextureMode;
108423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int mBackColor;
109423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int mLowColor;
110423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int mHighColor;
111423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public float mAlphaMul;
112423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public int mTextureMask;
113423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public boolean mRotate;
114423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public boolean mTextureSwap;
115423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public boolean mPreMul;
116423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
117423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
118ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen    public static final int DEFAULT_PRESET = 16;
119423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    public static final Preset [] mPreset = new Preset[] {
1208792d8164337191fe53c161ad21a7da02843cadeStephen Hines        //       proc    back     low       high     alph  mask  rot    swap   premul
1218792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x000000, 0x000000, 0xffffff, 2.0f, 0x0f, true,  false, false),
1228792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x0000ff, 0x000000, 0xffffff, 2.0f, 0x0f, true,  false, false),
1238792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x00ff00, 0x000000, 0xffffff, 2.0f, 0x0f, true,  false, false),
1248792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x00ff00, 0x000000, 0xffffff, 2.0f, 0x0f, true,  false, true),
1258792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x00ff00, 0x00ff00, 0xffffff, 2.5f, 0x1f, true,  true,  true),
1268792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x800000, 0xff0000, 0xffffff, 2.5f, 0x1f, true,  true,  false),
1278792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(0,  0x000000, 0x000000, 0xffffff, 0.0f, 0x1f, true,  false, false),
1288792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x0000ff, 0x00ff00, 0xffff00, 2.0f, 0x1f, true,  true,  false),
1298792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x008000, 0x00ff00, 0xffffff, 2.5f, 0x1f, true,  true,  false),
1308792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x800000, 0xff0000, 0xffffff, 2.5f, 0x1f, true,  true,  true),
1318792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x808080, 0x000000, 0xffffff, 2.0f, 0x0f, true,  false, true),
1328792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x0000ff, 0x000000, 0xffffff, 2.0f, 0x0f, true,  false, true),
1338792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x0000ff, 0x00ff00, 0xffff00, 1.5f, 0x1f, false, false, true),
1348792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x0000ff, 0x00ff00, 0xffff00, 2.0f, 0x1f, true,  true,  true),
1358792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x0000ff, 0x00ff00, 0xffff00, 1.5f, 0x1f, true,  true,  true),
1368792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x808080, 0x000000, 0xffffff, 2.0f, 0x0f, true,  false, false),
1378792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(1,  0x000000, 0x000000, 0xffffff, 2.0f, 0x0f, true,  true,  false),
1388792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(2,  0x000000, 0x000070, 0xff2020, 2.5f, 0x1f, true,  false, false),
1398792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(2,  0x6060ff, 0x000070, 0xffffff, 2.5f, 0x1f, true,  false, false),
1408792d8164337191fe53c161ad21a7da02843cadeStephen Hines        new Preset(3,  0x0000f0, 0x000000, 0xffffff, 2.0f, 0x0f, true,  true,  false),
141423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    };
1428a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
143423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private float mTouchY;
1448a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
145423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    MagicSmokeRS(Context context, int width, int height) {
146423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        super(width, height);
147423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWidth = width;
148423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mHeight = height;
149423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mContext = context;
150423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mSharedPref = mContext.getSharedPreferences("magicsmoke", Context.MODE_PRIVATE);
151ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        mSharedPref.registerOnSharedPreferenceChangeListener(this);
152423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        makeNewState();
153423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
154423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
155423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
156423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
157ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        if (!mIsStarted) {
158ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen            start();
159ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen            mRS.finish();
160ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen            stop(false);
161ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        } else {
162ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen            makeNewState();
163ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        }
164423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
165423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
166423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    void makeNewState() {
167423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        int p = mSharedPref.getInt("preset", DEFAULT_PRESET);
168423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        if (p >= mPreset.length) {
169423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            p = 0;
170423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
171423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mPreset = p;
172423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mTextureMask = mPreset[p].mTextureMask;
173423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mRotate = mPreset[p].mRotate ? 1 : 0;
174423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mTextureSwap = mPreset[p].mTextureSwap ? 1 : 0;
175100f6bf08f1153ea6f38776f52cc1dbc7683d867Marco Nelissen        mWorldState.mProcessTextureMode = mPreset[p].mProcessTextureMode;
176423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mBackCol = mPreset[p].mBackColor;
177423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mLowCol = mPreset[p].mLowColor;
178423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mHighCol = mPreset[p].mHighColor;
179423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mAlphaMul = mPreset[p].mAlphaMul;
180423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mPreMul = mPreset[p].mPreMul ? 1 : 0;
18131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
18231be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        if(mScript != null) {
18331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gPreset(mWorldState.mPreset);
18431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gTextureMask(mWorldState.mTextureMask);
18531be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gRotate(mWorldState.mRotate);
18631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gTextureSwap(mWorldState.mTextureSwap);
18731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gProcessTextureMode(mWorldState.mProcessTextureMode);
18831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gBackCol(mWorldState.mBackCol);
18931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gLowCol(mWorldState.mLowCol);
19031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gHighCol(mWorldState.mHighCol);
19131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gAlphaMul(mWorldState.mAlphaMul);
19231be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mScript.set_gPreMul(mWorldState.mPreMul);
19331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        }
194423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
1958a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
196423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    @Override
197423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    public void resize(int width, int height) {
198423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        super.resize(width, height);
199423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        if (mPVAlloc != null) {
20093e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            Matrix4f proj = new Matrix4f();
20193e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            proj.loadProjectionNormalized(width, height);
20293e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            mPVAlloc.setProjection(proj);
203423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
204423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
205423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
206423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    @Override
20731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk    public Bundle onCommand(String action, int x, int y, int z, Bundle extras,
20831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            boolean resultRequested) {
20931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
21031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        if ("android.wallpaper.tap".equals(action)) {
21131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            mTouchY = y;
21231be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        }
21331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        return null;
21431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk    }
21531be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
21631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk    /*@Override
217423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    public void onTouchEvent(MotionEvent event) {
218423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        switch(event.getAction()) {
219423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            case MotionEvent.ACTION_DOWN:
220423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mTouchY = event.getY();
221423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                break;
222423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            case MotionEvent.ACTION_MOVE:
223423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                float dy = event.getY() - mTouchY;
224423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mTouchY += dy;
225423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                dy /= 20;
226423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                if (dy > 4) {
227423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                    dy = 4;
228423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                } else if (dy < -4) {
229423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                    dy = -4;
230423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                }
23131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk                //mState.data(mWorldState);
232423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
23331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk    }*/
2348a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
235423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    @Override
2368d57c78704797dff5df2df2b10a08dec885fe489Marco Nelissen    public void setOffset(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) {
237423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        // update our state, then push it to the renderscript
238423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mWorldState.mXOffset = xOffset;
2398d57c78704797dff5df2df2b10a08dec885fe489Marco Nelissen        mWorldState.mYOffset = yOffset;
24031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gXOffset(mWorldState.mXOffset);
2418d57c78704797dff5df2df2b10a08dec885fe489Marco Nelissen        mScript.set_gYOffset(mWorldState.mYOffset);
242423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
243423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
244423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    @Override
245ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen    public void stop(boolean forReal) {
246ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        if (forReal) {
247ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen            mSharedPref.unregisterOnSharedPreferenceChangeListener(this);
248ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        }
249ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        super.stop(forReal);
250423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
251423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
252423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    @Override
253423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    public void start() {
254423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        makeNewState();
255ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen        super.start();
256423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
2578a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
258423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    float alphafactor;
259423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    Type mTextureType;
2608a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
261423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    void loadBitmap(int id, int index, String name, float alphamul, int lowcol, int highcol) {
262423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        BitmapFactory.Options opts = new BitmapFactory.Options();
263423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
264423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        Bitmap in = BitmapFactory.decodeResource(mResources, id, opts);
265423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
266f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen        // Bitmaps are stored in memory in premultiplied form. We want non-premultiplied,
267f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen        // which is what getPixels gives us.
268423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        int pixels[] = new int[65536];
269423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        in.getPixels(pixels, 0, 256, 0, 0, 256, 256);
2701316636ac28004152cffcb1c8795997c7a33765dJason Sams        mRealTextures[index] = Allocation.createTyped(mRS, mTextureType,
2711316636ac28004152cffcb1c8795997c7a33765dJason Sams                                                      Allocation.MipmapControl.MIPMAP_NONE,
2721316636ac28004152cffcb1c8795997c7a33765dJason Sams                                                      Allocation.USAGE_SCRIPT |
2731316636ac28004152cffcb1c8795997c7a33765dJason Sams                                                      Allocation.USAGE_GRAPHICS_TEXTURE);
2741316636ac28004152cffcb1c8795997c7a33765dJason Sams        mSourceTextures[index] = Allocation.createTyped(mRS, mTextureType,
2751316636ac28004152cffcb1c8795997c7a33765dJason Sams                                                      Allocation.MipmapControl.MIPMAP_NONE,
2761316636ac28004152cffcb1c8795997c7a33765dJason Sams                                                      Allocation.USAGE_SCRIPT);
277f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen
278f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen        // copyFrom needs a byte[], not an int[], so we need to copy the data first
279f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen        byte bpixels[] = new byte[65536*4];
280f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen        for (int i = 0; i < 65536; i++) {
281f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen            bpixels[i * 4 + 0] = (byte)(pixels[i] & 0xff);
282f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen            bpixels[i * 4 + 1] = (byte)((pixels[i] >> 8) & 0xff);
283f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen            bpixels[i * 4 + 2] = (byte)((pixels[i] >>16) & 0xff);
284f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen            bpixels[i * 4 + 3] = (byte)((pixels[i] >> 24) & 0xff);
285f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen        }
286f50de7e2660498d0c606597982639090ac1a8235Marco Nelissen        mSourceTextures[index].copyFrom(bpixels);
287423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        in.recycle();
288423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
289423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
290423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    void loadBitmaps() {
291423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        alphafactor = 1f;
292423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        float alphamul = mPreset[mWorldState.mPreset].mAlphaMul;
293423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        int lowcol = mPreset[mWorldState.mPreset].mLowColor;
294423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        int highcol = mPreset[mWorldState.mPreset].mHighColor;
295423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        //Log.i("@@@@", "preset " + mWorldState.mPreset + ", mul: " + alphamul +
296423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        //        ", colors: " + Integer.toHexString(lowcol) + "/" + Integer.toHexString(highcol));
2978a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
298423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        // TODO: using different high and low colors for each layer offers some cool effects too
299423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        loadBitmap(R.drawable.noise1, 0, "Tnoise1", alphamul, lowcol, highcol);
300423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        loadBitmap(R.drawable.noise2, 1, "Tnoise2", alphamul, lowcol, highcol);
301423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        loadBitmap(R.drawable.noise3, 2, "Tnoise3", alphamul, lowcol, highcol);
302423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        loadBitmap(R.drawable.noise4, 3, "Tnoise4", alphamul, lowcol, highcol);
303423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        loadBitmap(R.drawable.noise5, 4, "Tnoise5", alphamul, lowcol, highcol);
30431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
30531be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gTnoise1(mRealTextures[0]);
30631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gTnoise2(mRealTextures[1]);
30731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gTnoise3(mRealTextures[2]);
30831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gTnoise4(mRealTextures[3]);
30931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gTnoise5(mRealTextures[4]);
31031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
31131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisesrc1(mSourceTextures[0]);
31231be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisesrc2(mSourceTextures[1]);
31331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisesrc3(mSourceTextures[2]);
31431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisesrc4(mSourceTextures[3]);
31531be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisesrc5(mSourceTextures[4]);
31631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
31731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisedst1(mRealTextures[0]);
31831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisedst2(mRealTextures[1]);
31931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisedst3(mRealTextures[2]);
32031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisedst4(mRealTextures[3]);
32131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.bind_gNoisedst5(mRealTextures[4]);
322423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
3238a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
324423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    @Override
325423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    protected ScriptC createScript() {
32631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
327c71a2cb5b010ef13edba639bd214d9fa9922567aJason Sams        mScript = new ScriptC_clouds(mRS, mResources, R.raw.clouds);
328423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
329229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mVSConst = new ScriptField_VertexShaderConstants_s(mRS, 1);
330229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mScript.bind_gVSConstants(mVSConst);
331229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom
332229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        {
33393e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            ProgramVertex.Builder builder = new ProgramVertex.Builder(mRS);
334229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.setShader(mResources, R.raw.pv5tex);
335229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.addConstant(mVSConst.getAllocation().getType());
336229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.addInput(ScriptField_VertexInputs_s.createElement(mRS));
337229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom
338229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPV5tex = builder.create();
339229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPV5tex.bindConstants(mVSConst.getAllocation(), 0);
340423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
341229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.setShader(mResources, R.raw.pv4tex);
342229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPV4tex = builder.create();
343229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPV4tex.bindConstants(mVSConst.getAllocation(), 0);
344229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        }
345229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mScript.set_gPV5tex(mPV5tex);
346229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mScript.set_gPV4tex(mPV4tex);
34731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
348423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mSourceTextures = new Allocation[5];
349423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mRealTextures = new Allocation[5];
3508a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
351423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS));
352c71a2cb5b010ef13edba639bd214d9fa9922567aJason Sams        tb.setX(256);
353c71a2cb5b010ef13edba639bd214d9fa9922567aJason Sams        tb.setY(256);
354423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        mTextureType = tb.create();
355423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        loadBitmaps();
3568a7a9cfb8516b13ccb6d149330575802075bbc3aJason Sams
357423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        Sampler.Builder samplerBuilder = new Sampler.Builder(mRS);
35893e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk        samplerBuilder.setMinification(LINEAR);
35993e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk        samplerBuilder.setMagnification(LINEAR);
360423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        samplerBuilder.setWrapS(WRAP);
361423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        samplerBuilder.setWrapT(WRAP);
362229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mSampler = new Sampler[5];
363229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        for (int i = 0; i < 5; i++)
364229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mSampler[i] = samplerBuilder.create();
365423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
366423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        {
367229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mFSConst = new ScriptField_FragmentShaderConstants_s(mRS, 1);
368229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mScript.bind_gFSConstants(mFSConst);
369229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom
37093e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            ProgramFragment.Builder builder = new ProgramFragment.Builder(mRS);
371229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.setShader(mResources, R.raw.pf5tex);
37293e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            for (int texCount = 0; texCount < 5; texCount ++) {
37393e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk                builder.addTexture(Program.TextureType.TEXTURE_2D);
37493e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            }
375229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.addConstant(mFSConst.getAllocation().getType());
376229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom
377229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPF5tex = builder.create();
378229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            for (int i = 0; i < 5; i++)
379229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom                mPF5tex.bindSampler(mSampler[i], i);
380229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPF5tex.bindConstants(mFSConst.getAllocation(), 0);
381229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom
38293e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            builder = new ProgramFragment.Builder(mRS);
383229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.setShader(mResources, R.raw.pf4tex);
38493e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            for (int texCount = 0; texCount < 4; texCount ++) {
38593e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk                builder.addTexture(Program.TextureType.TEXTURE_2D);
38693e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            }
38793e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            builder.addConstant(mFSConst.getAllocation().getType());
388229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPF4tex = builder.create();
389229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            for (int i = 0; i < 4; i++)
390229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom                mPF4tex.bindSampler(mSampler[i], i);
391229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPF4tex.bindConstants(mFSConst.getAllocation(), 0);
392423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
393423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
394229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mScript.set_gPF5tex(mPF5tex);
395229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mScript.set_gPF4tex(mPF4tex);
396229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom
39731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
398423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        {
39993e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
400229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
401229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
40293e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            builder.setDitherEnabled(true); // without dithering there is severe banding
40393e6fb8d6b74f8be0768e70631daddb93c5a8cdaAlex Sakhartchouk            builder.setDepthMaskEnabled(false);
404229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            mPStore = builder.create();
405423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
406423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
407229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom        mScript.set_gPStore(mPStore);
40831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
40931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gPreset(mWorldState.mPreset);
41031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gTextureMask(mWorldState.mTextureMask);
41131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gRotate(mWorldState.mRotate);
41231be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gTextureSwap(mWorldState.mTextureSwap);
41331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gProcessTextureMode(mWorldState.mProcessTextureMode);
41431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gBackCol(mWorldState.mBackCol);
41531be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gLowCol(mWorldState.mLowCol);
41631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gHighCol(mWorldState.mHighCol);
41731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gAlphaMul(mWorldState.mAlphaMul);
41831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gPreMul(mWorldState.mPreMul);
41931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        mScript.set_gXOffset(mWorldState.mXOffset);
42031be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
42131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        return mScript;
422423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
423423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen}
424