blob: dd2daa78dd96abd1573f6c46494c4a9f6736ad1d [file] [log] [blame]
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.samples;
18
19import java.io.Writer;
20
21import android.content.res.Resources;
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -070022import android.graphics.Bitmap;
23import android.graphics.BitmapFactory;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070024import android.renderscript.*;
25import android.renderscript.ProgramStore.DepthFunc;
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -070026import android.renderscript.Sampler.Value;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070027import android.util.Log;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070028
29
30public class RsRenderStatesRS {
31
32 int mWidth;
33 int mHeight;
34
35 public RsRenderStatesRS() {
36 }
37
38 public void init(RenderScriptGL rs, Resources res, int width, int height) {
39 mRS = rs;
40 mRes = res;
41 mWidth = width;
42 mHeight = height;
43 mOptionsARGB.inScaled = false;
44 mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
45 mMode = 0;
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -080046 mMaxModes = 0;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070047 initRS();
48 }
49
50 private Resources mRes;
51 private RenderScriptGL mRS;
52
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -070053 private Sampler mLinearClamp;
54 private Sampler mLinearWrap;
55 private Sampler mMipLinearWrap;
56 private Sampler mNearestClamp;
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -070057 private Sampler mMipLinearAniso8;
58 private Sampler mMipLinearAniso15;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070059
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -070060 private ProgramStore mProgStoreBlendNoneDepth;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070061 private ProgramStore mProgStoreBlendNone;
62 private ProgramStore mProgStoreBlendAlpha;
63 private ProgramStore mProgStoreBlendAdd;
64
65 private ProgramFragment mProgFragmentTexture;
66 private ProgramFragment mProgFragmentColor;
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -070067
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070068 private ProgramVertex mProgVertex;
69 private ProgramVertex.MatrixAllocation mPVA;
70
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -070071 // Custom shaders
72 private ProgramVertex mProgVertexCustom;
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -070073 private ProgramFragment mProgFragmentCustom;
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -070074 private ProgramFragment mProgFragmentMultitex;
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -070075 private ScriptField_VertexShaderConstants_s mVSConst;
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -080076 private ScriptField_VertexShaderConstants2_s mVSConst2;
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -070077 private ScriptField_FragentShaderConstants_s mFSConst;
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -080078 private ScriptField_FragentShaderConstants2_s mFSConst2;
79
80 private ProgramVertex mProgVertexCustom2;
81 private ProgramFragment mProgFragmentCustom2;
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -070082
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -070083 private ProgramRaster mCullBack;
84 private ProgramRaster mCullFront;
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -070085 private ProgramRaster mCullNone;
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -070086
87 private Allocation mTexTorus;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070088 private Allocation mTexOpaque;
89 private Allocation mTexTransparent;
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -070090 private Allocation mTexChecker;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070091
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070092 private Mesh mMbyNMesh;
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -070093 private Mesh mTorus;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -070094
95 Font mFontSans;
96 Font mFontSerif;
97 Font mFontSerifBold;
98 Font mFontSerifItalic;
99 Font mFontSerifBoldItalic;
100 Font mFontMono;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700101 private Allocation mTextAlloc;
102
Stephen Hinesff1579a2010-09-16 17:18:55 -0700103 private ScriptC_rsrenderstates mScript;
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700104
105 private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
106
107 int mMode;
108 int mMaxModes;
109
110 public void onActionDown(int x, int y) {
111 mMode ++;
112 mMode = mMode % mMaxModes;
113 mScript.set_gDisplayMode(mMode);
114 }
115
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700116 private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) {
117
118 Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
119 2, Mesh.TriangleMeshBuilder.TEXTURE_0);
120
121 for (int y = 0; y <= hResolution; y++) {
122 final float normalizedY = (float)y / hResolution;
123 final float yOffset = (normalizedY - 0.5f) * height;
124 for (int x = 0; x <= wResolution; x++) {
125 float normalizedX = (float)x / wResolution;
126 float xOffset = (normalizedX - 0.5f) * width;
127 tmb.setTexture(normalizedX, normalizedY);
128 tmb.addVertex(xOffset, yOffset);
129 }
130 }
131
132 for (int y = 0; y < hResolution; y++) {
133 final int curY = y * (wResolution + 1);
134 final int belowY = (y + 1) * (wResolution + 1);
135 for (int x = 0; x < wResolution; x++) {
136 int curV = curY + x;
137 int belowV = belowY + x;
138 tmb.addTriangle(curV, belowV, curV + 1);
139 tmb.addTriangle(belowV, belowV + 1, curV + 1);
140 }
141 }
142
143 return tmb.create(true);
144 }
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700145
146 private void initProgramStore() {
147 // Use stock the stock program store object
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700148 mProgStoreBlendNoneDepth = ProgramStore.BLEND_NONE_DEPTH_TEST(mRS);
149 mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NO_DEPTH(mRS);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700150
151 // Create a custom program store
152 ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
153 builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
154 builder.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
155 ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
156 builder.setDitherEnable(false);
157 builder.setDepthMask(false);
158 mProgStoreBlendAlpha = builder.create();
159
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700160 mProgStoreBlendAdd = ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700161
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700162 mScript.set_gProgStoreBlendNoneDepth(mProgStoreBlendNoneDepth);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700163 mScript.set_gProgStoreBlendNone(mProgStoreBlendNone);
164 mScript.set_gProgStoreBlendAlpha(mProgStoreBlendAlpha);
165 mScript.set_gProgStoreBlendAdd(mProgStoreBlendAdd);
166 }
167
168 private void initProgramFragment() {
169
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700170 ProgramFragment.Builder texBuilder = new ProgramFragment.Builder(mRS);
171 texBuilder.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
172 ProgramFragment.Builder.Format.RGBA, 0);
173 mProgFragmentTexture = texBuilder.create();
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700174 mProgFragmentTexture.bindSampler(mLinearClamp, 0);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700175
176 ProgramFragment.Builder colBuilder = new ProgramFragment.Builder(mRS);
177 colBuilder.setVaryingColor(false);
178 mProgFragmentColor = colBuilder.create();
179
180 mScript.set_gProgFragmentColor(mProgFragmentColor);
181 mScript.set_gProgFragmentTexture(mProgFragmentTexture);
182 }
183
184 private void initProgramVertex() {
185 ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS);
186 mProgVertex = pvb.create();
187
188 mPVA = new ProgramVertex.MatrixAllocation(mRS);
189 mProgVertex.bindAllocation(mPVA);
190 mPVA.setupOrthoWindow(mWidth, mHeight);
191
192 mScript.set_gProgVertex(mProgVertex);
193 }
194
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700195 private void initCustomShaders() {
196 mVSConst = new ScriptField_VertexShaderConstants_s(mRS, 1);
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800197 mVSConst2 = new ScriptField_VertexShaderConstants2_s(mRS, 1);
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700198 mFSConst = new ScriptField_FragentShaderConstants_s(mRS, 1);
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800199 mFSConst2 = new ScriptField_FragentShaderConstants2_s(mRS, 1);
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700200
201 mScript.bind_gVSConstants(mVSConst);
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800202 mScript.bind_gVSConstants2(mVSConst2);
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700203 mScript.bind_gFSConstants(mFSConst);
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800204 mScript.bind_gFSConstants2(mFSConst2);
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700205
206 // Initialize the shader builder
207 ProgramVertex.ShaderBuilder pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
208 // Specify the resource that contains the shader string
209 pvbCustom.setShader(mRes, R.raw.shaderv);
210 // Use a script field to spcify the input layout
211 pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
212 // Define the constant input layout
213 pvbCustom.addConstant(mVSConst.getAllocation().getType());
214 mProgVertexCustom = pvbCustom.create();
215 // Bind the source of constant data
Alex Sakhartchouke7ae69f2010-09-14 09:50:43 -0700216 mProgVertexCustom.bindConstants(mVSConst.getAllocation(), 0);
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700217
218 ProgramFragment.ShaderBuilder pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
219 // Specify the resource that contains the shader string
220 pfbCustom.setShader(mRes, R.raw.shaderf);
221 //Tell the builder how many textures we have
222 pfbCustom.setTextureCount(1);
223 // Define the constant input layout
224 pfbCustom.addConstant(mFSConst.getAllocation().getType());
225 mProgFragmentCustom = pfbCustom.create();
226 // Bind the source of constant data
Alex Sakhartchouke7ae69f2010-09-14 09:50:43 -0700227 mProgFragmentCustom.bindConstants(mFSConst.getAllocation(), 0);
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700228
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800229 pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
230 pvbCustom.setShader(mRes, R.raw.shaderarrayv);
231 pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
232 pvbCustom.addConstant(mVSConst2.getAllocation().getType());
233 mProgVertexCustom2 = pvbCustom.create();
234 mProgVertexCustom2.bindConstants(mVSConst2.getAllocation(), 0);
235
236 pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
237 pfbCustom.setShader(mRes, R.raw.shaderarrayf);
238 pfbCustom.setTextureCount(1);
239 pfbCustom.addConstant(mFSConst2.getAllocation().getType());
240 mProgFragmentCustom2 = pfbCustom.create();
241 mProgFragmentCustom2.bindConstants(mFSConst2.getAllocation(), 0);
242
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700243 pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
244 pfbCustom.setShader(mRes, R.raw.multitexf);
245 pfbCustom.setTextureCount(3);
246 mProgFragmentMultitex = pfbCustom.create();
247
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700248 mScript.set_gProgVertexCustom(mProgVertexCustom);
249 mScript.set_gProgFragmentCustom(mProgFragmentCustom);
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700250 mScript.set_gProgFragmentMultitex(mProgFragmentMultitex);
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800251
252 mScript.set_gProgVertexCustom2(mProgVertexCustom2);
253 mScript.set_gProgFragmentCustom2(mProgFragmentCustom2);
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700254 }
255
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700256 private Allocation loadTextureRGB(int id) {
257 final Allocation allocation = Allocation.createFromBitmapResource(mRS, mRes,
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700258 id, Element.RGB_565(mRS), true);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700259 allocation.uploadToTexture(0);
260 return allocation;
261 }
262
263 private Allocation loadTextureARGB(int id) {
264 Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB);
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700265 final Allocation allocation = Allocation.createFromBitmap(mRS, b, Element.RGBA_8888(mRS), true);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700266 allocation.uploadToTexture(0);
267 return allocation;
268 }
269
270 private void loadImages() {
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700271 mTexTorus = loadTextureRGB(R.drawable.torusmap);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700272 mTexOpaque = loadTextureRGB(R.drawable.data);
273 mTexTransparent = loadTextureARGB(R.drawable.leaf);
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -0700274 mTexChecker = loadTextureRGB(R.drawable.checker);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700275
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700276 mScript.set_gTexTorus(mTexTorus);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700277 mScript.set_gTexOpaque(mTexOpaque);
278 mScript.set_gTexTransparent(mTexTransparent);
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -0700279 mScript.set_gTexChecker(mTexChecker);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700280 }
281
282 private void initFonts() {
283 // Sans font by family name
284 mFontSans = Font.createFromFamily(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
285 // Create font by file name
286 mFontSerif = Font.create(mRS, mRes, "DroidSerif-Regular.ttf", 8);
287 // Create fonts by family and style
288 mFontSerifBold = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD, 8);
289 mFontSerifItalic = Font.createFromFamily(mRS, mRes, "serif", Font.Style.ITALIC, 8);
290 mFontSerifBoldItalic = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
291 mFontMono = Font.createFromFamily(mRS, mRes, "mono", Font.Style.NORMAL, 8);
292
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700293 mTextAlloc = Allocation.createFromString(mRS, "String from allocation");
294
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700295 mScript.set_gFontSans(mFontSans);
296 mScript.set_gFontSerif(mFontSerif);
297 mScript.set_gFontSerifBold(mFontSerifBold);
298 mScript.set_gFontSerifItalic(mFontSerifItalic);
299 mScript.set_gFontSerifBoldItalic(mFontSerifBoldItalic);
300 mScript.set_gFontMono(mFontMono);
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700301 mScript.set_gTextAlloc(mTextAlloc);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700302 }
303
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700304 private void initMesh() {
305 mMbyNMesh = getMbyNMesh(256, 256, 10, 10);
306 mScript.set_gMbyNMesh(mMbyNMesh);
307
308 FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.torus);
309 FileA3D.IndexEntry entry = model.getIndexEntry(0);
310 if(entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
311 Log.e("rs", "could not load model");
312 }
313 else {
314 mTorus = (Mesh)entry.getObject();
315 mScript.set_gTorusMesh(mTorus);
316 }
317 }
318
319 private void initSamplers() {
320 Sampler.Builder bs = new Sampler.Builder(mRS);
321 bs.setMin(Sampler.Value.LINEAR);
322 bs.setMag(Sampler.Value.LINEAR);
323 bs.setWrapS(Sampler.Value.WRAP);
324 bs.setWrapT(Sampler.Value.WRAP);
325 mLinearWrap = bs.create();
326
327 mLinearClamp = Sampler.CLAMP_LINEAR(mRS);
328 mNearestClamp = Sampler.CLAMP_NEAREST(mRS);
329 mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS);
330
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -0700331 bs = new Sampler.Builder(mRS);
332 bs.setMin(Sampler.Value.LINEAR_MIP_LINEAR);
333 bs.setMag(Sampler.Value.LINEAR);
334 bs.setWrapS(Sampler.Value.WRAP);
335 bs.setWrapT(Sampler.Value.WRAP);
336 bs.setAnisotropy(8.0f);
337 mMipLinearAniso8 = bs.create();
338 bs.setAnisotropy(15.0f);
339 mMipLinearAniso15 = bs.create();
340
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700341 mScript.set_gLinearClamp(mLinearClamp);
342 mScript.set_gLinearWrap(mLinearWrap);
343 mScript.set_gMipLinearWrap(mMipLinearWrap);
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -0700344 mScript.set_gMipLinearAniso8(mMipLinearAniso8);
345 mScript.set_gMipLinearAniso15(mMipLinearAniso15);
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700346 mScript.set_gNearestClamp(mNearestClamp);
347 }
348
349 private void initProgramRaster() {
350 mCullBack = ProgramRaster.CULL_BACK(mRS);
351 mCullFront = ProgramRaster.CULL_FRONT(mRS);
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -0700352 mCullNone = ProgramRaster.CULL_NONE(mRS);
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700353
354 mScript.set_gCullBack(mCullBack);
355 mScript.set_gCullFront(mCullFront);
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -0700356 mScript.set_gCullNone(mCullNone);
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700357 }
358
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700359 private void initRS() {
360
Jason Samsa7756732010-11-03 23:01:38 -0700361 mScript = new ScriptC_rsrenderstates(mRS, mRes, R.raw.rsrenderstates);
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700362
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800363 mMaxModes = mScript.get_gMaxModes();
364
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700365 initSamplers();
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700366 initProgramStore();
367 initProgramFragment();
368 initProgramVertex();
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700369 initFonts();
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700370 loadImages();
Alex Sakhartchouk6e657c32010-08-24 11:37:33 -0700371 initMesh();
372 initProgramRaster();
Alex Sakhartchoukaf83e792010-08-27 16:10:55 -0700373 initCustomShaders();
Alex Sakhartchoukc8dc45c2010-08-23 10:24:10 -0700374
375 mRS.contextBindRootScript(mScript);
376 }
377}
378
379
380