blob: dbe06d873bfab828d7f1ee846e06a4adb3044192 [file] [log] [blame]
// 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 stateVertex(PVBackground)
#pragma stateRaster(parent)
#pragma stateFragment(PFBackground)
#define RSID_POINTS 1
#define FADEOUT_LENGTH 100
#define FADEOUT_FACTOR 0.95f
#define FADEIN_LENGTH 15
int fadeoutcounter = 0;
int fadeincounter = 0;
int wave1pos = 0;
int wave1amp = 0;
int wave2pos = 0;
int wave2amp= 0;
int wave3pos = 0;
int wave3amp= 0;
int wave4pos = 0;
int wave4amp= 0;
float idle[8192];
int waveCounter = 0;
void makeIdleWave(float *points) {
int i;
// show a number of superimposed moving sinewaves
float amp1 = sinf(0.007 * wave1amp) * 120;
float amp2 = sinf(0.023 * wave2amp) * 80;
float amp3 = sinf(0.011 * wave3amp) * 40;
float amp4 = sinf(0.031 * wave4amp) * 20;
// calculate how many invisible lines there are on each side
int skip = (1024 - State->width) / 2;
int end = 1024 - skip;
for (i = skip; i < end; i++) {
float val = sinf(0.013 * (wave1pos + i)) * amp1
+ sinf(0.029 * (wave2pos + i)) * amp2;
float off = sinf(0.005 * (wave3pos + i)) * amp3
+ sinf(0.017 * (wave4pos + i)) * amp4;
if (val < 2.f && val > -2.f) val = 2.f;
points[i*8+1] = val + off;
points[i*8+5] = -val + off;
}
wave1pos++;
wave1amp++;
wave2pos--;
wave2amp++;
wave3pos++;
wave3amp++;
wave4pos++;
wave4amp++;
}
int main(int launchID) {
int i;
// calculate how many invisible lines there are on each side
int width = State->width;
int skip = (1024 - width) / 2;
int end = 1024 - skip;
if (State->idle) {
// idle state animation
float *points = loadArrayF(RSID_POINTS, 0);
if (fadeoutcounter > 0) {
// fade waveform to 0
for (i = skip; i < end; i++) {
float val = absf(points[i*8+1]);
val = val * FADEOUT_FACTOR;
if (val < 2.f) val = 2.f;
points[i*8+1] = val;
points[i*8+5] = -val;
}
fadeoutcounter--;
if (fadeoutcounter == 0) {
wave1amp = 0;
wave2amp = 0;
wave3amp = 0;
wave4amp = 0;
}
} else {
// idle animation
makeIdleWave(points);
}
fadeincounter = FADEIN_LENGTH;
} else {
if (fadeincounter > 0 && fadeoutcounter == 0) {
// morph from idle animation back to waveform
makeIdleWave(idle);
if (waveCounter != State->waveCounter) {
waveCounter = State->waveCounter;
float *points = loadArrayF(RSID_POINTS, 0);
for (i = skip; i < end; i++) {
float val = absf(points[i*8+1]);
points[i*8+1] = (val * (FADEIN_LENGTH - fadeincounter) + idle[i*8+1] * fadeincounter) / FADEIN_LENGTH;
points[i*8+5] = (-val * (FADEIN_LENGTH - fadeincounter) + idle[i*8+5] * fadeincounter) / FADEIN_LENGTH;
}
}
fadeincounter--;
if (fadeincounter == 0) {
fadeoutcounter = FADEOUT_LENGTH;
}
} else {
fadeoutcounter = FADEOUT_LENGTH;
}
}
float mat1[16];
float yrot = State->yRotation;
float scale = 0.004165f * (1.0f + 2.f * absf(sinf(radf(yrot))));
// Change the model matrix to account for the large model
// and to do the necessary rotations.
matrixLoadRotate(mat1, yrot, 0.f, 0.f, 1.f);
matrixScale(mat1, scale, scale, scale);
vpLoadModelMatrix(mat1);
// Draw the visualizer.
uploadToBufferObject(NAMED_PointBuffer);
bindTexture(NAMED_PFBackground, 0, NAMED_Tlinetexture);
drawSimpleMeshRange(NAMED_CubeMesh, skip * 2, width * 2);
return 1;
}