blob: dad97e20417d26ddebf3a16c83d1e41f10bb8c69 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.shaderstest;
import android.content.res.Resources;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Element.DataKind;
import android.renderscript.Element.DataType;
import android.renderscript.FileA3D;
import android.renderscript.Mesh;
import android.renderscript.Program;
import android.renderscript.ProgramFragment;
import android.renderscript.ProgramFragmentFixedFunction;
import android.renderscript.ProgramStore;
import android.renderscript.ProgramStore.DepthFunc;
import android.renderscript.ProgramVertex;
import android.renderscript.ProgramVertexFixedFunction;
import android.renderscript.RSRuntimeException;
import android.renderscript.RenderScriptGL;
import android.renderscript.Sampler;
import android.renderscript.Type.Builder;
@SuppressWarnings({"FieldCanBeLocal"})
public class ShadersTestRS {
public ShadersTestRS() {
}
public void init(RenderScriptGL rs, Resources res) {
mRS = rs;
mRes = res;
initRS();
}
public void surfaceChanged() {
initBuffers(mRS.getWidth(), mRS.getHeight());
}
private Resources mRes;
private RenderScriptGL mRS;
private Sampler mLinearClamp;
private Sampler mNearestClamp;
private ProgramStore mPSBackground;
private ProgramFragment mPFBackground;
private ProgramVertex mPVBackground;
private ProgramVertexFixedFunction.Constants mPVA;
private ProgramFragment mPFVignette;
private ScriptField_VignetteConstants_s mFSVignetteConst;
private Allocation mMeshTexture;
private Allocation mScreen;
private Allocation mScreenDepth;
private ScriptField_MeshInfo mMeshes;
private ScriptC_shaderstest mScript;
public void onActionDown(float x, float y) {
mScript.invoke_onActionDown(x, y);
}
public void onActionScale(float scale) {
mScript.invoke_onActionScale(scale);
}
public void onActionMove(float x, float y) {
mScript.invoke_onActionMove(x, y);
}
private void initPFS() {
ProgramStore.Builder b = new ProgramStore.Builder(mRS);
b.setDepthFunc(DepthFunc.LESS);
b.setDitherEnabled(false);
b.setDepthMaskEnabled(true);
mPSBackground = b.create();
mScript.set_gPFSBackground(mPSBackground);
}
private void initPF() {
mLinearClamp = Sampler.CLAMP_LINEAR(mRS);
mScript.set_gLinear(mLinearClamp);
mNearestClamp = Sampler.CLAMP_NEAREST(mRS);
mScript.set_gNearest(mNearestClamp);
ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
mPFBackground = b.create();
mPFBackground.bindSampler(mLinearClamp, 0);
mScript.set_gPFBackground(mPFBackground);
mFSVignetteConst = new ScriptField_VignetteConstants_s(mRS, 1);
mScript.bind_gFSVignetteConstants(mFSVignetteConst);
ProgramFragment.Builder fs;
fs = new ProgramFragment.Builder(mRS);
fs.setShader(mRes, R.raw.vignette_fs);
fs.addConstant(mFSVignetteConst.getAllocation().getType());
fs.addTexture(Program.TextureType.TEXTURE_2D);
mPFVignette = fs.create();
mPFVignette.bindConstants(mFSVignetteConst.getAllocation(), 0);
mScript.set_gPFVignette(mPFVignette);
}
private void initPV() {
ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
mPVBackground = pvb.create();
mPVA = new ProgramVertexFixedFunction.Constants(mRS);
((ProgramVertexFixedFunction) mPVBackground).bindConstants(mPVA);
mScript.set_gPVBackground(mPVBackground);
}
private void loadImage() {
mMeshTexture = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
Allocation.USAGE_GRAPHICS_TEXTURE);
mScript.set_gTMesh(mMeshTexture);
}
private void initMeshes(FileA3D model) {
int numEntries = model.getIndexEntryCount();
int numMeshes = 0;
for (int i = 0; i < numEntries; i ++) {
FileA3D.IndexEntry entry = model.getIndexEntry(i);
if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) {
numMeshes ++;
}
}
if (numMeshes > 0) {
mMeshes = new ScriptField_MeshInfo(mRS, numMeshes);
for (int i = 0; i < numEntries; i ++) {
FileA3D.IndexEntry entry = model.getIndexEntry(i);
if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) {
Mesh mesh = entry.getMesh();
mMeshes.set_mMesh(i, mesh, false);
mMeshes.set_mNumIndexSets(i, mesh.getPrimitiveCount(), false);
}
}
mMeshes.copyAll();
} else {
throw new RSRuntimeException("No valid meshes in file");
}
mScript.bind_gMeshes(mMeshes);
mScript.invoke_updateMeshInfo();
}
private void initRS() {
mScript = new ScriptC_shaderstest(mRS, mRes, R.raw.shaderstest);
initPFS();
initPF();
initPV();
loadImage();
initBuffers(1, 1);
FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
initMeshes(model);
mRS.bindRootScript(mScript);
}
private void initBuffers(int width, int height) {
Builder b;
b = new Builder(mRS, Element.RGBA_8888(mRS));
b.setX(width).setY(height);
mScreen = Allocation.createTyped(mRS, b.create(),
Allocation.USAGE_GRAPHICS_TEXTURE | Allocation.USAGE_GRAPHICS_RENDER_TARGET);
mScript.set_gScreen(mScreen);
b = new Builder(mRS, Element.createPixel(mRS, DataType.UNSIGNED_16, DataKind.PIXEL_DEPTH));
b.setX(width).setY(height);
mScreenDepth = Allocation.createTyped(mRS, b.create(),
Allocation.USAGE_GRAPHICS_RENDER_TARGET);
mScript.set_gScreenDepth(mScreenDepth);
}
}