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