1e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams/*
2e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * Copyright (C) 2008 The Android Open Source Project
3e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams *
4e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * you may not use this file except in compliance with the License.
6e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * You may obtain a copy of the License at
7e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams *
8e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams *
10e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * Unless required by applicable law or agreed to in writing, software
11e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * See the License for the specific language governing permissions and
14e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * limitations under the License.
15e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams */
16e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
17e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samspackage com.example.android.rs.miscsamples;
18e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
19e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.content.res.Resources;
20e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.graphics.Bitmap;
21e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.graphics.BitmapFactory;
22e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.*;
23e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.Font.Style;
24e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.Program.TextureType;
25e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.ProgramStore.DepthFunc;
26e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.ProgramStore.BlendSrcFunc;
27e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.ProgramStore.BlendDstFunc;
28e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.Sampler.Value;
29e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.util.Log;
30e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
31e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
32e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samspublic class RsRenderStatesRS {
33e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
34e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    int mWidth;
35e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    int mHeight;
36e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
37e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    public RsRenderStatesRS() {
38e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
39e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
40e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    public void init(RenderScriptGL rs, Resources res) {
41e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mRS = rs;
42e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mWidth = mRS.getWidth();
43e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mHeight = mRS.getHeight();
44e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mRes = res;
45e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mOptionsARGB.inScaled = false;
46e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
47e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMode = 0;
48e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMaxModes = 0;
49e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initRS();
50e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
51e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
52e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    public void surfaceChanged() {
53e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mWidth = mRS.getWidth();
54e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mHeight = mRS.getHeight();
55e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
56e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        Matrix4f proj = new Matrix4f();
57e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        proj.loadOrthoWindow(mWidth, mHeight);
58e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mPVA.setProjection(proj);
59e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
60e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
61e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Resources mRes;
62e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private RenderScriptGL mRS;
63e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
64e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Sampler mLinearClamp;
65e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Sampler mLinearWrap;
66e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Sampler mMipLinearWrap;
67e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Sampler mNearestClamp;
68e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Sampler mMipLinearAniso8;
69e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Sampler mMipLinearAniso15;
70e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
71e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramStore mProgStoreBlendNoneDepth;
72e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramStore mProgStoreBlendNone;
73e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramStore mProgStoreBlendAlpha;
74e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramStore mProgStoreBlendAdd;
75e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
76e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramFragment mProgFragmentTexture;
77e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramFragment mProgFragmentColor;
78e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
79e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramVertex mProgVertex;
80e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramVertexFixedFunction.Constants mPVA;
81e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
82e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    // Custom shaders
83e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramVertex mProgVertexCustom;
84e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramFragment mProgFragmentCustom;
85e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramFragment mProgFragmentMultitex;
86e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ScriptField_VertexShaderConstants_s mVSConst;
87e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ScriptField_VertexShaderConstants2_s mVSConst2;
88e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ScriptField_FragentShaderConstants_s mFSConst;
89e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ScriptField_FragentShaderConstants2_s mFSConst2;
90e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
91e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramVertex mProgVertexCustom2;
92e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramFragment mProgFragmentCustom2;
93e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
94e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramVertex mProgVertexCube;
95e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramFragment mProgFragmentCube;
96e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
97e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramRaster mCullBack;
98e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramRaster mCullFront;
99e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ProgramRaster mCullNone;
100e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
101e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation mTexTorus;
102e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation mTexOpaque;
103e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation mTexTransparent;
104e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation mTexChecker;
105e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation mTexCube;
106e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
107e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Mesh mMbyNMesh;
108e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Mesh mTorus;
109e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
110e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Font mFontSans;
111e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Font mFontSerif;
112e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Font mFontSerifBold;
113e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Font mFontSerifItalic;
114e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Font mFontSerifBoldItalic;
115e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    Font mFontMono;
116e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation mTextAlloc;
117e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
118e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private ScriptC_rsrenderstates mScript;
119e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
120e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
121e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
122e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    int mMode;
123e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    int mMaxModes;
124e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
125e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    public void onActionDown(int x, int y) {
126e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMode ++;
127e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMode = mMode % mMaxModes;
128e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gDisplayMode(mMode);
129e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
130e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
131e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
132e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ProgramStore.Builder builder = new ProgramStore.Builder(rs);
133e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
134e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
135e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setDitherEnabled(false);
136e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setDepthMaskEnabled(false);
137e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        return builder.create();
138e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
139e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
140e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) {
141e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
142e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
143e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                                           2, Mesh.TriangleMeshBuilder.TEXTURE_0);
144e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
145e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        for (int y = 0; y <= hResolution; y++) {
146e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            final float normalizedY = (float)y / hResolution;
147e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            final float yOffset = (normalizedY - 0.5f) * height;
148e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            for (int x = 0; x <= wResolution; x++) {
149e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                float normalizedX = (float)x / wResolution;
150e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                float xOffset = (normalizedX - 0.5f) * width;
151e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                tmb.setTexture(normalizedX, normalizedY);
152e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                tmb.addVertex(xOffset, yOffset);
153e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams             }
154e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        }
155e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
156e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        for (int y = 0; y < hResolution; y++) {
157e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            final int curY = y * (wResolution + 1);
158e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            final int belowY = (y + 1) * (wResolution + 1);
159e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            for (int x = 0; x < wResolution; x++) {
160e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                int curV = curY + x;
161e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                int belowV = belowY + x;
162e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                tmb.addTriangle(curV, belowV, curV + 1);
163e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                tmb.addTriangle(belowV, belowV + 1, curV + 1);
164e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            }
165e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        }
166e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
167e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        return tmb.create(true);
168e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
169e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
170e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initProgramStore() {
171e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Use stock the stock program store object
172e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgStoreBlendNoneDepth = ProgramStore.BLEND_NONE_DEPTH_TEST(mRS);
173e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(mRS);
174e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
175e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Create a custom program store
176e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
177e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
178e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
179e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                             ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
180e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setDitherEnabled(false);
181e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        builder.setDepthMaskEnabled(false);
182e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgStoreBlendAlpha = builder.create();
183e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
184e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgStoreBlendAdd = BLEND_ADD_DEPTH_NONE(mRS);
185e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
186e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgStoreBlendNoneDepth(mProgStoreBlendNoneDepth);
187e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgStoreBlendNone(mProgStoreBlendNone);
188e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgStoreBlendAlpha(mProgStoreBlendAlpha);
189e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgStoreBlendAdd(mProgStoreBlendAdd);
190e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
191e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
192e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initProgramFragment() {
193e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
194e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
195e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
196e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                              ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
197e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentTexture = texBuilder.create();
198e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentTexture.bindSampler(mLinearClamp, 0);
199e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
200e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
201e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        colBuilder.setVaryingColor(false);
202e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentColor = colBuilder.create();
203e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
204e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgFragmentColor(mProgFragmentColor);
205e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgFragmentTexture(mProgFragmentTexture);
206e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
207e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
208e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initProgramVertex() {
209e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
210e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgVertex = pvb.create();
211e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
212e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
213e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ((ProgramVertexFixedFunction)mProgVertex).bindConstants(mPVA);
214e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        Matrix4f proj = new Matrix4f();
215e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        proj.loadOrthoWindow(mWidth, mHeight);
216e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mPVA.setProjection(proj);
217e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
218e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgVertex(mProgVertex);
219e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
220e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
221e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initCustomShaders() {
222e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mVSConst = new ScriptField_VertexShaderConstants_s(mRS, 1);
223e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mVSConst2 = new ScriptField_VertexShaderConstants2_s(mRS, 1);
224e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFSConst = new ScriptField_FragentShaderConstants_s(mRS, 1);
225e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFSConst2 = new ScriptField_FragentShaderConstants2_s(mRS, 1);
226e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
227e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.bind_gVSConstants(mVSConst);
228e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.bind_gVSConstants2(mVSConst2);
229e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.bind_gFSConstants(mFSConst);
230e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.bind_gFSConstants2(mFSConst2);
231e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
232e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Initialize the shader builder
233e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ProgramVertex.Builder pvbCustom = new ProgramVertex.Builder(mRS);
234e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Specify the resource that contains the shader string
235e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.setShader(mRes, R.raw.shaderv);
236e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Use a script field to spcify the input layout
237e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
238e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Define the constant input layout
239e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.addConstant(mVSConst.getAllocation().getType());
240e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgVertexCustom = pvbCustom.create();
241e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Bind the source of constant data
242e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgVertexCustom.bindConstants(mVSConst.getAllocation(), 0);
243e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
244e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        ProgramFragment.Builder pfbCustom = new ProgramFragment.Builder(mRS);
245e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Specify the resource that contains the shader string
246e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.setShader(mRes, R.raw.shaderf);
247e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        //Tell the builder how many textures we have
248e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
249e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Define the constant input layout
250e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.addConstant(mFSConst.getAllocation().getType());
251e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentCustom = pfbCustom.create();
252e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Bind the source of constant data
253e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentCustom.bindConstants(mFSConst.getAllocation(), 0);
254e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
255e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom = new ProgramVertex.Builder(mRS);
256e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.setShader(mRes, R.raw.shaderarrayv);
257e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
258e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.addConstant(mVSConst2.getAllocation().getType());
259e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgVertexCustom2 = pvbCustom.create();
260e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgVertexCustom2.bindConstants(mVSConst2.getAllocation(), 0);
261e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
262e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom = new ProgramFragment.Builder(mRS);
263e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.setShader(mRes, R.raw.shaderarrayf);
264e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
265e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.addConstant(mFSConst2.getAllocation().getType());
266e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentCustom2 = pfbCustom.create();
267e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentCustom2.bindConstants(mFSConst2.getAllocation(), 0);
268e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
269e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Cubemap test shaders
270e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom = new ProgramVertex.Builder(mRS);
271e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.setShader(mRes, R.raw.shadercubev);
272e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
273e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pvbCustom.addConstant(mVSConst.getAllocation().getType());
274e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgVertexCube = pvbCustom.create();
275e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgVertexCube.bindConstants(mVSConst.getAllocation(), 0);
276e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
277e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom = new ProgramFragment.Builder(mRS);
278e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.setShader(mRes, R.raw.shadercubef);
279e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.addTexture(Program.TextureType.TEXTURE_CUBE);
280e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentCube = pfbCustom.create();
281e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
282e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom = new ProgramFragment.Builder(mRS);
283e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        pfbCustom.setShader(mRes, R.raw.multitexf);
284e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        for (int texCount = 0; texCount < 3; texCount ++) {
285e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
286e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        }
287e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mProgFragmentMultitex = pfbCustom.create();
288e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
289e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgVertexCustom(mProgVertexCustom);
290e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgFragmentCustom(mProgFragmentCustom);
291e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgVertexCustom2(mProgVertexCustom2);
292e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgFragmentCustom2(mProgFragmentCustom2);
293e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgVertexCube(mProgVertexCube);
294e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgFragmentCube(mProgFragmentCube);
295e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gProgFragmentMultitex(mProgFragmentMultitex);
296e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
297e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
298e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation loadTextureRGB(int id) {
299e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        return Allocation.createFromBitmapResource(mRS, mRes, id,
300e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                                                   Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
301e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                                                   Allocation.USAGE_GRAPHICS_TEXTURE);
302e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
303e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
304e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private Allocation loadTextureARGB(int id) {
305e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB);
306e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        return Allocation.createFromBitmap(mRS, b,
307e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                                           Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
308e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams                                           Allocation.USAGE_GRAPHICS_TEXTURE);
309e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
310e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
311e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void loadImages() {
312e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mTexTorus = loadTextureRGB(R.drawable.torusmap);
313e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mTexOpaque = loadTextureRGB(R.drawable.data);
314e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mTexTransparent = loadTextureARGB(R.drawable.leaf);
315e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mTexChecker = loadTextureRGB(R.drawable.checker);
316e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.cubemap_test);
317e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mTexCube = Allocation.createCubemapFromBitmap(mRS, b);
318e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
319e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gTexTorus(mTexTorus);
320e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gTexOpaque(mTexOpaque);
321e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gTexTransparent(mTexTransparent);
322e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gTexChecker(mTexChecker);
323e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gTexCube(mTexCube);
324e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
325e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
326e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initFonts() {
327e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Sans font by family name
328e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFontSans = Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
329e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFontSerif = Font.create(mRS, mRes, "serif", Font.Style.NORMAL, 8);
330e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        // Create fonts by family and style
331e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFontSerifBold = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
332e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFontSerifItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
333e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFontSerifBoldItalic = Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
334e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mFontMono = Font.create(mRS, mRes, "mono", Font.Style.NORMAL, 8);
335e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
336e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mTextAlloc = Allocation.createFromString(mRS, "String from allocation", Allocation.USAGE_SCRIPT);
337e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
338e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gFontSans(mFontSans);
339e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gFontSerif(mFontSerif);
340e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gFontSerifBold(mFontSerifBold);
341e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gFontSerifItalic(mFontSerifItalic);
342e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gFontSerifBoldItalic(mFontSerifBoldItalic);
343e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gFontMono(mFontMono);
344e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gTextAlloc(mTextAlloc);
345e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
346e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
347e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initMesh() {
348e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMbyNMesh = getMbyNMesh(256, 256, 10, 10);
349e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gMbyNMesh(mMbyNMesh);
350e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
351e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.torus);
352e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        FileA3D.IndexEntry entry = model.getIndexEntry(0);
353e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
354e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            Log.e("rs", "could not load model");
355e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        } else {
356e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            mTorus = (Mesh)entry.getObject();
357e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams            mScript.set_gTorusMesh(mTorus);
358e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        }
359e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
360e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
361e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initSamplers() {
362e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        Sampler.Builder bs = new Sampler.Builder(mRS);
363e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setMinification(Sampler.Value.LINEAR);
364e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setMagnification(Sampler.Value.LINEAR);
365e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setWrapS(Sampler.Value.WRAP);
366e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setWrapT(Sampler.Value.WRAP);
367e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mLinearWrap = bs.create();
368e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
369e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mLinearClamp = Sampler.CLAMP_LINEAR(mRS);
370e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mNearestClamp = Sampler.CLAMP_NEAREST(mRS);
371e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS);
372e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
373e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs = new Sampler.Builder(mRS);
374e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setMinification(Sampler.Value.LINEAR_MIP_LINEAR);
375e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setMagnification(Sampler.Value.LINEAR);
376e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setWrapS(Sampler.Value.WRAP);
377e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setWrapT(Sampler.Value.WRAP);
378e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setAnisotropy(8.0f);
379e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMipLinearAniso8 = bs.create();
380e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        bs.setAnisotropy(15.0f);
381e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMipLinearAniso15 = bs.create();
382e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
383e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gLinearClamp(mLinearClamp);
384e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gLinearWrap(mLinearWrap);
385e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gMipLinearWrap(mMipLinearWrap);
386e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gMipLinearAniso8(mMipLinearAniso8);
387e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gMipLinearAniso15(mMipLinearAniso15);
388e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gNearestClamp(mNearestClamp);
389e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
390e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
391e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initProgramRaster() {
392e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mCullBack = ProgramRaster.CULL_BACK(mRS);
393e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mCullFront = ProgramRaster.CULL_FRONT(mRS);
394e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mCullNone = ProgramRaster.CULL_NONE(mRS);
395e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
396e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gCullBack(mCullBack);
397e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gCullFront(mCullFront);
398e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript.set_gCullNone(mCullNone);
399e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
400e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
401e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    private void initRS() {
402e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
403e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mScript = new ScriptC_rsrenderstates(mRS, mRes, R.raw.rsrenderstates);
404e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
405e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mMaxModes = mScript.get_gMaxModes();
406e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
407e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initSamplers();
408e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initProgramStore();
409e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initProgramFragment();
410e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initProgramVertex();
411e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initFonts();
412e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        loadImages();
413e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initMesh();
414e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initProgramRaster();
415e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        initCustomShaders();
416e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
417e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams        mRS.bindRootScript(mScript);
418e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams    }
419e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams}
420e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
421e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
422e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams
423