Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8e136dc authored by Romain Guy's avatar Romain Guy
Browse files

Use arrays in Grass RS

parent 838ffacd
Loading
Loading
Loading
Loading
+18 −19
Original line number Diff line number Diff line
@@ -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;
+6 −22
Original line number Diff line number Diff line
@@ -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() {
+7 −6
Original line number Diff line number Diff line
@@ -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,