More work on the renderscript sample
Change-Id: Ib1812bbaa38180ca63d6d53c9cc3aeeee4134725
This commit is contained in:
@@ -67,17 +67,46 @@ public class ProgramRaster extends BaseObj {
|
||||
mRS.nProgramRasterSetCullMode(mID, m.mID);
|
||||
}
|
||||
|
||||
public static ProgramRaster CULL_BACK(RenderScript rs) {
|
||||
if(rs.mProgramRaster_CULL_BACK == null) {
|
||||
ProgramRaster.Builder builder = new ProgramRaster.Builder(rs);
|
||||
builder.setCullMode(CullMode.BACK);
|
||||
rs.mProgramRaster_CULL_BACK = builder.create();
|
||||
}
|
||||
return rs.mProgramRaster_CULL_BACK;
|
||||
}
|
||||
|
||||
public static ProgramRaster CULL_FRONT(RenderScript rs) {
|
||||
if(rs.mProgramRaster_CULL_FRONT == null) {
|
||||
ProgramRaster.Builder builder = new ProgramRaster.Builder(rs);
|
||||
builder.setCullMode(CullMode.FRONT);
|
||||
rs.mProgramRaster_CULL_FRONT = builder.create();
|
||||
}
|
||||
return rs.mProgramRaster_CULL_FRONT;
|
||||
}
|
||||
|
||||
public static ProgramRaster CULL_NONE(RenderScript rs) {
|
||||
if(rs.mProgramRaster_CULL_NONE == null) {
|
||||
ProgramRaster.Builder builder = new ProgramRaster.Builder(rs);
|
||||
builder.setCullMode(CullMode.NONE);
|
||||
rs.mProgramRaster_CULL_NONE = builder.create();
|
||||
}
|
||||
return rs.mProgramRaster_CULL_NONE;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
RenderScript mRS;
|
||||
boolean mPointSprite;
|
||||
boolean mPointSmooth;
|
||||
boolean mLineSmooth;
|
||||
CullMode mCullMode;
|
||||
|
||||
public Builder(RenderScript rs) {
|
||||
mRS = rs;
|
||||
mPointSmooth = false;
|
||||
mLineSmooth = false;
|
||||
mPointSprite = false;
|
||||
mCullMode = CullMode.BACK;
|
||||
}
|
||||
|
||||
public Builder setPointSpriteEnable(boolean enable) {
|
||||
@@ -95,9 +124,15 @@ public class ProgramRaster extends BaseObj {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCullMode(CullMode m) {
|
||||
mCullMode = m;
|
||||
return this;
|
||||
}
|
||||
|
||||
static synchronized ProgramRaster internalCreate(RenderScript rs, Builder b) {
|
||||
int id = rs.nProgramRasterCreate(b.mPointSmooth, b.mLineSmooth, b.mPointSprite);
|
||||
ProgramRaster pr = new ProgramRaster(id, rs);
|
||||
pr.setCullMode(b.mCullMode);
|
||||
return pr;
|
||||
}
|
||||
|
||||
|
||||
@@ -79,139 +79,139 @@ public class ProgramStore extends BaseObj {
|
||||
super(id, rs);
|
||||
}
|
||||
|
||||
public static ProgramStore BlendNone_DepthTest(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendNone_DepthTest == null) {
|
||||
public static ProgramStore BLEND_NONE_DEPTH_TEST(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_NONE_DEPTH_TEST == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(true);
|
||||
rs.mProgramStore_BlendNone_DepthTest = builder.create();
|
||||
rs.mProgramStore_BLEND_NONE_DEPTH_TEST = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendNone_DepthTest;
|
||||
return rs.mProgramStore_BLEND_NONE_DEPTH_TEST;
|
||||
}
|
||||
public static ProgramStore BlendNone_DepthNoDepth(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendNone_DepthNoDepth == null) {
|
||||
public static ProgramStore BLEND_NONE_DEPTH_NO_DEPTH(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(false);
|
||||
rs.mProgramStore_BlendNone_DepthNoDepth = builder.create();
|
||||
rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendNone_DepthNoDepth;
|
||||
return rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
|
||||
}
|
||||
public static ProgramStore BlendNone_DepthNoTest(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendNone_DepthNoTest == null) {
|
||||
public static ProgramStore BLEND_NONE_DEPTH_NO_TEST(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_TEST == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(true);
|
||||
rs.mProgramStore_BlendNone_DepthNoTest = builder.create();
|
||||
rs.mProgramStore_BLEND_NONE_DEPTH_NO_TEST = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendNone_DepthNoTest;
|
||||
return rs.mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
|
||||
}
|
||||
public static ProgramStore BlendNone_DepthNoWrite(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendNone_DepthNoWrite == null) {
|
||||
public static ProgramStore BLEND_NONE_DEPTH_NO_WRITE(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_WRITE == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(false);
|
||||
rs.mProgramStore_BlendNone_DepthNoWrite = builder.create();
|
||||
rs.mProgramStore_BLEND_NONE_DEPTH_NO_WRITE = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendNone_DepthNoWrite;
|
||||
return rs.mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
|
||||
}
|
||||
|
||||
public static ProgramStore BlendAlpha_DepthTest(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAlpha_DepthTest == null) {
|
||||
public static ProgramStore BLEND_ALPHA_DEPTH_TEST(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
||||
builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(true);
|
||||
rs.mProgramStore_BlendAlpha_DepthTest = builder.create();
|
||||
rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAlpha_DepthTest;
|
||||
return rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST;
|
||||
}
|
||||
public static ProgramStore BlendAlpha_DepthNoDepth(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAlpha_DepthNoDepth == null) {
|
||||
public static ProgramStore BLEND_ALPHA_DEPTH_NO_DEPTH(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
|
||||
builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(false);
|
||||
rs.mProgramStore_BlendAlpha_DepthNoDepth = builder.create();
|
||||
rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAlpha_DepthNoDepth;
|
||||
return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
|
||||
}
|
||||
public static ProgramStore BlendAlpha_DepthNoTest(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAlpha_DepthNoTest == null) {
|
||||
public static ProgramStore BLEND_ALPHA_DEPTH_NO_TEST(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
|
||||
builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(true);
|
||||
rs.mProgramStore_BlendAlpha_DepthNoTest = builder.create();
|
||||
rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAlpha_DepthNoTest;
|
||||
return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
|
||||
}
|
||||
public static ProgramStore BlendAlpha_DepthNoWrite(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAlpha_DepthNoWrite == null) {
|
||||
public static ProgramStore BLEND_ALPHA_DEPTH_NO_WRITE(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
||||
builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(false);
|
||||
rs.mProgramStore_BlendAlpha_DepthNoWrite = builder.create();
|
||||
rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAlpha_DepthNoWrite;
|
||||
return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
|
||||
}
|
||||
|
||||
public static ProgramStore BlendAdd_DepthTest(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAdd_DepthTest == null) {
|
||||
public static ProgramStore BLEND_ADD_DEPTH_TEST(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ADD_DEPTH_TEST == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(true);
|
||||
rs.mProgramStore_BlendAdd_DepthTest = builder.create();
|
||||
rs.mProgramStore_BLEND_ADD_DEPTH_TEST = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAdd_DepthTest;
|
||||
return rs.mProgramStore_BLEND_ADD_DEPTH_TEST;
|
||||
}
|
||||
public static ProgramStore BlendAdd_DepthNoDepth(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAdd_DepthNoDepth == null) {
|
||||
public static ProgramStore BLEND_ADD_DEPTH_NO_DEPTH(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(false);
|
||||
rs.mProgramStore_BlendAdd_DepthNoDepth = builder.create();
|
||||
rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAdd_DepthNoDepth;
|
||||
return rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
|
||||
}
|
||||
public static ProgramStore BlendAdd_DepthNoTest(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAdd_DepthNoTest == null) {
|
||||
public static ProgramStore BLEND_ADD_DEPTH_NO_TEST(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ADD_DEPTH_NO_TEST == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(true);
|
||||
rs.mProgramStore_BlendAdd_DepthNoDepth = builder.create();
|
||||
rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAdd_DepthNoTest;
|
||||
return rs.mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
|
||||
}
|
||||
public static ProgramStore BlendAdd_DepthNoWrite(RenderScript rs) {
|
||||
if(rs.mProgramStore_BlendAdd_DepthNoWrite == null) {
|
||||
public static ProgramStore BLEND_ADD_DEPTH_NO_WRITE(RenderScript rs) {
|
||||
if(rs.mProgramStore_BLEND_ADD_DEPTH_NO_WRITE == null) {
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
|
||||
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
|
||||
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
|
||||
builder.setDitherEnable(false);
|
||||
builder.setDepthMask(false);
|
||||
rs.mProgramStore_BlendAdd_DepthNoWrite = builder.create();
|
||||
rs.mProgramStore_BLEND_ADD_DEPTH_NO_WRITE = builder.create();
|
||||
}
|
||||
return rs.mProgramStore_BlendAdd_DepthNoWrite;
|
||||
return rs.mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
|
||||
@@ -549,19 +549,22 @@ public class RenderScript {
|
||||
Sampler mSampler_WRAP_LINEAR;
|
||||
Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
|
||||
|
||||
ProgramStore mProgramStore_BlendNone_DepthTest;
|
||||
ProgramStore mProgramStore_BlendNone_DepthNoDepth;
|
||||
ProgramStore mProgramStore_BlendNone_DepthNoTest;
|
||||
ProgramStore mProgramStore_BlendNone_DepthNoWrite;
|
||||
ProgramStore mProgramStore_BlendAlpha_DepthTest;
|
||||
ProgramStore mProgramStore_BlendAlpha_DepthNoDepth;
|
||||
ProgramStore mProgramStore_BlendAlpha_DepthNoTest;
|
||||
ProgramStore mProgramStore_BlendAlpha_DepthNoWrite;
|
||||
ProgramStore mProgramStore_BlendAdd_DepthTest;
|
||||
ProgramStore mProgramStore_BlendAdd_DepthNoDepth;
|
||||
ProgramStore mProgramStore_BlendAdd_DepthNoTest;
|
||||
ProgramStore mProgramStore_BlendAdd_DepthNoWrite;
|
||||
ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
|
||||
ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
|
||||
ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
|
||||
ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
|
||||
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
|
||||
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
|
||||
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
|
||||
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
|
||||
ProgramStore mProgramStore_BLEND_ADD_DEPTH_TEST;
|
||||
ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
|
||||
ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
|
||||
ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
|
||||
|
||||
ProgramRaster mProgramRaster_CULL_BACK;
|
||||
ProgramRaster mProgramRaster_CULL_FRONT;
|
||||
ProgramRaster mProgramRaster_CULL_NONE;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
@@ -78,7 +78,7 @@ public class Sampler extends BaseObj {
|
||||
if(rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
|
||||
Builder b = new Builder(rs);
|
||||
b.setMin(Value.LINEAR_MIP_LINEAR);
|
||||
b.setMag(Value.LINEAR_MIP_LINEAR);
|
||||
b.setMag(Value.LINEAR);
|
||||
b.setWrapS(Value.CLAMP);
|
||||
b.setWrapT(Value.CLAMP);
|
||||
rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
|
||||
@@ -114,7 +114,7 @@ public class Sampler extends BaseObj {
|
||||
if(rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
|
||||
Builder b = new Builder(rs);
|
||||
b.setMin(Value.LINEAR_MIP_LINEAR);
|
||||
b.setMag(Value.LINEAR_MIP_LINEAR);
|
||||
b.setMag(Value.LINEAR);
|
||||
b.setWrapS(Value.WRAP);
|
||||
b.setWrapT(Value.WRAP);
|
||||
rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
|
||||
|
||||
BIN
libs/rs/java/Samples/res/drawable/torusmap.png
Normal file
BIN
libs/rs/java/Samples/res/drawable/torusmap.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
BIN
libs/rs/java/Samples/res/raw/torus.a3d
Normal file
BIN
libs/rs/java/Samples/res/raw/torus.a3d
Normal file
Binary file not shown.
@@ -42,30 +42,40 @@ public class RsRenderStatesRS {
|
||||
mOptionsARGB.inScaled = false;
|
||||
mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
|
||||
mMode = 0;
|
||||
mMaxModes = 4;
|
||||
mMaxModes = 7;
|
||||
initRS();
|
||||
}
|
||||
|
||||
private Resources mRes;
|
||||
private RenderScriptGL mRS;
|
||||
|
||||
private Sampler mSampler;
|
||||
private Sampler mLinearClamp;
|
||||
private Sampler mLinearWrap;
|
||||
private Sampler mMipLinearWrap;
|
||||
private Sampler mNearestClamp;
|
||||
|
||||
private ProgramStore mProgStoreBlendNoneDepth;
|
||||
private ProgramStore mProgStoreBlendNone;
|
||||
private ProgramStore mProgStoreBlendAlpha;
|
||||
private ProgramStore mProgStoreBlendAdd;
|
||||
|
||||
private ProgramFragment mProgFragmentTexture;
|
||||
private ProgramFragment mProgFragmentColor;
|
||||
|
||||
private ProgramVertex mProgVertex;
|
||||
private ProgramVertex.MatrixAllocation mPVA;
|
||||
|
||||
private ProgramRaster mCullBack;
|
||||
private ProgramRaster mCullFront;
|
||||
|
||||
private Allocation mTexTorus;
|
||||
private Allocation mTexOpaque;
|
||||
private Allocation mTexTransparent;
|
||||
|
||||
private Allocation mAllocPV;
|
||||
|
||||
private Mesh mMbyNMesh;
|
||||
private Mesh mTorus;
|
||||
|
||||
Font mFontSans;
|
||||
Font mFontSerif;
|
||||
@@ -89,10 +99,40 @@ public class RsRenderStatesRS {
|
||||
mScript.set_gDisplayMode(mMode);
|
||||
}
|
||||
|
||||
private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) {
|
||||
|
||||
Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
|
||||
2, Mesh.TriangleMeshBuilder.TEXTURE_0);
|
||||
|
||||
for (int y = 0; y <= hResolution; y++) {
|
||||
final float normalizedY = (float)y / hResolution;
|
||||
final float yOffset = (normalizedY - 0.5f) * height;
|
||||
for (int x = 0; x <= wResolution; x++) {
|
||||
float normalizedX = (float)x / wResolution;
|
||||
float xOffset = (normalizedX - 0.5f) * width;
|
||||
tmb.setTexture(normalizedX, normalizedY);
|
||||
tmb.addVertex(xOffset, yOffset);
|
||||
}
|
||||
}
|
||||
|
||||
for (int y = 0; y < hResolution; y++) {
|
||||
final int curY = y * (wResolution + 1);
|
||||
final int belowY = (y + 1) * (wResolution + 1);
|
||||
for (int x = 0; x < wResolution; x++) {
|
||||
int curV = curY + x;
|
||||
int belowV = belowY + x;
|
||||
tmb.addTriangle(curV, belowV, curV + 1);
|
||||
tmb.addTriangle(belowV, belowV + 1, curV + 1);
|
||||
}
|
||||
}
|
||||
|
||||
return tmb.create(true);
|
||||
}
|
||||
|
||||
private void initProgramStore() {
|
||||
// Use stock the stock program store object
|
||||
mProgStoreBlendNone = ProgramStore.BlendNone_DepthNoDepth(mRS);
|
||||
mProgStoreBlendNoneDepth = ProgramStore.BLEND_NONE_DEPTH_TEST(mRS);
|
||||
mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NO_DEPTH(mRS);
|
||||
|
||||
// Create a custom program store
|
||||
ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
|
||||
@@ -103,8 +143,9 @@ public class RsRenderStatesRS {
|
||||
builder.setDepthMask(false);
|
||||
mProgStoreBlendAlpha = builder.create();
|
||||
|
||||
mProgStoreBlendAdd = ProgramStore.BlendAdd_DepthNoDepth(mRS);
|
||||
mProgStoreBlendAdd = ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS);
|
||||
|
||||
mScript.set_gProgStoreBlendNoneDepth(mProgStoreBlendNoneDepth);
|
||||
mScript.set_gProgStoreBlendNone(mProgStoreBlendNone);
|
||||
mScript.set_gProgStoreBlendAlpha(mProgStoreBlendAlpha);
|
||||
mScript.set_gProgStoreBlendAdd(mProgStoreBlendAdd);
|
||||
@@ -112,18 +153,11 @@ public class RsRenderStatesRS {
|
||||
|
||||
private void initProgramFragment() {
|
||||
|
||||
Sampler.Builder bs = new Sampler.Builder(mRS);
|
||||
bs.setMin(Sampler.Value.LINEAR);
|
||||
bs.setMag(Sampler.Value.LINEAR);
|
||||
bs.setWrapS(Sampler.Value.CLAMP);
|
||||
bs.setWrapT(Sampler.Value.CLAMP);
|
||||
mSampler = bs.create();
|
||||
|
||||
ProgramFragment.Builder texBuilder = new ProgramFragment.Builder(mRS);
|
||||
texBuilder.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
|
||||
ProgramFragment.Builder.Format.RGBA, 0);
|
||||
mProgFragmentTexture = texBuilder.create();
|
||||
mProgFragmentTexture.bindSampler(mSampler, 0);
|
||||
mProgFragmentTexture.bindSampler(mLinearClamp, 0);
|
||||
|
||||
ProgramFragment.Builder colBuilder = new ProgramFragment.Builder(mRS);
|
||||
colBuilder.setVaryingColor(false);
|
||||
@@ -146,22 +180,24 @@ public class RsRenderStatesRS {
|
||||
|
||||
private Allocation loadTextureRGB(int id) {
|
||||
final Allocation allocation = Allocation.createFromBitmapResource(mRS, mRes,
|
||||
id, Element.RGB_565(mRS), false);
|
||||
id, Element.RGB_565(mRS), true);
|
||||
allocation.uploadToTexture(0);
|
||||
return allocation;
|
||||
}
|
||||
|
||||
private Allocation loadTextureARGB(int id) {
|
||||
Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB);
|
||||
final Allocation allocation = Allocation.createFromBitmap(mRS, b, Element.RGBA_8888(mRS), false);
|
||||
final Allocation allocation = Allocation.createFromBitmap(mRS, b, Element.RGBA_8888(mRS), true);
|
||||
allocation.uploadToTexture(0);
|
||||
return allocation;
|
||||
}
|
||||
|
||||
private void loadImages() {
|
||||
mTexTorus = loadTextureRGB(R.drawable.torusmap);
|
||||
mTexOpaque = loadTextureRGB(R.drawable.data);
|
||||
mTexTransparent = loadTextureARGB(R.drawable.leaf);
|
||||
|
||||
mScript.set_gTexTorus(mTexTorus);
|
||||
mScript.set_gTexOpaque(mTexOpaque);
|
||||
mScript.set_gTexTransparent(mTexTransparent);
|
||||
}
|
||||
@@ -185,19 +221,59 @@ public class RsRenderStatesRS {
|
||||
mScript.set_gFontMono(mFontMono);
|
||||
}
|
||||
|
||||
private void initMesh() {
|
||||
mMbyNMesh = getMbyNMesh(256, 256, 10, 10);
|
||||
mScript.set_gMbyNMesh(mMbyNMesh);
|
||||
|
||||
FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.torus);
|
||||
FileA3D.IndexEntry entry = model.getIndexEntry(0);
|
||||
if(entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
|
||||
Log.e("rs", "could not load model");
|
||||
}
|
||||
else {
|
||||
mTorus = (Mesh)entry.getObject();
|
||||
mScript.set_gTorusMesh(mTorus);
|
||||
}
|
||||
}
|
||||
|
||||
private void initSamplers() {
|
||||
Sampler.Builder bs = new Sampler.Builder(mRS);
|
||||
bs.setMin(Sampler.Value.LINEAR);
|
||||
bs.setMag(Sampler.Value.LINEAR);
|
||||
bs.setWrapS(Sampler.Value.WRAP);
|
||||
bs.setWrapT(Sampler.Value.WRAP);
|
||||
mLinearWrap = bs.create();
|
||||
|
||||
mLinearClamp = Sampler.CLAMP_LINEAR(mRS);
|
||||
mNearestClamp = Sampler.CLAMP_NEAREST(mRS);
|
||||
mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS);
|
||||
|
||||
mScript.set_gLinearClamp(mLinearClamp);
|
||||
mScript.set_gLinearWrap(mLinearWrap);
|
||||
mScript.set_gMipLinearWrap(mMipLinearWrap);
|
||||
mScript.set_gNearestClamp(mNearestClamp);
|
||||
}
|
||||
|
||||
private void initProgramRaster() {
|
||||
mCullBack = ProgramRaster.CULL_BACK(mRS);
|
||||
mCullFront = ProgramRaster.CULL_FRONT(mRS);
|
||||
|
||||
mScript.set_gCullBack(mCullBack);
|
||||
mScript.set_gCullFront(mCullFront);
|
||||
}
|
||||
|
||||
private void initRS() {
|
||||
|
||||
mScript = new ScriptC_Rsrenderstates(mRS, mRes, R.raw.rsrenderstates, true);
|
||||
|
||||
initSamplers();
|
||||
initProgramStore();
|
||||
initProgramFragment();
|
||||
initProgramVertex();
|
||||
|
||||
initFonts();
|
||||
|
||||
loadImages();
|
||||
|
||||
|
||||
initMesh();
|
||||
initProgramRaster();
|
||||
|
||||
mRS.contextBindRootScript(mScript);
|
||||
}
|
||||
|
||||
@@ -22,14 +22,17 @@ rs_program_vertex gProgVertex;
|
||||
rs_program_fragment gProgFragmentColor;
|
||||
rs_program_fragment gProgFragmentTexture;
|
||||
|
||||
rs_program_store gProgStoreBlendNoneDepth;
|
||||
rs_program_store gProgStoreBlendNone;
|
||||
rs_program_store gProgStoreBlendAlpha;
|
||||
rs_program_store gProgStoreBlendAdd;
|
||||
|
||||
rs_allocation gTexOpaque;
|
||||
rs_allocation gTexTorus;
|
||||
rs_allocation gTexTransparent;
|
||||
|
||||
rs_mesh gMbyNMesh;
|
||||
rs_mesh gTorusMesh;
|
||||
|
||||
rs_font gFontSans;
|
||||
rs_font gFontSerif;
|
||||
@@ -40,11 +43,21 @@ rs_font gFontMono;
|
||||
|
||||
int gDisplayMode;
|
||||
|
||||
rs_sampler gLinearClamp;
|
||||
rs_sampler gLinearWrap;
|
||||
rs_sampler gMipLinearWrap;
|
||||
rs_sampler gNearestClamp;
|
||||
|
||||
rs_program_raster gCullBack;
|
||||
rs_program_raster gCullFront;
|
||||
|
||||
#pragma rs export_var(gProgVertex, gProgFragmentColor, gProgFragmentTexture)
|
||||
#pragma rs export_var(gProgStoreBlendNone, gProgStoreBlendAlpha, gProgStoreBlendAdd)
|
||||
#pragma rs export_var(gTexOpaque, gTexTransparent)
|
||||
#pragma rs export_var(gMbyNMesh)
|
||||
#pragma rs export_var(gProgStoreBlendNoneDepth, gProgStoreBlendNone, gProgStoreBlendAlpha, gProgStoreBlendAdd)
|
||||
#pragma rs export_var(gTexOpaque, gTexTorus, gTexTransparent)
|
||||
#pragma rs export_var(gMbyNMesh, gTorusMesh)
|
||||
#pragma rs export_var(gFontSans, gFontSerif, gFontSerifBold, gFontSerifItalic, gFontSerifBoldItalic, gFontMono)
|
||||
#pragma rs export_var(gLinearClamp, gLinearWrap, gMipLinearWrap, gNearestClamp)
|
||||
#pragma rs export_var(gCullBack, gCullFront)
|
||||
|
||||
//What we are showing
|
||||
#pragma rs export_var(gDisplayMode)
|
||||
@@ -78,9 +91,17 @@ void displayFontSamples() {
|
||||
rsgDrawText("Monospace font sample", 30, yPos);
|
||||
}
|
||||
|
||||
void displayShaderSamples() {
|
||||
void bindProgramVertexOrtho() {
|
||||
// Default vertex sahder
|
||||
rsgBindProgramVertex(gProgVertex);
|
||||
// Setup the projectioni matrix
|
||||
rs_matrix4x4 proj;
|
||||
rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -1,1);
|
||||
rsgProgramVertexLoadProjectionMatrix(&proj);
|
||||
}
|
||||
|
||||
void displayShaderSamples() {
|
||||
bindProgramVertexOrtho();
|
||||
rs_matrix4x4 matrix;
|
||||
rsMatrixLoadIdentity(&matrix);
|
||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
||||
@@ -88,24 +109,31 @@ void displayShaderSamples() {
|
||||
// Fragment shader with texture
|
||||
rsgBindProgramStore(gProgStoreBlendNone);
|
||||
rsgBindProgramFragment(gProgFragmentTexture);
|
||||
rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
|
||||
rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque);
|
||||
|
||||
rsgDrawQuadTexCoords(0, 0, 0, 0, 0,
|
||||
0, 256, 0, 0, 1,
|
||||
256, 256, 0, 1, 1,
|
||||
256, 0, 0, 1, 0);
|
||||
float startX = 0, startY = 0;
|
||||
float width = 256, height = 256;
|
||||
rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
|
||||
startX, startY + height, 0, 0, 1,
|
||||
startX + width, startY + height, 0, 1, 1,
|
||||
startX + width, startY, 0, 1, 0);
|
||||
|
||||
rsgDrawQuadTexCoords(200, 0, 0, 0, 0,
|
||||
200, 128, 0, 0, 1,
|
||||
328, 128, 0, 1, 1,
|
||||
328, 0, 0, 1, 0);
|
||||
startX = 200; startY = 0;
|
||||
width = 128; height = 128;
|
||||
rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
|
||||
startX, startY + height, 0, 0, 1,
|
||||
startX + width, startY + height, 0, 1, 1,
|
||||
startX + width, startY, 0, 1, 0);
|
||||
|
||||
rsgBindProgramStore(gProgStoreBlendAlpha);
|
||||
rsgBindTexture(gProgFragmentTexture, 0, gTexTransparent);
|
||||
rsgDrawQuadTexCoords(0, 200, 0, 0, 0,
|
||||
0, 328, 0, 0, 1,
|
||||
128, 328, 0, 1, 1,
|
||||
128, 200, 0, 1, 0);
|
||||
startX = 0; startY = 200;
|
||||
width = 128; height = 128;
|
||||
rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
|
||||
startX, startY + height, 0, 0, 1,
|
||||
startX + width, startY + height, 0, 1, 1,
|
||||
startX + width, startY, 0, 1, 0);
|
||||
|
||||
// Fragment program with simple color
|
||||
rsgBindProgramFragment(gProgFragmentColor);
|
||||
@@ -124,7 +152,7 @@ void displayShaderSamples() {
|
||||
void displayBlendingSamples() {
|
||||
int i;
|
||||
|
||||
rsgBindProgramVertex(gProgVertex);
|
||||
bindProgramVertexOrtho();
|
||||
rs_matrix4x4 matrix;
|
||||
rsMatrixLoadIdentity(&matrix);
|
||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
||||
@@ -168,11 +196,128 @@ void displayBlendingSamples() {
|
||||
}
|
||||
|
||||
void displayMeshSamples() {
|
||||
|
||||
bindProgramVertexOrtho();
|
||||
rs_matrix4x4 matrix;
|
||||
rsMatrixLoadTranslate(&matrix, 128, 128, 0);
|
||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
||||
|
||||
// Fragment shader with texture
|
||||
rsgBindProgramStore(gProgStoreBlendNone);
|
||||
rsgBindProgramFragment(gProgFragmentTexture);
|
||||
rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
|
||||
rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque);
|
||||
|
||||
rsgDrawMesh(gMbyNMesh);
|
||||
|
||||
rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rsgBindFont(gFontMono);
|
||||
rsgDrawText("User gen 10 by 10 grid mesh", 10, 250);
|
||||
}
|
||||
|
||||
void displayTextureSamplers() {
|
||||
|
||||
bindProgramVertexOrtho();
|
||||
rs_matrix4x4 matrix;
|
||||
rsMatrixLoadIdentity(&matrix);
|
||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
||||
|
||||
// Fragment shader with texture
|
||||
rsgBindProgramStore(gProgStoreBlendNone);
|
||||
rsgBindProgramFragment(gProgFragmentTexture);
|
||||
rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque);
|
||||
|
||||
// Linear clamp
|
||||
rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
|
||||
float startX = 0, startY = 0;
|
||||
float width = 300, height = 300;
|
||||
rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
|
||||
startX, startY + height, 0, 0, 1.1,
|
||||
startX + width, startY + height, 0, 1.1, 1.1,
|
||||
startX + width, startY, 0, 1.1, 0);
|
||||
|
||||
// Linear Wrap
|
||||
rsgBindSampler(gProgFragmentTexture, 0, gLinearWrap);
|
||||
startX = 0; startY = 300;
|
||||
width = 300; height = 300;
|
||||
rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
|
||||
startX, startY + height, 0, 0, 1.1,
|
||||
startX + width, startY + height, 0, 1.1, 1.1,
|
||||
startX + width, startY, 0, 1.1, 0);
|
||||
|
||||
// Nearest
|
||||
rsgBindSampler(gProgFragmentTexture, 0, gNearestClamp);
|
||||
startX = 300; startY = 0;
|
||||
width = 300; height = 300;
|
||||
rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
|
||||
startX, startY + height, 0, 0, 1.1,
|
||||
startX + width, startY + height, 0, 1.1, 1.1,
|
||||
startX + width, startY, 0, 1.1, 0);
|
||||
|
||||
rsgBindSampler(gProgFragmentTexture, 0, gMipLinearWrap);
|
||||
startX = 300; startY = 300;
|
||||
width = 300; height = 300;
|
||||
rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
|
||||
startX, startY + height, 0, 0, 1.5,
|
||||
startX + width, startY + height, 0, 1.5, 1.5,
|
||||
startX + width, startY, 0, 1.5, 0);
|
||||
|
||||
|
||||
rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rsgBindFont(gFontMono);
|
||||
rsgDrawText("Filtering: linear clamp", 10, 290);
|
||||
rsgDrawText("Filtering: linear wrap", 10, 590);
|
||||
rsgDrawText("Filtering: nearest clamp", 310, 290);
|
||||
rsgDrawText("Filtering: miplinear wrap", 310, 590);
|
||||
|
||||
}
|
||||
|
||||
float gTorusRotation = 0;
|
||||
|
||||
void displayCullingSamplers() {
|
||||
rsgBindProgramVertex(gProgVertex);
|
||||
// Setup the projectioni matrix with 60 degree field of view
|
||||
rs_matrix4x4 proj;
|
||||
float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
|
||||
rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f);
|
||||
rsgProgramVertexLoadProjectionMatrix(&proj);
|
||||
|
||||
// Fragment shader with texture
|
||||
rsgBindProgramStore(gProgStoreBlendNoneDepth);
|
||||
rsgBindProgramFragment(gProgFragmentTexture);
|
||||
rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
|
||||
rsgBindTexture(gProgFragmentTexture, 0, gTexTorus);
|
||||
|
||||
// Aplly a rotation to our mesh
|
||||
gTorusRotation += 50.0f * rsGetDt();
|
||||
if(gTorusRotation > 360.0f) {
|
||||
gTorusRotation -= 360.0f;
|
||||
}
|
||||
|
||||
rs_matrix4x4 matrix;
|
||||
// Position our model on the screen
|
||||
rsMatrixLoadTranslate(&matrix, -2.0f, 0.0f, -10.0f);
|
||||
rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
|
||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
||||
// Use front face culling
|
||||
rsgBindProgramRaster(gCullFront);
|
||||
rsgDrawMesh(gTorusMesh);
|
||||
|
||||
rsMatrixLoadTranslate(&matrix, 2.0f, 0.0f, -10.0f);
|
||||
rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
|
||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
||||
// Use back face culling
|
||||
rsgBindProgramRaster(gCullBack);
|
||||
rsgDrawMesh(gTorusMesh);
|
||||
|
||||
rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rsgBindFont(gFontMono);
|
||||
rsgDrawText("Displaying mesh front/back face culling", 10, rsgGetHeight() - 10);
|
||||
}
|
||||
|
||||
int root(int launchID) {
|
||||
|
||||
rsgClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rsgClearColor(0.2f, 0.2f, 0.2f, 0.0f);
|
||||
rsgClearDepth(1.0f);
|
||||
|
||||
switch(gDisplayMode) {
|
||||
@@ -188,6 +333,12 @@ int root(int launchID) {
|
||||
case 3:
|
||||
displayMeshSamples();
|
||||
break;
|
||||
case 4:
|
||||
displayTextureSamplers();
|
||||
break;
|
||||
case 5:
|
||||
displayCullingSamplers();
|
||||
break;
|
||||
}
|
||||
|
||||
return 10;
|
||||
|
||||
Reference in New Issue
Block a user