From 9f8981db07e891d21d9a52616403c5740cfd158f Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 22 Aug 2016 03:40:14 -0400 Subject: [PATCH] v0.4.2: VBOs now work with android 2.2 --- SPD-classes/src/main/AndroidManifest.xml | 6 +++ .../java/com/watabou/glwrap/Attribute.java | 7 ++- .../com/watabou/glwrap/FroyoGLES20Fix.java | 50 ++++++++++++++++++ .../java/com/watabou/noosa/NoosaScript.java | 27 ++++++++-- .../main/jniLibs/armeabi/libFroyoGLES20Fix.so | Bin 0 -> 13652 bytes .../src/main/jniLibs/x86/libFroyoGLES20Fix.so | Bin 0 -> 5364 bytes 6 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 SPD-classes/src/main/java/com/watabou/glwrap/FroyoGLES20Fix.java create mode 100644 SPD-classes/src/main/jniLibs/armeabi/libFroyoGLES20Fix.so create mode 100644 SPD-classes/src/main/jniLibs/x86/libFroyoGLES20Fix.so diff --git a/SPD-classes/src/main/AndroidManifest.xml b/SPD-classes/src/main/AndroidManifest.xml index c85e822df..a753de49d 100644 --- a/SPD-classes/src/main/AndroidManifest.xml +++ b/SPD-classes/src/main/AndroidManifest.xml @@ -1,6 +1,12 @@ + + + + diff --git a/SPD-classes/src/main/java/com/watabou/glwrap/Attribute.java b/SPD-classes/src/main/java/com/watabou/glwrap/Attribute.java index 9b495b25a..af2c8a56b 100644 --- a/SPD-classes/src/main/java/com/watabou/glwrap/Attribute.java +++ b/SPD-classes/src/main/java/com/watabou/glwrap/Attribute.java @@ -24,6 +24,7 @@ package com.watabou.glwrap; import java.nio.FloatBuffer; import android.opengl.GLES20; +import android.os.Build; public class Attribute { @@ -50,6 +51,10 @@ public class Attribute { } public void vertexBuffer( int size, int stride, int offset) { - GLES20.glVertexAttribPointer( location, size, GLES20.GL_FLOAT, false, stride * Float.SIZE / 8, offset * Float.SIZE / 8 ); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + GLES20.glVertexAttribPointer(location, size, GLES20.GL_FLOAT, false, stride * Float.SIZE / 8, offset * Float.SIZE / 8); + } else { + FroyoGLES20Fix.glVertexAttribPointer(location, size, GLES20.GL_FLOAT, false, stride * Float.SIZE / 8, offset * Float.SIZE / 8); + } } } diff --git a/SPD-classes/src/main/java/com/watabou/glwrap/FroyoGLES20Fix.java b/SPD-classes/src/main/java/com/watabou/glwrap/FroyoGLES20Fix.java new file mode 100644 index 000000000..337e572fe --- /dev/null +++ b/SPD-classes/src/main/java/com/watabou/glwrap/FroyoGLES20Fix.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2016 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.watabou.glwrap; + +//This class exists because the back-end OpenGL implementation (written in C) +// supports VBO operations (along with the rest of GLES 2.0) since android 2.2 (Froyo, api 8), +// but for some reason the Java calls for these methods were only added in 2.3 (Gingerbread, api 9) + +//So this class is here specifically to reference an armabi/x86 compiled binary +// which gives us Java hooks for VBOs on android 2.2 + +//...I don't know what google engineer forgot to put the java hooks in android 2.2 back in 2010, +// but you know who you are and this class is your fault. + +//Note that compiled binares are included with this source, +// so the android NDK is not needed to compile this project + +//DO NOT REFERENCE THIS CLASS ON DEVICES API 9 AND ABOVE, use android.opengl.GLES20 instead. +@SuppressWarnings("JniMissingFunction") +public class FroyoGLES20Fix { + + static + { + System.loadLibrary("FroyoGLES20Fix"); + } + + native public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, int offset); + + native public static void glDrawElements(int mode, int count, int type, int offset); + +} diff --git a/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java b/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java index a59e5a558..63900ff52 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java @@ -25,8 +25,10 @@ import java.nio.FloatBuffer; import java.nio.ShortBuffer; import android.opengl.GLES20; +import android.os.Build; import com.watabou.glscripts.Script; +import com.watabou.glwrap.FroyoGLES20Fix; import com.watabou.glwrap.Attribute; import com.watabou.glwrap.Quad; import com.watabou.glwrap.Uniform; @@ -85,7 +87,6 @@ public class NoosaScript extends Script { Quad.bindIndices(); } - //FIXME need to do some voodoo to get this working properly on android 2.2 public void drawQuad( FloatBuffer vertices ) { vertices.position( 0 ); @@ -94,7 +95,11 @@ public class NoosaScript extends Script { vertices.position( 2 ); aUV.vertexPointer( 2, 4, vertices ); - GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE, GLES20.GL_UNSIGNED_SHORT, 0 ); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE, GLES20.GL_UNSIGNED_SHORT, 0 ); + } else { + FroyoGLES20Fix.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE, GLES20.GL_UNSIGNED_SHORT, 0 ); + } } @@ -109,7 +114,11 @@ public class NoosaScript extends Script { buffer.release(); - GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE, GLES20.GL_UNSIGNED_SHORT, 0 ); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE, GLES20.GL_UNSIGNED_SHORT, 0 ); + } else { + FroyoGLES20Fix.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE, GLES20.GL_UNSIGNED_SHORT, 0 ); + } } public void drawQuadSet( FloatBuffer vertices, int size ) { @@ -124,7 +133,11 @@ public class NoosaScript extends Script { vertices.position( 2 ); aUV.vertexPointer( 2, 4, vertices ); - GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE * size, GLES20.GL_UNSIGNED_SHORT, 0 ); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE * size, GLES20.GL_UNSIGNED_SHORT, 0 ); + } else { + FroyoGLES20Fix.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE * size, GLES20.GL_UNSIGNED_SHORT, 0 ); + } } @@ -143,7 +156,11 @@ public class NoosaScript extends Script { buffer.release(); - GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE * length, GLES20.GL_UNSIGNED_SHORT, Quad.SIZE * offset ); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + GLES20.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE * length, GLES20.GL_UNSIGNED_SHORT, Quad.SIZE * offset ); + } else { + FroyoGLES20Fix.glDrawElements( GLES20.GL_TRIANGLES, Quad.SIZE * length, GLES20.GL_UNSIGNED_SHORT, Quad.SIZE * offset ); + } } public void lighting( float rm, float gm, float bm, float am, float ra, float ga, float ba, float aa ) { diff --git a/SPD-classes/src/main/jniLibs/armeabi/libFroyoGLES20Fix.so b/SPD-classes/src/main/jniLibs/armeabi/libFroyoGLES20Fix.so new file mode 100644 index 0000000000000000000000000000000000000000..c71ffc32134a00499645a3ddcf58aa70554c4b68 GIT binary patch literal 13652 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 bk)kz-WB(~q<1$vQ0e#yMH>rZa=_maI=jmuZ literal 0 HcmV?d00001