summaryrefslogtreecommitdiff
path: root/src/org/zeroxlab/kubench/Kubench.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/zeroxlab/kubench/Kubench.java')
-rw-r--r--src/org/zeroxlab/kubench/Kubench.java388
1 files changed, 388 insertions, 0 deletions
diff --git a/src/org/zeroxlab/kubench/Kubench.java b/src/org/zeroxlab/kubench/Kubench.java
new file mode 100644
index 0000000..252f616
--- /dev/null
+++ b/src/org/zeroxlab/kubench/Kubench.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2008 Google Inc.
+ *
+ * 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.
+ */
+
+package org.zeroxlab.kubench;
+
+import org.zeroxlab.benchmark.Tester;
+
+import android.app.Activity;
+import android.graphics.PixelFormat;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import java.util.Random;
+
+public class Kubench extends Tester implements GLSurfaceView.GLSurfaceViewClient {
+
+ public final String TAG = "Kubench";
+ public final static String PACKAGE = "org.zeroxlab.kubench";
+
+ public String getTag() {
+ return TAG;
+ }
+
+ public static String getFullClassName() {
+ return PACKAGE + ".Kubench";
+ }
+
+ public int sleepBeforeStart() {
+ return 1000; //1 second
+ }
+
+ public int sleepBetweenRound() {
+ return 0;
+ }
+
+ public void oneRound() {
+ // do nothing;
+ }
+
+ private GLWorld makeGLWorld()
+ {
+ GLWorld world = new GLWorld();
+
+ int one = 0x10000;
+ int half = 0x08000;
+ GLColor red = new GLColor(one, 0, 0);
+ GLColor green = new GLColor(0, one, 0);
+ GLColor blue = new GLColor(0, 0, one);
+ GLColor yellow = new GLColor(one, one, 0);
+ GLColor orange = new GLColor(one, half, 0);
+ GLColor white = new GLColor(one, one, one);
+ GLColor black = new GLColor(0, 0, 0);
+
+ // coordinates for our cubes
+ float c0 = -1.0f;
+ float c1 = -0.38f;
+ float c2 = -0.32f;
+ float c3 = 0.32f;
+ float c4 = 0.38f;
+ float c5 = 1.0f;
+
+ // top back, left to right
+ mCubes[0] = new Cube(world, c0, c4, c0, c1, c5, c1);
+ mCubes[1] = new Cube(world, c2, c4, c0, c3, c5, c1);
+ mCubes[2] = new Cube(world, c4, c4, c0, c5, c5, c1);
+ // top middle, left to right
+ mCubes[3] = new Cube(world, c0, c4, c2, c1, c5, c3);
+ mCubes[4] = new Cube(world, c2, c4, c2, c3, c5, c3);
+ mCubes[5] = new Cube(world, c4, c4, c2, c5, c5, c3);
+ // top front, left to right
+ mCubes[6] = new Cube(world, c0, c4, c4, c1, c5, c5);
+ mCubes[7] = new Cube(world, c2, c4, c4, c3, c5, c5);
+ mCubes[8] = new Cube(world, c4, c4, c4, c5, c5, c5);
+ // middle back, left to right
+ mCubes[9] = new Cube(world, c0, c2, c0, c1, c3, c1);
+ mCubes[10] = new Cube(world, c2, c2, c0, c3, c3, c1);
+ mCubes[11] = new Cube(world, c4, c2, c0, c5, c3, c1);
+ // middle middle, left to right
+ mCubes[12] = new Cube(world, c0, c2, c2, c1, c3, c3);
+ mCubes[13] = null;
+ mCubes[14] = new Cube(world, c4, c2, c2, c5, c3, c3);
+ // middle front, left to right
+ mCubes[15] = new Cube(world, c0, c2, c4, c1, c3, c5);
+ mCubes[16] = new Cube(world, c2, c2, c4, c3, c3, c5);
+ mCubes[17] = new Cube(world, c4, c2, c4, c5, c3, c5);
+ // bottom back, left to right
+ mCubes[18] = new Cube(world, c0, c0, c0, c1, c1, c1);
+ mCubes[19] = new Cube(world, c2, c0, c0, c3, c1, c1);
+ mCubes[20] = new Cube(world, c4, c0, c0, c5, c1, c1);
+ // bottom middle, left to right
+ mCubes[21] = new Cube(world, c0, c0, c2, c1, c1, c3);
+ mCubes[22] = new Cube(world, c2, c0, c2, c3, c1, c3);
+ mCubes[23] = new Cube(world, c4, c0, c2, c5, c1, c3);
+ // bottom front, left to right
+ mCubes[24] = new Cube(world, c0, c0, c4, c1, c1, c5);
+ mCubes[25] = new Cube(world, c2, c0, c4, c3, c1, c5);
+ mCubes[26] = new Cube(world, c4, c0, c4, c5, c1, c5);
+
+ // paint the sides
+ int i, j;
+ // set all faces black by default
+ for (i = 0; i < 27; i++) {
+ Cube cube = mCubes[i];
+ if (cube != null) {
+ for (j = 0; j < 6; j++)
+ cube.setFaceColor(j, black);
+ }
+ }
+
+ // paint top
+ for (i = 0; i < 9; i++)
+ mCubes[i].setFaceColor(Cube.kTop, orange);
+ // paint bottom
+ for (i = 18; i < 27; i++)
+ mCubes[i].setFaceColor(Cube.kBottom, red);
+ // paint left
+ for (i = 0; i < 27; i += 3)
+ mCubes[i].setFaceColor(Cube.kLeft, yellow);
+ // paint right
+ for (i = 2; i < 27; i += 3)
+ mCubes[i].setFaceColor(Cube.kRight, white);
+ // paint back
+ for (i = 0; i < 27; i += 9)
+ for (j = 0; j < 3; j++)
+ mCubes[i + j].setFaceColor(Cube.kBack, blue);
+ // paint front
+ for (i = 6; i < 27; i += 9)
+ for (j = 0; j < 3; j++)
+ mCubes[i + j].setFaceColor(Cube.kFront, green);
+
+ for (i = 0; i < 27; i++)
+ if (mCubes[i] != null)
+ world.addShape(mCubes[i]);
+
+ // initialize our permutation to solved position
+ mPermutation = new int[27];
+ for (i = 0; i < mPermutation.length; i++)
+ mPermutation[i] = i;
+
+ createLayers();
+ updateLayers();
+
+ world.generate();
+
+ return world;
+ }
+
+ private void createLayers() {
+ mLayers[kUp] = new Layer(Layer.kAxisY);
+ mLayers[kDown] = new Layer(Layer.kAxisY);
+ mLayers[kLeft] = new Layer(Layer.kAxisX);
+ mLayers[kRight] = new Layer(Layer.kAxisX);
+ mLayers[kFront] = new Layer(Layer.kAxisZ);
+ mLayers[kBack] = new Layer(Layer.kAxisZ);
+ mLayers[kMiddle] = new Layer(Layer.kAxisX);
+ mLayers[kEquator] = new Layer(Layer.kAxisY);
+ mLayers[kSide] = new Layer(Layer.kAxisZ);
+ }
+
+ private void updateLayers() {
+ Layer layer;
+ GLShape[] shapes;
+ int i, j, k;
+
+ // up layer
+ layer = mLayers[kUp];
+ shapes = layer.mShapes;
+ for (i = 0; i < 9; i++)
+ shapes[i] = mCubes[mPermutation[i]];
+
+ // down layer
+ layer = mLayers[kDown];
+ shapes = layer.mShapes;
+ for (i = 18, k = 0; i < 27; i++)
+ shapes[k++] = mCubes[mPermutation[i]];
+
+ // left layer
+ layer = mLayers[kLeft];
+ shapes = layer.mShapes;
+ for (i = 0, k = 0; i < 27; i += 9)
+ for (j = 0; j < 9; j += 3)
+ shapes[k++] = mCubes[mPermutation[i + j]];
+
+ // right layer
+ layer = mLayers[kRight];
+ shapes = layer.mShapes;
+ for (i = 2, k = 0; i < 27; i += 9)
+ for (j = 0; j < 9; j += 3)
+ shapes[k++] = mCubes[mPermutation[i + j]];
+
+ // front layer
+ layer = mLayers[kFront];
+ shapes = layer.mShapes;
+ for (i = 6, k = 0; i < 27; i += 9)
+ for (j = 0; j < 3; j++)
+ shapes[k++] = mCubes[mPermutation[i + j]];
+
+ // back layer
+ layer = mLayers[kBack];
+ shapes = layer.mShapes;
+ for (i = 0, k = 0; i < 27; i += 9)
+ for (j = 0; j < 3; j++)
+ shapes[k++] = mCubes[mPermutation[i + j]];
+
+ // middle layer
+ layer = mLayers[kMiddle];
+ shapes = layer.mShapes;
+ for (i = 1, k = 0; i < 27; i += 9)
+ for (j = 0; j < 9; j += 3)
+ shapes[k++] = mCubes[mPermutation[i + j]];
+
+ // equator layer
+ layer = mLayers[kEquator];
+ shapes = layer.mShapes;
+ for (i = 9, k = 0; i < 18; i++)
+ shapes[k++] = mCubes[mPermutation[i]];
+
+ // side layer
+ layer = mLayers[kSide];
+ shapes = layer.mShapes;
+ for (i = 3, k = 0; i < 27; i += 9)
+ for (j = 0; j < 3; j++)
+ shapes[k++] = mCubes[mPermutation[i + j]];
+ }
+
+ @Override
+ public void onCreate(Bundle icicle)
+ {
+ super.onCreate(icicle);
+
+ // Make sure to create a TRANSLUCENT window. This is required
+ // for SurfaceView to work. Eventually this'll be done by
+ // the system automatically.
+ getWindow().setFormat(PixelFormat.TRANSLUCENT);
+
+ // We don't need a title either.
+ // requestWindowFeature(Window.FEATURE_NO_TITLE);
+
+ setTitle(TAG);
+
+ mView = new GLSurfaceView(getApplication(), makeGLWorld(), this);
+ setContentView(mView);
+ mView.setClient(this);
+ mPrevFramerate = 0.0f;
+ }
+
+ @Override
+ protected void onResume()
+ {
+ super.onResume();
+ }
+
+ @Override
+ protected void onStop()
+ {
+ super.onStop();
+ }
+
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_BACK:
+ return super.onKeyDown(keyCode, event);
+ }
+ setTitle("Kubench: " + mView.getFramerate() + " fps");
+ return true;
+ }
+
+ public void animate() {
+ // change our angle of view
+ mView.setAngle(mView.getAngle() + 1.2f);
+
+ if (mCurrentLayer == null) {
+ int layerID = mRandom.nextInt(9);
+ mCurrentLayer = mLayers[layerID];
+ mCurrentLayerPermutation = mLayerPermutations[layerID];
+ mCurrentLayer.startAnimation();
+ boolean direction = mRandom.nextBoolean();
+ int count = mRandom.nextInt(3) + 1;
+
+ count = 1;
+ direction = false;
+ mCurrentAngle = 0;
+ if (direction) {
+ mAngleIncrement = (float)Math.PI / 50;
+ mEndAngle = mCurrentAngle + ((float)Math.PI * count) / 2f;
+ } else {
+ mAngleIncrement = -(float)Math.PI / 50;
+ mEndAngle = mCurrentAngle - ((float)Math.PI * count) / 2f;
+ }
+ }
+
+ mCurrentAngle += mAngleIncrement;
+
+ if ((mAngleIncrement > 0f && mCurrentAngle >= mEndAngle) ||
+ (mAngleIncrement < 0f && mCurrentAngle <= mEndAngle)) {
+ mCurrentLayer.setAngle(mEndAngle);
+ mCurrentLayer.endAnimation();
+ mCurrentLayer = null;
+
+ // adjust mPermutation based on the completed layer rotation
+ int[] newPermutation = new int[27];
+ for (int i = 0; i < 27; i++) {
+ newPermutation[i] = mPermutation[mCurrentLayerPermutation[i]];
+ // newPermutation[i] = mCurrentLayerPermutation[mPermutation[i]];
+ }
+ mPermutation = newPermutation;
+ updateLayers();
+
+ } else {
+ mCurrentLayer.setAngle(mCurrentAngle);
+ }
+
+ if (mPrevFramerate != mView.getFramerate()) {
+ mPrevFramerate = mView.getFramerate();
+ // setTitle(mPrevFramerate + "fps");
+ //Log.v("Kubench", mPrevFramerate + "fps");
+ }
+ }
+
+ GLSurfaceView mView;
+ Cube[] mCubes = new Cube[27];
+ // a Layer for each possible move
+ Layer[] mLayers = new Layer[9];
+ // permutations corresponding to a pi/2 rotation of each layer about its axis
+ static int[][] mLayerPermutations = {
+ // permutation for UP layer
+ { 2, 5, 8, 1, 4, 7, 0, 3, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 },
+ // permutation for DOWN layer
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 23, 26, 19, 22, 25, 18, 21, 24 },
+ // permutation for LEFT layer
+ { 6, 1, 2, 15, 4, 5, 24, 7, 8, 3, 10, 11, 12, 13, 14, 21, 16, 17, 0, 19, 20, 9, 22, 23, 18, 25, 26 },
+ // permutation for RIGHT layer
+ { 0, 1, 8, 3, 4, 17, 6, 7, 26, 9, 10, 5, 12, 13, 14, 15, 16, 23, 18, 19, 2, 21, 22, 11, 24, 25, 20 },
+ // permutation for FRONT layer
+ { 0, 1, 2, 3, 4, 5, 24, 15, 6, 9, 10, 11, 12, 13, 14, 25, 16, 7, 18, 19, 20, 21, 22, 23, 26, 17, 8 },
+ // permutation for BACK layer
+ { 18, 9, 0, 3, 4, 5, 6, 7, 8, 19, 10, 1, 12, 13, 14, 15, 16, 17, 20, 11, 2, 21, 22, 23, 24, 25, 26 },
+ // permutation for MIDDLE layer
+ { 0, 7, 2, 3, 16, 5, 6, 25, 8, 9, 4, 11, 12, 13, 14, 15, 22, 17, 18, 1, 20, 21, 10, 23, 24, 19, 26 },
+ // permutation for EQUATOR layer
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 14, 17, 10, 13, 16, 9, 12, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26 },
+ // permutation for SIDE layer
+ { 0, 1, 2, 21, 12, 3, 6, 7, 8, 9, 10, 11, 22, 13, 4, 15, 16, 17, 18, 19, 20, 23, 14, 5, 24, 25, 26 }
+ };
+
+
+
+ // current permutation of starting position
+ int[] mPermutation;
+
+ // for random cube movements
+ Random mRandom = new Random(System.currentTimeMillis());
+ // currently turning layer
+ Layer mCurrentLayer = null;
+ // current and final angle for current Layer animation
+ float mCurrentAngle, mEndAngle;
+ // amount to increment angle
+ float mAngleIncrement;
+ int[] mCurrentLayerPermutation;
+
+ float mPrevFramerate;
+
+ // names for our 9 layers (based on notation from http://www.cubefreak.net/notation.html)
+ static final int kUp = 0;
+ static final int kDown = 1;
+ static final int kLeft = 2;
+ static final int kRight = 3;
+ static final int kFront = 4;
+ static final int kBack = 5;
+ static final int kMiddle = 6;
+ static final int kEquator = 7;
+ static final int kSide = 8;
+
+}