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