hyperrogue/hyperroid/app/src/main/java/com/roguetemple/hyperroid/HyperRenderer.java

121 lines
4.0 KiB
Java

package com.roguetemple.hyperroid;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
// import android.graphics.Paint;
// import android.graphics.Path;
import android.graphics.Typeface;
import android.opengl.GLSurfaceView;
// bimport android.widget.Toast;
import com.android.texample.GLText;
public class HyperRenderer implements GLSurfaceView.Renderer {
int width, height;
HyperRogue game;
private GLText glText; // A GLText Instance
int [] graphdata;
int gdpos;
int gdpop() { return graphdata[gdpos++]; }
public void onDrawFrame(GL10 gl) {
if(game.forceCanvas) return;
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
synchronized(game) {
game.hv.updateGame();
game.draw();
graphdata = game.loadMap();
}
if(graphdata == null) return;
// Set to ModelView mode
gl.glMatrixMode( GL10.GL_MODELVIEW ); // Activate Model View Matrix
gl.glLoadIdentity(); // Load Identity Matrix
// enable texture + alpha blending
// NOTE: this is required for text rendering! we could incorporate it into
// the GLText class, but then it would be called multiple times (which impacts performance).
gl.glEnable( GL10.GL_TEXTURE_2D ); // Enable Texture Mapping
gl.glEnable( GL10.GL_BLEND ); // Enable Alpha Blend
gl.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); // Set Alpha Blend Function
gl.glMatrixMode( GL10.GL_PROJECTION ); // Activate Projection Matrix
gl.glLoadIdentity(); // Load Identity Matrix
gl.glOrthof( // Set Ortho Projection (Left,Right,Bottom,Top,Front,Back)
0, width,
0, height,
1.0f, -1.0f
);
gdpos = 0;
while(gdpos < graphdata.length) {
switch(gdpop()) {
case 2: {
int x = gdpop();
int y = gdpop();
int al = gdpop();
int col = gdpop() + 0xFF000000;
int size = gdpop();
int b = gdpop();
int n = gdpop();
StringBuffer ss = new StringBuffer();
for(int i=0; i<n; i++) {
char c = (char) gdpop();
ss.append(c);
}
String s = ss.toString();
y = height - y;
glText.setScale(size / 48.0f);
if(b > 0) {
glText.begin(0f, 0f, 0f, 1f);
glText.drawAlign(s, (float)(x-1), (float)y, al);
glText.drawAlign(s, (float)(x+1), (float)y, al);
glText.drawAlign(s, (float)x, (float)(y-1), al);
glText.drawAlign(s, (float)x, (float)(y+1), al);
glText.end();
}
glText.begin(
(col & 0xFF0000) / (float)0xFF0000,
(col & 0xFF00) / (float)0xFF00,
(col & 0xFF) / (float)0xFF,
1.0f );
glText.drawAlign(s, (float) x, (float) y, al);
glText.end();
}
break;
}}
// disable texture + alpha
gl.glDisable( GL10.GL_BLEND ); // Disable Alpha Blend
gl.glDisable( GL10.GL_TEXTURE_2D ); // Disable Texture Mapping
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
// Save width and height
this.width = width; // Save Current Width
this.height = height; // Save Current Height
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
glText = new GLText( gl );
glText.load(Typeface.DEFAULT_BOLD, 48, 2, 2 ); // Create Font (Height: 48 Pixels / X+Y Padding 2 Pixels)
}
}