126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski/*
226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * Copyright (C) 2010 The Android Open Source Project
326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski *
426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * you may not use this file except in compliance with the License.
626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * You may obtain a copy of the License at
726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski *
826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski *
1026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * Unless required by applicable law or agreed to in writing, software
1126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * See the License for the specific language governing permissions and
1426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * limitations under the License.
1526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski */
1626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
1726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskipackage com.android.wallpaper.holospiral;
1826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
1926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport com.android.wallpaper.holospiral.ScriptC_holo_spiral;
2026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport com.android.wallpaper.holospiral.ScriptField_VertexColor_s;
2126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport com.android.wallpaper.holospiral.ScriptField_VertexShaderConstants_s;
2226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
2326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.content.res.Resources;
2426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.graphics.Bitmap;
2526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.graphics.BitmapFactory;
2626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.graphics.Color;
2726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.os.Bundle;
2826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.Allocation;
2926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.Element;
3026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.Float3;
3126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.Float4;
3226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.Mesh;
33821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchoukimport android.renderscript.Mesh.Primitive;
34821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchoukimport android.renderscript.Program;
3526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.ProgramFragment;
3626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.ProgramStore;
3726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.ProgramVertex;
3826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.RenderScriptGL;
3926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.Sampler;
4026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
4126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskipublic class HoloSpiralRS {
4226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final String LOG_TAG = "HoloSpiralRS";
4326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float MAX_POINT_SIZE = 75.0f;
4426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float NEAR_PLANE = 1.0f;
4526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float FAR_PLANE = 55.0f;
4626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
4726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final int NUM_INNER_POINTS = 100;
4826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float INNER_SPIRAL_DEPTH = 50.0f;
4926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float INNER_RADIUS = 5.0f;
5026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float INNER_SEPARATION_DEG = 23.0f;
5126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
5226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final int NUM_OUTER_POINTS = 50;
5326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float OUTER_SPIRAL_DEPTH = 30.0f;
5426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float OUTER_RADIUS = 10.0f;
5526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final float OUTER_SEPARATION_DEG = 23.0f;
5626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
5726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    /* Colors */
5826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static final int POINTS_COLOR_BLUE = Color.argb(179, 0, 0, 255);
59ccca8a7d97be8bb9892c444a3ebd02c34a6af6faAdam Powell    private static final int POINTS_COLOR_GREEN = Color.argb(210, 166, 51, 255);
60ccca8a7d97be8bb9892c444a3ebd02c34a6af6faAdam Powell    private static final int POINTS_COLOR_AQUA = Color.argb(220, 38, 120, 148);
61ccca8a7d97be8bb9892c444a3ebd02c34a6af6faAdam Powell    private static final int BG_COLOR_BLACK = Color.argb(255, 26, 26, 83);
62ccca8a7d97be8bb9892c444a3ebd02c34a6af6faAdam Powell    private static final int BG_COLOR_BLUE = Color.argb(255, 8, 0, 26);
6326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
6426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private ScriptC_holo_spiral mScript;
6526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private RenderScriptGL mRS = null;
6626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private Resources mResources = null;
6726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
6826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    public HoloSpiralRS(RenderScriptGL renderer, Resources resources) {
6926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        init(renderer, resources);
7026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
7126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
7226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    public void init(RenderScriptGL renderer, Resources resources) {
7326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mRS = renderer;
7426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mResources = resources;
7526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        createScript();
7626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
7726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
7826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    public void setOffset(float xOffset, float yOffset, int xPixels, int yPixels) {
7926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gXOffset(xOffset);
8026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
8126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
8226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    public Bundle onCommand(String action, int x, int y, int z, Bundle extras,
8326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            boolean resultRequested) {
8426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        return null;
8526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
8626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
8726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    public void start() {
88213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams        mRS.bindRootScript(mScript);
8926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
9026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
9126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    public void stop() {
92213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams        mRS.bindRootScript(null);
9326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
9426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
9526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    public void resize(int width, int height) {
9626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.invoke_resize(width, height);
9726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
9826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
9926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void createScript() {
100213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams        mScript = new ScriptC_holo_spiral(mRS, mResources, R.raw.holo_spiral);
10126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gNearPlane(NEAR_PLANE);
10226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gFarPlane(FAR_PLANE);
10326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
10426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        createVertexPrograms();
10526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        createFragmentPrograms();
10626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        createStorePrograms();
10726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
10826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        createPointGeometry();
10926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        createBackgroundMesh();
11026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        createTextures();
11126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
11226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
11326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void createVertexPrograms() {
11426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ScriptField_VertexShaderConstants_s vertexShaderConstants =
11526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                new ScriptField_VertexShaderConstants_s(mRS, 1);
11626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.bind_gVSConstants(vertexShaderConstants);
11726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        vertexShaderConstants.set_maxPointSize(0, MAX_POINT_SIZE, false);
11826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        vertexShaderConstants.copyAll();
11926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
120821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        ProgramVertex.Builder backgroundBuilder = new ProgramVertex.Builder(mRS);
12126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        backgroundBuilder.setShader(mResources, R.raw.vertex_background);
12226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        backgroundBuilder.addInput(ScriptField_VertexColor_s.createElement(mRS));
12326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ProgramVertex programVertexBackground = backgroundBuilder.create();
12426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gPVBackground(programVertexBackground);
12526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
126821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        ProgramVertex.Builder geometryBuilder = new ProgramVertex.Builder(mRS);
12726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        geometryBuilder.setShader(mResources, R.raw.vertex_geometry);
12826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        geometryBuilder.addConstant(vertexShaderConstants.getAllocation().getType());
12926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        geometryBuilder.addInput(ScriptField_VertexColor_s.createElement(mRS));
13026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ProgramVertex programVertexGeometry = geometryBuilder.create();
13126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        programVertexGeometry.bindConstants(vertexShaderConstants.getAllocation(), 0);
13226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gPVGeometry(programVertexGeometry);
13326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
13426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
13526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void createFragmentPrograms() {
136821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        ProgramFragment.Builder backgroundBuilder = new ProgramFragment.Builder(mRS);
13726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        backgroundBuilder.setShader(mResources, R.raw.fragment_background);
13826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ProgramFragment programFragmentBackground = backgroundBuilder.create();
13926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gPFBackground(programFragmentBackground);
14026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
141821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        ProgramFragment.Builder geometryBuilder = new ProgramFragment.Builder(mRS);
14226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        geometryBuilder.setShader(mResources, R.raw.fragment_geometry);
143821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        geometryBuilder.addTexture(Program.TextureType.TEXTURE_2D);
14426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ProgramFragment programFragmentGeometry = geometryBuilder.create();
14526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        programFragmentGeometry.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
14626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gPFGeometry(programFragmentGeometry);
14726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
14826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
14926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void createStorePrograms() {
15026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
15126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        builder.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
15226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
15326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gPSGeometry(builder.create());
15426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ZERO);
155821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        builder.setDitherEnabled(true);
15626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gPSBackground(builder.create());
15726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
15826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
15926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void createPointGeometry() {
16026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ScriptField_VertexColor_s innerPoints =
16126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                new ScriptField_VertexColor_s(mRS, NUM_INNER_POINTS);
16226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        generateSpiral(innerPoints, INNER_SPIRAL_DEPTH, INNER_RADIUS, INNER_SEPARATION_DEG,
16326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                POINTS_COLOR_BLUE, POINTS_COLOR_GREEN);
16426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
16526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Mesh.AllocationBuilder innerPointBuilder = new Mesh.AllocationBuilder(mRS);
166821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        innerPointBuilder.addIndexSetType(Primitive.POINT);
16726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        innerPointBuilder.addVertexAllocation(innerPoints.getAllocation());
16826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gInnerGeometry(innerPointBuilder.create());
16926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
17026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ScriptField_VertexColor_s outerPoints =
17126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                new ScriptField_VertexColor_s(mRS, NUM_OUTER_POINTS);
17226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        generateSpiral(outerPoints, OUTER_SPIRAL_DEPTH, OUTER_RADIUS, OUTER_SEPARATION_DEG,
17326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                POINTS_COLOR_AQUA, POINTS_COLOR_AQUA);
17426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
17526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Mesh.AllocationBuilder outerPointBuilder = new Mesh.AllocationBuilder(mRS);
176821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        outerPointBuilder.addIndexSetType(Primitive.POINT);
17726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        outerPointBuilder.addVertexAllocation(outerPoints.getAllocation());
17826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gOuterGeometry(outerPointBuilder.create());
17926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
18026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
18126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void createTextures() {
18226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Bitmap bmp = BitmapFactory.decodeResource(
18326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                mResources, R.drawable.points_red_green, null);
1843991d3acf66152d8077a2b9d24773edac68f8df3Jason Sams        Allocation pointTexture = Allocation.createFromBitmap(mRS, bmp);
18526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gPointTexture(pointTexture);
18626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
18726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
18826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void createBackgroundMesh() {
18926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        ScriptField_VertexColor_s fullQuad = new ScriptField_VertexColor_s(mRS, 4);
19026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
19126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Float3 topLeft = new Float3(-1.0f, 1.0f, 0.0f);
19226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Float3 bottomLeft = new Float3(-1.0f, -1.0f, 0.0f);
19326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Float3 topRight = new Float3(1.0f, 1.0f, 0.0f);
19426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Float3 bottomRight = new Float3(1.0f, -1.0f, 0.0f);
19526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
19626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_position(0, topLeft, false);
19726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_color(0, convertColor(BG_COLOR_BLUE), false);
19826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
19926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_position(1, bottomLeft, false);
20026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_color(1, convertColor(BG_COLOR_BLACK), false);
20126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
20226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_position(2, topRight, false);
20326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_color(2, convertColor(BG_COLOR_BLUE), false);
20426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
20526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_position(3, bottomRight, false);
20626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.set_color(3, convertColor(BG_COLOR_BLACK), false);
20726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
20826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        fullQuad.copyAll();
20926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
21026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Mesh.AllocationBuilder backgroundBuilder = new Mesh.AllocationBuilder(mRS);
211821e2ed77fe845721345877ffa4313bef26bf5f6Alex Sakhartchouk        backgroundBuilder.addIndexSetType(Primitive.TRIANGLE_STRIP);
21226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        backgroundBuilder.addVertexAllocation(fullQuad.getAllocation());
21326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        mScript.set_gBackgroundMesh(backgroundBuilder.create());
21426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
21526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
21626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private void generateSpiral(ScriptField_VertexColor_s points, float depth, float radius,
21726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            float separationDegrees, int primaryColor, int secondaryColor) {
21826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
21926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        float separationRads = (separationDegrees / 360.0f) * 2 * (float) Math.PI;
22026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        int size = points.getAllocation().getType().getX();
22126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
22226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        float halfDepth = depth / 2.0f;
22326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        float radians = 0.0f;
22426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
22526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Float4 primary = convertColor(primaryColor);
22626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        Float4 secondary = convertColor(secondaryColor);
22726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
22826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        for (int i = 0; i < size; i++) {
22926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            float percentage = (float) i / (float) size;
23026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            Float3 position = new Float3(radius * (float) Math.cos(radians),
23126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski                    radius * (float) Math.sin(radians), (percentage * depth) - halfDepth);
23226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
23326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            float r = (float) Math.sin(radians / 2.0f);
23426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
23526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            Float4 color = new Float4();
23626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            color.x = primary.x + ((secondary.x - primary.x) * r);
23726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            color.y = primary.y + ((secondary.y - primary.y) * r);
23826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            color.z = primary.z + ((secondary.z - primary.z) * r);
23926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            color.w = primary.w + ((secondary.w - primary.w) * r);
24026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
24126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            points.set_position(i, position, false);
24226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            points.set_color(i, color, false);
24326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
24426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            radians += separationRads;
24526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            int multiplier = (int) (radians / (2.0f * (float) Math.PI));
24626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski            radians -= multiplier * 2.0f * (float) Math.PI;
24726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        }
24826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
24926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        points.copyAll();
25026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
25126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski
25226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    private static Float4 convertColor(int color) {
25326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        float red = Color.red(color) / 255.0f;
25426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        float green = Color.green(color) / 255.0f;
25526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        float blue = Color.blue(color) / 255.0f;
25626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        float alpha = Color.alpha(color) / 255.0f;
25726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski        return new Float4(red, green, blue, alpha);
25826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski    }
25926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski}
260