diff options
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/magicsmoke/MagicSmokeRS.java | 137 | ||||
-rw-r--r-- | src/com/android/magicsmoke/RenderScriptScene.java | 13 | ||||
-rw-r--r-- | src/com/android/magicsmoke/RenderScriptWallpaper.java | 22 | ||||
-rw-r--r-- | src/com/android/magicsmoke/clouds.rs | 352 |
4 files changed, 450 insertions, 74 deletions
diff --git a/src/com/android/magicsmoke/MagicSmokeRS.java b/src/com/android/magicsmoke/MagicSmokeRS.java index f11b704..6183ec3 100644 --- a/src/com/android/magicsmoke/MagicSmokeRS.java +++ b/src/com/android/magicsmoke/MagicSmokeRS.java @@ -38,13 +38,13 @@ import android.renderscript.ProgramStore; import android.renderscript.ProgramVertex; import android.renderscript.Sampler; import android.renderscript.ScriptC; -import android.renderscript.SimpleMesh; import android.renderscript.Type; import android.renderscript.Element.Builder; import android.renderscript.ProgramStore.BlendDstFunc; import android.renderscript.ProgramStore.BlendSrcFunc; import android.util.Log; import android.view.MotionEvent; +import android.os.Bundle; import java.util.TimeZone; @@ -66,8 +66,8 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange public int mBlendFunc; } WorldState mWorldState = new WorldState(); - private Type mStateType; - private Allocation mState; + //private Type mStateType; + //private Allocation mState; private ProgramStore mPfsBackgroundOne; private ProgramStore mPfsBackgroundSrc; @@ -76,6 +76,8 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange private Allocation[] mSourceTextures; private Allocation[] mRealTextures; + private ScriptC_clouds mScript; + private ProgramVertex mPVBackground; private ProgramVertex.MatrixAllocation mPVAlloc; @@ -161,7 +163,6 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { makeNewState(); - mState.data(mWorldState); } void makeNewState() { @@ -180,6 +181,20 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange mWorldState.mAlphaMul = mPreset[p].mAlphaMul; mWorldState.mPreMul = mPreset[p].mPreMul ? 1 : 0; mWorldState.mBlendFunc = mPreset[p].mBlendFunc; + + if(mScript != null) { + mScript.set_gPreset(mWorldState.mPreset); + mScript.set_gTextureMask(mWorldState.mTextureMask); + mScript.set_gRotate(mWorldState.mRotate); + mScript.set_gTextureSwap(mWorldState.mTextureSwap); + mScript.set_gProcessTextureMode(mWorldState.mProcessTextureMode); + mScript.set_gBackCol(mWorldState.mBackCol); + mScript.set_gLowCol(mWorldState.mLowCol); + mScript.set_gHighCol(mWorldState.mHighCol); + mScript.set_gAlphaMul(mWorldState.mAlphaMul); + mScript.set_gPreMul(mWorldState.mPreMul); + mScript.set_gBlendFunc(mWorldState.mBlendFunc); + } } @Override @@ -191,6 +206,18 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange } @Override + public Bundle onCommand(String action, int x, int y, int z, Bundle extras, + boolean resultRequested) { + + if ("android.wallpaper.tap".equals(action)) { + mTouchY = y; + } + mWorldState.mTilt = 0; + mScript.set_gTilt(mWorldState.mTilt); + return null; + } + + /*@Override public void onTouchEvent(MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: @@ -207,16 +234,16 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange dy = -4; } mWorldState.mTilt = dy; - mState.data(mWorldState); + mScript.set_gTilt(mWorldState.mTilt); + //mState.data(mWorldState); } - } + }*/ @Override - public void setOffset(float xOffset, float yOffset, float xStep, float yStep, - int xPixels, int yPixels) { + public void setOffset(float xOffset, float yOffset, int xPixels, int yPixels) { // update our state, then push it to the renderscript mWorldState.mXOffset = xOffset; - mState.data(mWorldState); + mScript.set_gXOffset(mWorldState.mXOffset); } @Override @@ -230,7 +257,6 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange super.start(); mSharedPref.registerOnSharedPreferenceChangeListener(this); makeNewState(); - mState.data(mWorldState); } float alphafactor; @@ -245,9 +271,7 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange in.getPixels(pixels, 0, 256, 0, 0, 256, 256); mRealTextures[index] = Allocation.createTyped(mRS, mTextureType); mSourceTextures[index] = Allocation.createTyped(mRS, mTextureType); - mSourceTextures[index].setName(name+"_src"); mSourceTextures[index].data(pixels); - mRealTextures[index].setName(name); in.recycle(); } @@ -265,27 +289,40 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange loadBitmap(R.drawable.noise3, 2, "Tnoise3", alphamul, lowcol, highcol); loadBitmap(R.drawable.noise4, 3, "Tnoise4", alphamul, lowcol, highcol); loadBitmap(R.drawable.noise5, 4, "Tnoise5", alphamul, lowcol, highcol); + + mScript.set_gTnoise1(mRealTextures[0]); + mScript.set_gTnoise2(mRealTextures[1]); + mScript.set_gTnoise3(mRealTextures[2]); + mScript.set_gTnoise4(mRealTextures[3]); + mScript.set_gTnoise5(mRealTextures[4]); + + mScript.bind_gNoisesrc1(mSourceTextures[0]); + mScript.bind_gNoisesrc2(mSourceTextures[1]); + mScript.bind_gNoisesrc3(mSourceTextures[2]); + mScript.bind_gNoisesrc4(mSourceTextures[3]); + mScript.bind_gNoisesrc5(mSourceTextures[4]); + + mScript.bind_gNoisedst1(mRealTextures[0]); + mScript.bind_gNoisedst2(mRealTextures[1]); + mScript.bind_gNoisedst3(mRealTextures[2]); + mScript.bind_gNoisedst4(mRealTextures[3]); + mScript.bind_gNoisedst5(mRealTextures[4]); } @Override protected ScriptC createScript() { - // Create a renderscript type from a java class. The specified name doesn't - // really matter; the name by which we refer to the object in RenderScript - // will be specified later. - mStateType = Type.createFromClass(mRS, WorldState.class, 1, "WorldState"); - // Create an allocation from the type we just created. - mState = Allocation.createTyped(mRS, mStateType); - mState.data(mWorldState); + mScript = new ScriptC_clouds(mRS, mResources, R.raw.clouds, true); // First set up the coordinate system and such ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null); mPVBackground = pvb.create(); - mPVBackground.setName("PVBackground"); mPVAlloc = new ProgramVertex.MatrixAllocation(mRS); mPVBackground.bindAllocation(mPVAlloc); mPVAlloc.setupProjectionNormalized(mWidth, mHeight); + mScript.set_gPVBackground(mPVBackground); + mSourceTextures = new Allocation[5]; mRealTextures = new Allocation[5]; @@ -307,10 +344,11 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange builder.setTexture(ProgramFragment.Builder.EnvMode.REPLACE, ProgramFragment.Builder.Format.RGBA, 0); mPfBackground = builder.create(); - mPfBackground.setName("PFBackground"); mPfBackground.bindSampler(mSampler, 0); } + mScript.set_gPFBackground(mPfBackground); + { ProgramStore.Builder builder = new ProgramStore.Builder(mRS, null, null); builder.setDepthFunc(ProgramStore.DepthFunc.EQUAL); @@ -318,48 +356,27 @@ class MagicSmokeRS extends RenderScriptScene implements OnSharedPreferenceChange builder.setDitherEnable(true); // without dithering there is severe banding builder.setDepthMask(false); mPfsBackgroundOne = builder.create(); - mPfsBackgroundOne.setName("PFSBackgroundOne"); builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA); mPfsBackgroundSrc = builder.create(); - mPfsBackgroundSrc.setName("PFSBackgroundSrc"); } - // Time to create the script - ScriptC.Builder sb = new ScriptC.Builder(mRS); - // Specify the name by which to refer to the WorldState object in the - // renderscript. - sb.setType(mStateType, "State", RSID_STATE); - sb.setType(mTextureType, "noisesrc1", RSID_NOISESRC1); - sb.setType(mTextureType, "noisedst1", RSID_NOISEDST1); - sb.setType(mTextureType, "noisesrc2", RSID_NOISESRC2); - sb.setType(mTextureType, "noisedst2", RSID_NOISEDST2); - sb.setType(mTextureType, "noisesrc3", RSID_NOISESRC3); - sb.setType(mTextureType, "noisedst3", RSID_NOISEDST3); - sb.setType(mTextureType, "noisesrc4", RSID_NOISESRC4); - sb.setType(mTextureType, "noisedst4", RSID_NOISEDST4); - sb.setType(mTextureType, "noisesrc5", RSID_NOISESRC5); - sb.setType(mTextureType, "noisedst5", RSID_NOISEDST5); - sb.setScript(mResources, R.raw.clouds); - sb.setRoot(true); - - ScriptC script = sb.create(); - script.setClearColor(0.0f, 0.0f, 0.0f, 1.0f); - script.setTimeZone(TimeZone.getDefault().getID()); - - script.bindAllocation(mState, RSID_STATE); - script.bindAllocation(mSourceTextures[0], RSID_NOISESRC1); - script.bindAllocation(mRealTextures[0], RSID_NOISEDST1); - script.bindAllocation(mSourceTextures[1], RSID_NOISESRC2); - script.bindAllocation(mRealTextures[1], RSID_NOISEDST2); - script.bindAllocation(mSourceTextures[2], RSID_NOISESRC3); - script.bindAllocation(mRealTextures[2], RSID_NOISEDST3); - script.bindAllocation(mSourceTextures[3], RSID_NOISESRC4); - script.bindAllocation(mRealTextures[3], RSID_NOISEDST4); - script.bindAllocation(mSourceTextures[4], RSID_NOISESRC5); - script.bindAllocation(mRealTextures[4], RSID_NOISEDST5); - //script.bindAllocation(mPVAlloc.mAlloc, RSID_PROGRAMVERTEX); - - - return script; + mScript.set_gPFSBackgroundOne(mPfsBackgroundOne); + mScript.set_gPFSBackgroundSrc(mPfsBackgroundSrc); + + mScript.set_gPreset(mWorldState.mPreset); + mScript.set_gTextureMask(mWorldState.mTextureMask); + mScript.set_gRotate(mWorldState.mRotate); + mScript.set_gTextureSwap(mWorldState.mTextureSwap); + mScript.set_gProcessTextureMode(mWorldState.mProcessTextureMode); + mScript.set_gBackCol(mWorldState.mBackCol); + mScript.set_gLowCol(mWorldState.mLowCol); + mScript.set_gHighCol(mWorldState.mHighCol); + mScript.set_gAlphaMul(mWorldState.mAlphaMul); + mScript.set_gPreMul(mWorldState.mPreMul); + mScript.set_gBlendFunc(mWorldState.mBlendFunc); + mScript.set_gTilt(mWorldState.mTilt); + mScript.set_gXOffset(mWorldState.mXOffset); + + return mScript; } } diff --git a/src/com/android/magicsmoke/RenderScriptScene.java b/src/com/android/magicsmoke/RenderScriptScene.java index 8a5e213..23b3360 100644 --- a/src/com/android/magicsmoke/RenderScriptScene.java +++ b/src/com/android/magicsmoke/RenderScriptScene.java @@ -18,9 +18,10 @@ package com.android.magicsmoke; import android.content.res.Resources; +import android.os.Bundle; import android.renderscript.RenderScriptGL; import android.renderscript.ScriptC; -import android.view.MotionEvent; +//import android.view.MotionEvent; public abstract class RenderScriptScene { protected int mWidth; @@ -82,10 +83,12 @@ public abstract class RenderScriptScene { } @SuppressWarnings({"UnusedDeclaration"}) - public void setOffset(float xOffset, float yOffset, - float xStep, float yStep, int xPixels, int yPixels) { - } - public void onTouchEvent(MotionEvent event) { + public void setOffset(float xOffset, float yOffset, int xPixels, int yPixels) { } + @SuppressWarnings({"UnusedDeclaration"}) + public Bundle onCommand(String action, int x, int y, int z, Bundle extras, + boolean resultRequested) { + return null; + } } diff --git a/src/com/android/magicsmoke/RenderScriptWallpaper.java b/src/com/android/magicsmoke/RenderScriptWallpaper.java index b4359e2..4779fba 100644 --- a/src/com/android/magicsmoke/RenderScriptWallpaper.java +++ b/src/com/android/magicsmoke/RenderScriptWallpaper.java @@ -18,6 +18,7 @@ package com.android.magicsmoke; import android.service.wallpaper.WallpaperService; +import android.os.Bundle; import android.graphics.PixelFormat; import android.renderscript.RenderScriptGL; import android.renderscript.RenderScript; @@ -40,7 +41,7 @@ public abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); - setTouchEventsEnabled(true); + setTouchEventsEnabled(false); surfaceHolder.setSizeFromLayout(); surfaceHolder.setFormat(PixelFormat.RGBX_8888); } @@ -89,19 +90,15 @@ public abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends } } - @Override + /*@Override public void onTouchEvent(MotionEvent event) { - if (mRenderer != null) { - mRenderer.onTouchEvent(event); - } - } + mRenderer.onTouchEvent(event); + }*/ @Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { - if (mRenderer != null) { - mRenderer.setOffset(xOffset, yOffset, xStep, yStep, xPixels, yPixels); - } + mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels); } @Override @@ -121,5 +118,12 @@ public abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends super.onSurfaceDestroyed(holder); destroyRenderer(); } + + @Override + public Bundle onCommand(String action, int x, int y, int z, + Bundle extras, boolean resultRequested) { + return mRenderer.onCommand(action, x, y, z, extras, resultRequested); + } + } } diff --git a/src/com/android/magicsmoke/clouds.rs b/src/com/android/magicsmoke/clouds.rs new file mode 100644 index 0000000..9383efb --- /dev/null +++ b/src/com/android/magicsmoke/clouds.rs @@ -0,0 +1,352 @@ +// Copyright (C) 2009 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma version(1) + +#pragma rs java_package_name(com.android.magicsmoke) + +#include "rs_graphics.rsh" + +#define RSID_NOISESRC1 1 +#define RSID_NOISESRC2 2 +#define RSID_NOISESRC3 3 +#define RSID_NOISESRC4 4 +#define RSID_NOISESRC5 5 +#define RSID_NOISEDST1 6 +#define RSID_NOISEDST2 7 +#define RSID_NOISEDST3 8 +#define RSID_NOISEDST4 9 +#define RSID_NOISEDST5 10 + +// State set from java +float gXOffset; +float gTilt; +int gPreset; +int gTextureMask; +int gRotate; +int gTextureSwap; +int gProcessTextureMode; +int gBackCol; +int gLowCol; +int gHighCol; +float gAlphaMul; +int gPreMul; +int gBlendFunc; + +rs_program_vertex gPVBackground; +rs_program_fragment gPFBackground; +rs_program_store gPFSBackgroundOne; +rs_program_store gPFSBackgroundSrc; + +rs_allocation gTnoise1; +rs_allocation gTnoise2; +rs_allocation gTnoise3; +rs_allocation gTnoise4; +rs_allocation gTnoise5; + +int *gNoisesrc1; +int *gNoisesrc2; +int *gNoisesrc3; +int *gNoisesrc4; +int *gNoisesrc5; + +int *gNoisedst1; +int *gNoisedst2; +int *gNoisedst3; +int *gNoisedst4; +int *gNoisedst5; + +#pragma rs export_var(gXOffset, gTilt, gPreset, gTextureMask, gRotate, gTextureSwap, gProcessTextureMode, gBackCol, gLowCol, gHighCol, gAlphaMul, gPreMul, gBlendFunc, gPVBackground, gPFBackground, gPFSBackgroundOne, gPFSBackgroundSrc, gTnoise1, gTnoise2, gTnoise3, gTnoise4, gTnoise5, gNoisesrc1, gNoisesrc2, gNoisesrc3, gNoisesrc4, gNoisesrc5, gNoisedst1, gNoisedst2, gNoisedst3, gNoisedst4, gNoisedst5) +#pragma rs_export_func() + +// Local script variables +float xshift[5]; +float rotation[5]; +float scale[5]; +float alphafactor; +int currentpreset; +int lastuptime; +float timedelta; +static float4 clearColor = {0.5f, 0.0f, 0.0f, 1.0f}; + +void drawCloud(rs_matrix4x4 *ident, rs_allocation allocat, int idx) { + rs_matrix4x4 mat1; + float z = -8.f * idx; + rsMatrixLoad(&mat1, ident); + rsMatrixTranslate(&mat1, -gXOffset * 8.f * idx, -gTilt * idx / 3.f, 0.f); + rsMatrixRotate(&mat1, rotation[idx], 0.f, 0.f, 1.f); + rsgProgramVertexLoadModelMatrix(&mat1); + + rsgBindTexture(gPFBackground, 0, allocat); + rsgDrawQuadTexCoords( + -1200.0f, -1200.0f, z, // space + 0.f + xshift[idx], 0.f, // texture + 1200, -1200.0f, z, // space + scale[idx] + xshift[idx], 0.f, // texture + 1200, 1200.0f, z, // space + scale[idx] + xshift[idx], scale[idx], // texture + -1200.0f, 1200.0f, z, // space + 0.f + xshift[idx], scale[idx]); // texture +} + +void drawClouds(rs_matrix4x4 *ident) { + rs_matrix4x4 mat1; + rsMatrixLoad(&mat1, ident); + + if (gRotate != 0) { + rotation[0] += 0.10 * timedelta; + rotation[1] += 0.102f * timedelta; + rotation[2] += 0.106f * timedelta; + rotation[3] += 0.114f * timedelta; + rotation[4] += 0.123f * timedelta; + } + + int mask = gTextureMask; + if (mask & 1) { + xshift[0] += 0.0010f * timedelta; + if (gTextureSwap != 0) { + drawCloud(&mat1, gTnoise5, 0); + } else { + drawCloud(&mat1, gTnoise1, 0); + } + } + + if (mask & 2) { + xshift[1] += 0.00106 * timedelta; + drawCloud(&mat1, gTnoise2, 1); + } + + if (mask & 4) { + xshift[2] += 0.00114f * timedelta; + drawCloud(&mat1, gTnoise3, 2); + } + + if (mask & 8) { + xshift[3] += 0.00118f * timedelta; + drawCloud(&mat1, gTnoise4, 3); + } + + if (mask & 16) { + xshift[4] += 0.00127f * timedelta; + drawCloud(&mat1, gTnoise5, 4); + } + + // Make sure the texture coordinates don't continuously increase + int i; + for(i = 0; i < 5; i++) { + if (xshift[i] > 1.f) { + xshift[i] -= floor(xshift[i]); + } + } + // Make sure the rotation angles don't continuously increase + for(i = 0; i < 5; i++) { + if (rotation[i] > 360.f) { + float multiplier = floor(rotation[i]/360.f); + rotation[i] -= 360.f * multiplier; + } + } +} + +int premul(int rgb, int a) { + int r = (rgb >> 16) * a + 1; + r = (r + (r >> 8)) >> 8; + int g = ((rgb >> 8) & 0xff) * a + 1; + g = (g + (g >> 8)) >> 8; + int b = (rgb & 0xff) * a + 1; + b = (b + (b >> 8)) >> 8; + return r << 16 | g << 8 | b; +} + + +void makeTexture(int *src, int *dst, rs_allocation rsid) { + + int x; + int y; + int pm = gPreMul; + + if (gProcessTextureMode == 1) { + int lowcol = gLowCol; + int highcol = gHighCol; + + for (y=0;y<256;y++) { + for (x=0;x<256;x++) { + int pix = src[y*256+x]; + int lum = pix & 0x00ff; + int newpix; + if (lum < 128) { + newpix = lowcol; + int newalpha = 255 - (lum * 2); + newalpha /= alphafactor; + if (pm) newpix = premul(newpix, newalpha); + newpix = newpix | (newalpha << 24); + } else { + newpix = highcol; + int newalpha = (lum - 128) * 2; + newalpha /= alphafactor; + if (pm) newpix = premul(newpix, newalpha); + newpix = newpix | (newalpha << 24); + } + // have ARGB, need ABGR + newpix = (newpix & 0xff00ff00) | ((newpix & 0xff) << 16) | ((newpix >> 16) & 0xff); + dst[y*256+x] = newpix; + } + } + alphafactor *= gAlphaMul; + } else if (gProcessTextureMode == 2) { + int lowcol = gLowCol; + int highcol = gHighCol; + float scale = 255.f / (255.f - lowcol); + + for (y=0;y<256;y++) { + for (x=0;x<256;x++) { + int pix = src[y*256+x]; + int alpha = pix & 0x00ff; + if (alpha < lowcol) { + alpha = 0; + } else { + alpha = (alpha - lowcol) * scale; + } + alpha /= alphafactor; + int newpix = highcol; + if (pm) newpix = premul(newpix, alpha); + newpix = newpix | (alpha << 24); + // have ARGB, need ABGR + newpix = (newpix & 0xff00ff00) | ((newpix & 0xff) << 16) | ((newpix >> 16) & 0xff); + dst[y*256+x] = newpix; + } + } + alphafactor *= gAlphaMul; + } else if (gProcessTextureMode == 3) { + int lowcol = gLowCol; + int highcol = gHighCol; + float scale = 255.f / (255.f - lowcol); + + for (y=0;y<256;y++) { + for (x=0;x<256;x++) { + int pix = src[y*256+x]; + int lum = pix & 0x00ff; + int newpix; + if (lum < 128) lum *= 2; + else lum = (255 - (lum - 128) * 2); + if (lum < 128) { + newpix = lowcol; + int newalpha = 255 - (lum * 2); + newalpha /= alphafactor; + if (pm) newpix = premul(newpix, newalpha); + newpix = newpix | (newalpha << 24); + } else { + newpix = highcol; + int newalpha = (lum - 128) * 2; + newalpha /= alphafactor; + if (pm) newpix = premul(newpix, newalpha); + newpix = newpix | (newalpha << 24); + } + // have ARGB, need ABGR + newpix = (newpix & 0xff00ff00) | ((newpix & 0xff) << 16) | ((newpix >> 16) & 0xff); + dst[y*256+x] = newpix; + } + } + alphafactor *= gAlphaMul; + } else { + for (y=0;y<256;y++) { + for (x=0;x<256;x++) { + int rgb = *src++; + int a = (rgb >> 24) & 0xff; + rgb &= 0x00ffffff; + rgb = premul(rgb, a); + int newpix = (a << 24) | rgb; + newpix = (newpix & 0xff00ff00) | ((newpix & 0xff) << 16) | ((newpix >> 16) & 0xff); + *dst++ = newpix; + } + } + } + + rsgUploadToTexture(rsid, 0); +} + +void makeTextures() { + alphafactor = 1.f; + makeTexture((int*)gNoisesrc1, (int*)gNoisedst1, gTnoise1); + makeTexture((int*)gNoisesrc2, (int*)gNoisedst2, gTnoise2); + makeTexture((int*)gNoisesrc3, (int*)gNoisedst3, gTnoise3); + makeTexture((int*)gNoisesrc4, (int*)gNoisedst4, gTnoise4); + makeTexture((int*)gNoisesrc5, (int*)gNoisedst5, gTnoise5); +} + +void init() { + for (int i=0;i<5;i++) { + xshift[i] = 0.f; + rotation[i] = 360.f * i / 5.f; + } + + scale[0] = 4.0f; // changed below based on preset + scale[1] = 3.0f; + scale[2] = 3.4f; + scale[3] = 3.8f; + scale[4] = 4.2f; + + currentpreset = -1; + lastuptime = (int)rsUptimeMillis(); + timedelta = 0; +} + + +int root(int launchID) { + int i; + rs_matrix4x4 ident; + float masterscale = 0.0041f;// / (gXOffset * 4.f + 1.f); + + rsgBindProgramVertex(gPVBackground); + rsgBindProgramFragment(gPFBackground); + + rsMatrixLoadIdentity(&ident); + rsMatrixTranslate(&ident, -gXOffset, 0.f, 0.f); + rsMatrixScale(&ident, masterscale, masterscale, masterscale); + //rsMatrixRotate(&ident, 0.f, 0.f, 0.f, 1.f); + rsMatrixRotate(&ident, -gTilt, 1.f, 0.f, 0.f); + + if (gBlendFunc) { + rsgBindProgramStore(gPFSBackgroundOne); + } else { + rsgBindProgramStore(gPFSBackgroundSrc); + } + + int now = (int)rsUptimeMillis(); + timedelta = ((float)(now - lastuptime)) / 44.f; + lastuptime = now; + if (timedelta > 3) { + // Limit the step adjustment factor to 3, so we don't get a sudden jump + // after coming back from sleep. + timedelta = 3; + } + + i = gPreset; + if (i != currentpreset) { + currentpreset = i; + clearColor.x = ((float)((gBackCol >> 16) & 0xff)) / 255.0f; + clearColor.y = ((float)((gBackCol >> 8) & 0xff)) / 255.0f; + clearColor.z = ((float)(gBackCol & 0xff)) / 255.0f; + makeTextures(); + } + rsgClearColor(clearColor.x, clearColor.y, clearColor.z, clearColor.w); + + if (gTextureSwap != 0) { + scale[0] = .25f; + } else { + scale[0] = 4.f; + } + drawClouds(&ident); + + return 55; +} |