// Copyright 2009 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 com.google.android.stardroid.renderer;
import android.content.res.Resources;
import android.graphics.Paint;
import com.google.android.stardroid.renderer.util.IndexBuffer;
import com.google.android.stardroid.renderer.util.LabelMaker;
import com.google.android.stardroid.renderer.util.TextureManager;
import com.google.android.stardroid.renderer.util.TextureReference;
import com.google.android.stardroid.renderer.util.VertexBuffer;
import javax.microedition.khronos.opengles.GL10;
/**
* Manages rendering of which appears at fixed points on the screen, rather
* than text which appears at fixed points in the world.
*
* @author James Powell
*
*/
public class LabelOverlayManager {
private Label[] mLabels = null;
private LabelMaker mLabelMaker = new LabelMaker(true);
private Paint mLabelPaint = new Paint();
private TextureReference mTexture = null;
private VertexBuffer mVertexBuffer = null;
private IndexBuffer mIndexBuffer = null;
public static class Label extends LabelMaker.LabelData {
public Label(String text, int color, int size) {
super(text, color, size);
}
public boolean enabled() {
return mEnabled;
}
public void setEnabled(boolean enabled) {
mEnabled = enabled;
}
public void setPosition(int x, int y) {
mX = x;
mY = y;
}
public void setAlpha(float alpha) {
mAlpha = alpha;
}
private float getAlpha() {
return mAlpha;
}
private boolean mEnabled = true;
private int mX = 0, mY = 0;
private float mAlpha = 1;
}
public LabelOverlayManager() {
mLabelPaint.setAntiAlias(true);
mVertexBuffer = new VertexBuffer(4, false);
mIndexBuffer = new IndexBuffer(6);
mVertexBuffer.addPoint(0, 0, 0); // Bottom left
mVertexBuffer.addPoint(0, 1, 0); // Top left
mVertexBuffer.addPoint(1, 0, 0); // Bottom right
mVertexBuffer.addPoint(1, 1, 0); // Top right
// Triangle one: bottom left, top left, bottom right.
mIndexBuffer.addIndex((short) 0);
mIndexBuffer.addIndex((short) 1);
mIndexBuffer.addIndex((short) 2);
// Triangle two: bottom right, top left, top right.
mIndexBuffer.addIndex((short) 2);
mIndexBuffer.addIndex((short) 1);
mIndexBuffer.addIndex((short) 3);
}
public void initialize(GL10 gl, Label[] labels, Resources res,
TextureManager textureManager) {
mLabels = labels.clone();
mTexture = mLabelMaker.initialize(gl, mLabelPaint, labels, res, textureManager);
}
public void releaseTexture(GL10 gl) {
// TODO(jpowell): Figure out if LabelMaker should have a shutdown() method
// and delete the texture or if I should do it myself.
if (mTexture != null) {
mLabelMaker.shutdown(gl);
mTexture = null;
}
}
public void draw(GL10 gl, int screenWidth, int screenHeight) {
if (mLabels == null || mTexture == null) {
return;
}
gl.glEnable(GL10.GL_TEXTURE_2D);
mTexture.bind(gl);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_MODULATE);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
// Change to orthographic projection, where the units in model view space
// are the same as in screen space.
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glOrthof(0, screenWidth, 0, screenHeight, -100, 100);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPushMatrix();
for (Label label : mLabels) {
if (label.enabled()) {
int x = label.mX - label.getWidthInPixels() / 2;
int y = label.mY;
gl.glLoadIdentity();
// Move the label to the correct offset.
gl.glTranslatef(x, y, 0.0f);
// Scale the label to the correct size.
gl.glScalef(label.getWidthInPixels(), label.getHeightInPixels(), 0.0f);
// Set the alpha for the label.
gl.glColor4f(1, 1, 1, label.getAlpha());
// Draw the label.
mVertexBuffer.set(gl);
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, label.getTexCoords());
mIndexBuffer.draw(gl, GL10.GL_TRIANGLES);
}
}
// Restore the old matrices.
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPopMatrix();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
gl.glDisable(GL10.GL_BLEND);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisable(GL10.GL_TEXTURE_2D);
}
}