summaryrefslogtreecommitdiffstats
path: root/src/com/android/wallpaper/holospiral/holo_spiral.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/wallpaper/holospiral/holo_spiral.rs')
-rw-r--r--src/com/android/wallpaper/holospiral/holo_spiral.rs158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/com/android/wallpaper/holospiral/holo_spiral.rs b/src/com/android/wallpaper/holospiral/holo_spiral.rs
new file mode 100644
index 0000000..d0c77b0
--- /dev/null
+++ b/src/com/android/wallpaper/holospiral/holo_spiral.rs
@@ -0,0 +1,158 @@
+// Copyright (C) 2010 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.wallpaper.holospiral)
+
+#include "rs_graphics.rsh"
+
+#pragma rs export_func(resize)
+
+#define FOV 60.0f
+#define SPIRAL_ROTATE_SPEED 15.0f
+#define INNER_ROTATE_SPEED 1.5f
+#define OUTER_ROTATE_SPEED 0.5f
+
+// Vertex Shaders
+rs_program_vertex gPVBackground;
+rs_program_vertex gPVGeometry;
+
+// Fragment Shaders
+rs_program_fragment gPFBackground;
+rs_program_fragment gPFGeometry;
+
+// Blending and Depth testing
+rs_program_store gPSBackground;
+rs_program_store gPSGeometry;
+
+// Meshes
+rs_mesh gInnerGeometry;
+rs_mesh gOuterGeometry;
+rs_mesh gBackgroundMesh;
+
+// Matrices
+static rs_matrix4x4 gProjectionMatrix;
+static rs_matrix4x4 gTransformedModelView;
+
+// Textures
+rs_allocation gPointTexture;
+
+// Misc fields
+float gXOffset;
+float gNearPlane;
+float gFarPlane;
+
+// User defined data types
+typedef struct VertexShaderConstants_s {
+ rs_matrix4x4 modelViewProj;
+ float maxPointSize;
+ float farPlane;
+} VertexShaderConstants;
+VertexShaderConstants* gVSConstants;
+
+typedef struct VertexColor_s {
+ float3 position;
+ float4 color;
+} VertexColor;
+VertexColor* VertexColor_s_dummy;
+
+static float lastTime;
+static float gInnerRotateAngle;
+static float gOuterRotateAngle;
+static float gWidth;
+static float gHeight;
+
+static float modulo360(float val) {
+ static const INVERSE_360 = 1.0f / 360.0f;
+ int multiplier = (int)(val * INVERSE_360);
+ return val - (multiplier * 360.0f);
+}
+
+static void drawBackground() {
+ rsgBindProgramVertex(gPVBackground);
+ rsgBindProgramFragment(gPFBackground);
+ rsgBindProgramStore(gPSBackground);
+
+ rsgDrawMesh(gBackgroundMesh);
+}
+
+static void drawGeometry(float dt) {
+ rsgBindProgramVertex(gPVGeometry);
+ rsgBindProgramFragment(gPFGeometry);
+ rsgBindProgramStore(gPSGeometry);
+
+ rsgBindTexture(gPFGeometry, 0, gPointTexture);
+
+ rs_matrix4x4 modelView;
+ rs_matrix4x4 rotateModelView;
+
+ rsMatrixLoad(&modelView, &gTransformedModelView);
+ rsMatrixRotate(&modelView, gXOffset * -SPIRAL_ROTATE_SPEED, 0.0f, 1.0f, 0.0f);
+
+ rsMatrixLoad(&rotateModelView, &modelView);
+ {
+ rsMatrixRotate(&rotateModelView, -gOuterRotateAngle, 0.0f, 0.0f, 1.0f);
+ rsMatrixLoadMultiply(&gVSConstants->modelViewProj, &gProjectionMatrix, &rotateModelView);
+
+ // Wrap the rotation so we don't go past 360
+ gOuterRotateAngle = modulo360(gOuterRotateAngle + (dt * OUTER_ROTATE_SPEED));
+
+ rsgDrawMesh(gOuterGeometry);
+ }
+
+ rsMatrixLoad(&rotateModelView, &modelView);
+ {
+ rsMatrixRotate(&rotateModelView, gInnerRotateAngle, 0.0f, 0.0f, 1.0f);
+ rsMatrixLoadMultiply(&gVSConstants->modelViewProj, &gProjectionMatrix, &rotateModelView);
+
+ // Wrap the rotation so we don't go past 360
+ gInnerRotateAngle = modulo360(gInnerRotateAngle + (dt * INNER_ROTATE_SPEED));
+
+ rsgDrawMesh(gInnerGeometry);
+ }
+}
+
+void resize(float width, float height) {
+ gWidth = width;
+ gHeight = height;
+ gVSConstants->farPlane = gFarPlane;
+ rsMatrixLoadPerspective(&gProjectionMatrix, FOV, gWidth / gHeight, gNearPlane, gFarPlane);
+}
+
+void init() {
+ gInnerRotateAngle = 0.0f;
+ gOuterRotateAngle = 0.0f;
+
+ gXOffset = 0.0f;
+ lastTime = rsUptimeMillis();
+
+ // Pre-calculate some fixed transformations
+ rsMatrixLoadIdentity(&gTransformedModelView);
+ rsMatrixTranslate(&gTransformedModelView, -3.0f, -5.0f, -18.0f);
+ rsMatrixRotate(&gTransformedModelView, 20.0f, 0.0f, 1.0f, 0.0f);
+ rsMatrixRotate(&gTransformedModelView, -10.0f, 1.0f, 0.0f, 0.0f);
+}
+
+int root(int launchID) {
+ float now = rsUptimeMillis();
+ float elapsed = (now - lastTime) * 0.001f;
+ lastTime = now;
+
+ drawBackground();
+ drawGeometry(elapsed);
+
+ // Around 14 FPS
+ return 70;
+}