• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2010 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #pragma version(1)
16 
17 #pragma rs java_package_name(com.android.wallpaper.holospiral)
18 
19 #include "rs_graphics.rsh"
20 
21 #pragma rs export_func(resize)
22 
23 #define FOV 60.0f
24 #define SPIRAL_ROTATE_SPEED 15.0f
25 #define INNER_ROTATE_SPEED 1.5f
26 #define OUTER_ROTATE_SPEED 0.5f
27 
28 // Vertex Shaders
29 rs_program_vertex gPVBackground;
30 rs_program_vertex gPVGeometry;
31 
32 // Fragment Shaders
33 rs_program_fragment gPFBackground;
34 rs_program_fragment gPFGeometry;
35 
36 // Blending and Depth testing
37 rs_program_store gPSBackground;
38 rs_program_store gPSGeometry;
39 
40 // Meshes
41 rs_mesh gInnerGeometry;
42 rs_mesh gOuterGeometry;
43 rs_mesh gBackgroundMesh;
44 
45 // Matrices
46 static rs_matrix4x4 gProjectionMatrix;
47 static rs_matrix4x4 gTransformedModelView;
48 
49 // Textures
50 rs_allocation gPointTexture;
51 
52 // Misc fields
53 float gXOffset;
54 float gNearPlane;
55 float gFarPlane;
56 
57 // User defined data types
58 typedef struct VertexShaderConstants_s {
59     rs_matrix4x4 modelViewProj;
60     float maxPointSize;
61     float farPlane;
62 } VertexShaderConstants;
63 VertexShaderConstants* gVSConstants;
64 
65 typedef struct VertexColor_s {
66     float3 position;
67     float4 color;
68 } VertexColor;
69 VertexColor* VertexColor_s_dummy;
70 
71 static float lastTime;
72 static float gInnerRotateAngle;
73 static float gOuterRotateAngle;
74 static float gWidth;
75 static float gHeight;
76 
77 static float modulo360(float val) {
78     static const INVERSE_360 = 1.0f / 360.0f;
79     int multiplier = (int)(val * INVERSE_360);
80     return val - (multiplier * 360.0f);
81 }
82 
83 static void drawBackground() {
84     rsgBindProgramVertex(gPVBackground);
85     rsgBindProgramFragment(gPFBackground);
86     rsgBindProgramStore(gPSBackground);
87 
88     rsgDrawMesh(gBackgroundMesh);
89 }
90 
91 static void drawGeometry(float dt) {
92     rsgBindProgramVertex(gPVGeometry);
93     rsgBindProgramFragment(gPFGeometry);
94     rsgBindProgramStore(gPSGeometry);
95 
96     rsgBindTexture(gPFGeometry, 0, gPointTexture);
97 
98     rs_matrix4x4 modelView;
99     rs_matrix4x4 rotateModelView;
100 
101     rsMatrixLoad(&modelView, &gTransformedModelView);
102     rsMatrixRotate(&modelView, gXOffset * -SPIRAL_ROTATE_SPEED, 0.0f, 1.0f, 0.0f);
103 
104     rsMatrixLoad(&rotateModelView, &modelView);
105     {
106         rsMatrixRotate(&rotateModelView, -gOuterRotateAngle, 0.0f, 0.0f, 1.0f);
107         rsMatrixLoadMultiply(&gVSConstants->modelViewProj, &gProjectionMatrix, &rotateModelView);
108 
109         // Wrap the rotation so we don't go past 360
110         gOuterRotateAngle = modulo360(gOuterRotateAngle + (dt * OUTER_ROTATE_SPEED));
111 
112         rsgDrawMesh(gOuterGeometry);
113     }
114 
115     rsMatrixLoad(&rotateModelView, &modelView);
116     {
117         rsMatrixRotate(&rotateModelView, gInnerRotateAngle, 0.0f, 0.0f, 1.0f);
118         rsMatrixLoadMultiply(&gVSConstants->modelViewProj, &gProjectionMatrix, &rotateModelView);
119 
120         // Wrap the rotation so we don't go past 360
121         gInnerRotateAngle = modulo360(gInnerRotateAngle + (dt * INNER_ROTATE_SPEED));
122 
123         rsgDrawMesh(gInnerGeometry);
124     }
125 }
126 
127 void resize(float width, float height) {
128     gWidth = width;
129     gHeight = height;
130     gVSConstants->farPlane = gFarPlane;
131     rsMatrixLoadPerspective(&gProjectionMatrix, FOV, gWidth / gHeight, gNearPlane, gFarPlane);
132 }
133 
134 void init() {
135     gInnerRotateAngle = 0.0f;
136     gOuterRotateAngle = 0.0f;
137 
138     gXOffset = 0.0f;
139     lastTime = rsUptimeMillis();
140 
141     // Pre-calculate some fixed transformations
142     rsMatrixLoadIdentity(&gTransformedModelView);
143     rsMatrixTranslate(&gTransformedModelView, -3.0f, -5.0f, -18.0f);
144     rsMatrixRotate(&gTransformedModelView, 20.0f, 0.0f, 1.0f, 0.0f);
145     rsMatrixRotate(&gTransformedModelView, -10.0f, 1.0f, 0.0f, 0.0f);
146 }
147 
148 int root(void) {
149     float now = rsUptimeMillis();
150     float elapsed = (now - lastTime) * 0.001f;
151     lastTime = now;
152 
153     drawBackground();
154     drawGeometry(elapsed);
155 
156     // Around 14 FPS
157     return 70;
158 }
159