Use arrays in Grass RS

This commit is contained in:
Romain Guy
2009-08-06 12:40:41 -07:00
parent 838ffacd2e
commit f8e136dcd0
3 changed files with 31 additions and 47 deletions

View File

@@ -72,42 +72,43 @@ void alpha(float a) {
}
void drawNight(int width, int height) {
bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_NIGHT));
bindTexture(NAMED_PFBackground, 0, NAMED_TNight);
drawRect(width - 512.0f, -32.0f, width, 1024.0f - 32.0f, 0.0f);
}
void drawSunrise(int width, int height) {
bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_SUNRISE));
bindTexture(NAMED_PFBackground, 0, NAMED_TSunrise);
drawRect(0.0f, 0.0f, width, height, 0.0f);
}
void drawNoon(int width, int height) {
bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_NOON));
bindTexture(NAMED_PFBackground, 0, NAMED_TSky);
drawRect(0.0f, 0.0f, width, height, 0.0f);
}
void drawSunset(int width, int height) {
bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_SUNSET));
bindTexture(NAMED_PFBackground, 0, NAMED_TSunset);
drawRect(0.0f, 0.0f, width, height, 0.0f);
}
void drawBlade(int index, float now, int frameCount) {
float offset = loadF(RSID_BLADES, index + BLADE_STRUCT_OFFSET);
float scale = loadF(RSID_BLADES, index + BLADE_STRUCT_SCALE);
float angle = loadF(RSID_BLADES, index + BLADE_STRUCT_ANGLE);
float hardness = loadF(RSID_BLADES, index + BLADE_STRUCT_HARDNESS);
float *bladeStruct = loadArrayF(RSID_BLADES, index);
float offset = bladeStruct[BLADE_STRUCT_OFFSET];
float scale = bladeStruct[BLADE_STRUCT_SCALE];
float angle = bladeStruct[BLADE_STRUCT_ANGLE];
float hardness = bladeStruct[BLADE_STRUCT_HARDNESS];
float xpos = loadF(RSID_BLADES, index + BLADE_STRUCT_XPOS);
float ypos = loadF(RSID_BLADES, index + BLADE_STRUCT_YPOS);
float xpos = bladeStruct[BLADE_STRUCT_XPOS];
float ypos = bladeStruct[BLADE_STRUCT_YPOS];
float lengthX = loadF(RSID_BLADES, index + BLADE_STRUCT_LENGTHX);
float lengthY = loadF(RSID_BLADES, index + BLADE_STRUCT_LENGTHY);
float lengthX = bladeStruct[BLADE_STRUCT_LENGTHX];
float lengthY = bladeStruct[BLADE_STRUCT_LENGTHY];
int size = loadF(RSID_BLADES, index + BLADE_STRUCT_SIZE);
int size = bladeStruct[BLADE_STRUCT_SIZE];
float h = loadF(RSID_BLADES, index + BLADE_STRUCT_H);
float s = loadF(RSID_BLADES, index + BLADE_STRUCT_S);
float b = loadF(RSID_BLADES, index + BLADE_STRUCT_B);
float h = bladeStruct[BLADE_STRUCT_H];
float s = bladeStruct[BLADE_STRUCT_S];
float b = bladeStruct[BLADE_STRUCT_B];
float newB = 1.0f;
if (now >= MIDNIGHT && now < MORNING) {
@@ -162,9 +163,7 @@ void drawBlade(int index, float now, int frameCount) {
void drawBlades(float now, int frameCount) {
// For anti-aliasing
bindProgramFragmentStore(NAMED_PFSGrass);
bindProgramFragment(NAMED_PFGrass);
bindTexture(NAMED_PFGrass, 0, loadI32(RSID_TEXTURES, RSID_GRASS_TEXTURE));
bindTexture(NAMED_PFBackground, 0, NAMED_TAa);
int bladesCount = loadI32(RSID_STATE, RSID_BLADES_COUNT);
int count = bladesCount * BLADE_STRUCT_FIELDS_COUNT;

View File

@@ -29,8 +29,6 @@ import android.renderscript.Allocation;
import android.renderscript.ProgramVertex;
import static android.renderscript.Element.*;
import static android.util.MathUtils.*;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.renderscript.ScriptC;
import android.renderscript.Type;
import android.renderscript.Dimension;
@@ -84,9 +82,6 @@ class GrassRS {
private Allocation mState;
private Allocation mBlades;
private ProgramFragment mPfGrass;
private ProgramStore mPfsGrass;
public GrassRS(int width, int height) {
mWidth = width;
mHeight = height;
@@ -111,8 +106,6 @@ class GrassRS {
}
mState.destroy();
mBlades.destroy();
mPfGrass.destroy();
mPfsGrass.destroy();
mTextureBufferIDs = null;
}
@@ -130,6 +123,7 @@ class GrassRS {
createProgramFragmentStore();
createProgramFragment();
createScriptStructures();
loadSkyTextures();
ScriptC.Builder sb = new ScriptC.Builder(mRS);
sb.setScript(mResources, R.raw.grass);
@@ -138,7 +132,6 @@ class GrassRS {
mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
mScript.setTimeZone(TimeZone.getDefault().getID());
loadSkyTextures();
mScript.bindAllocation(mState, RSID_STATE);
mScript.bindAllocation(mTexturesIDs, RSID_TEXTURES);
mScript.bindAllocation(mBlades, RSID_BLADES);
@@ -185,11 +178,11 @@ class GrassRS {
mTexturesIDs = Allocation.createSized(mRS, USER_FLOAT, TEXTURES_COUNT);
final Allocation[] textures = mTextures;
textures[0] = loadTexture(R.drawable.night, "night");
textures[1] = loadTexture(R.drawable.sunrise, "sunrise");
textures[2] = loadTexture(R.drawable.sky, "sky");
textures[3] = loadTexture(R.drawable.sunset, "sunset");
textures[4] = generateTextureAlpha(4, 1, new int[] { 0x00FFFF00 }, "aa");
textures[0] = loadTexture(R.drawable.night, "TNight");
textures[1] = loadTexture(R.drawable.sunrise, "TSunrise");
textures[2] = loadTexture(R.drawable.sky, "TSky");
textures[3] = loadTexture(R.drawable.sunset, "TSunset");
textures[4] = generateTextureAlpha(4, 1, new int[] { 0x00FFFF00 }, "TAa");
final int[] bufferIds = mTextureBufferIDs;
final int count = textures.length;
@@ -236,11 +229,6 @@ class GrassRS {
mPfBackground = b.create();
mPfBackground.setName("PFBackground");
mPfBackground.bindSampler(mSampler, 0);
b.setTexEnvMode(REPLACE, 0);
mPfGrass = b.create();
mPfGrass.setName("PFGrass");
mPfGrass.bindSampler(mSampler, 0);
}
private void createProgramFragmentStore() {
@@ -253,10 +241,6 @@ class GrassRS {
b.setDepthMask(false);
mPfsBackground = b.create();
mPfsBackground.setName("PFSBackground");
b.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
mPfsGrass = b.create();
mPfsGrass.setName("PFSGrass");
}
private void createProgramVertex() {

View File

@@ -59,22 +59,23 @@ static int32_t SC_loadI32(uint32_t bank, uint32_t offset)
return i[offset];
}
static float* SC_loadArrayF(uint32_t bank)
static float* SC_loadArrayF(uint32_t bank, uint32_t offset)
{
GET_TLS();
void *vp = sc->mSlots[bank]->getPtr();
float *f = static_cast<float *>(vp);
return f;
return f + offset;
}
static int32_t* SC_loadArrayI32(uint32_t bank)
static int32_t* SC_loadArrayI32(uint32_t bank, uint32_t offset)
{
GET_TLS();
void *vp = sc->mSlots[bank]->getPtr();
int32_t *i = static_cast<int32_t *>(vp);
return i;
return i + offset;
}
static uint32_t SC_loadU32(uint32_t bank, uint32_t offset)
{
GET_TLS();
@@ -695,9 +696,9 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
{ "loadF", (void *)&SC_loadF,
"float", "(int, int)" },
{ "loadArrayF", (void *)&SC_loadArrayF,
"float*", "(int)" },
"float*", "(int, int)" },
{ "loadArrayI32", (void *)&SC_loadArrayI32,
"int*", "(int)" },
"int*", "(int, int)" },
{ "loadVec4", (void *)&SC_loadVec4,
"void", "(int, int, float *)" },
{ "loadMatrix", (void *)&SC_loadMatrix,