From 525efcb5aaddd5e2f84ad3078a92191c501aa168 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 09:24:03 -0700 Subject: [PATCH 01/17] Added Folder "Android_Java" that will contain book samples in Java only, without any native/JNI code. Added Java implementation of "Common" with basic utility methods updated for GLES 3.0. More methods might be added to it as needed by other samples. --- Android_Java/Common/.classpath | 5 + Android_Java/Common/.project | 33 +++ Android_Java/Common/AndroidManifest.xml | 16 ++ Android_Java/Common/default.properties | 12 + Android_Java/Common/proguard.cfg | 34 +++ .../Common/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../Common/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../Common/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes Android_Java/Common/res/values/strings.xml | 4 + .../src/com/openglesbook/common/ESShader.java | 235 ++++++++++++++++++ .../src/com/openglesbook/common/ESShapes.java | 175 +++++++++++++ .../com/openglesbook/common/ESTransform.java | 214 ++++++++++++++++ 12 files changed, 728 insertions(+) create mode 100644 Android_Java/Common/.classpath create mode 100644 Android_Java/Common/.project create mode 100644 Android_Java/Common/AndroidManifest.xml create mode 100644 Android_Java/Common/default.properties create mode 100644 Android_Java/Common/proguard.cfg create mode 100644 Android_Java/Common/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Common/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Common/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Common/res/values/strings.xml create mode 100644 Android_Java/Common/src/com/openglesbook/common/ESShader.java create mode 100644 Android_Java/Common/src/com/openglesbook/common/ESShapes.java create mode 100644 Android_Java/Common/src/com/openglesbook/common/ESTransform.java diff --git a/Android_Java/Common/.classpath b/Android_Java/Common/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Common/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Common/.project b/Android_Java/Common/.project new file mode 100644 index 0000000..4a3847a --- /dev/null +++ b/Android_Java/Common/.project @@ -0,0 +1,33 @@ + + + Common + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Common/AndroidManifest.xml b/Android_Java/Common/AndroidManifest.xml new file mode 100644 index 0000000..c3572aa --- /dev/null +++ b/Android_Java/Common/AndroidManifest.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Common/default.properties b/Android_Java/Common/default.properties new file mode 100644 index 0000000..32d7696 --- /dev/null +++ b/Android_Java/Common/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library=true diff --git a/Android_Java/Common/proguard.cfg b/Android_Java/Common/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Common/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Common/res/drawable-hdpi/icon.png b/Android_Java/Common/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Common/res/drawable-ldpi/icon.png b/Android_Java/Common/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 zcmV;s21NOZP)AReP91Tc8>~sHP8V>Ys(CF=aT`Sk=;|pS}XrJPb~T1dys{sdO&0YpQBSz*~us zcN*3-J_EnE1cxrXiq*F~jZje~rkAe3vf3>;eR)3?Ox=jK*jEU7Do|T`2NqP{56w(* zBAf)rvPB_7rsfeKd0^!CaR%BHUC$tsP9m8a!i@4&TxxzagzsYHJvblx4rRUu#0Jlz zclZJwdC}7S3BvwaIMTiwb!98zRf|zoya>NudJkDGgEYs=q*HmC)>GExofw=92}s;l z_YgKLUT5`<1RBwq{f)K~I%M=gRE6d)b5BP`8{u9x0-wsG%H)w^ zRU7n9FwtlfsZSjiSB(k8~Y5+O>dyoSI477Ly?|FR?m))C!ci%BtY!2Sst8Uri#|SFX&)8{_Ou2 z9r5p3Vz9_GY#%D>%huqp_>U}K45YGy__TE!HZA@bMxX~@{;>cGYRgH~Ih*vd7EgV7h6Pg$#$lH+5=^lj{W80p{{l+;{7_t5cv3xVUy zl_BY4ht1JH*EEeRS{VwTC(QFIVu8zF&P8O$gJsMgsSO35SVvBrX`Vah$Yz2-5T>-`4DJNH;N zlSSY8-mfty+|1~*;BtTwLz_w5 z+lRv)J28~G%ouyvca(@|{2->WsPii&79&nju7ITE6hMX4AQc{|KqZN#)aAvemg3IZ zCr}Y+!r}JU&^>U1C2WyZC<=47itSYQ`?$5{VH?mtFMFFExfYTsfqK%*WzH@Onc#i` zI@a|rm-WbKk{5my{mF}H>Duc$bit&yLAgFfqo2vVbm~?FeG#0F?dSP*kxSo0Ff!o@ z(C}B;r&6pa-NY4;y~5lX8g&*MYQ>yLGd^tDWC4(sGy$Ow-*!eh%xt;>ve|J1q$*w< zh;B#cz!6l2=5bkX#nJ9PJQ`ew8t>7z$bxqf*QB=l2_UB$hK|1EIfloN-jQ=qcwChF zYAkkyp=;FwcnUB3v0=*tMYMA(HdyQ`Og{P|8RRXpj5bgrSmEzSMfBn+{{vpNxw?;5UX;iv9sYxy_`IQHs$i<61a_iv^L>h8s-`D(`e@|IgS*Fj zNGM876Gf;3D8*1UX9a%v>yJKD*QkCwW2AirU(L{qNA)JghmGItc;(H<$!ABY&gBy1vJIEUj-b8%el*o|VkG)LqNx#TG>Jvj^jIte!!+RY z)T4j$7+PoF1AkRBf}R#^T=-q|PaK1$c<4UH)Hpq3$4WA|xtr!ZQLC=*vNE>O6E9kp+5X0eKB$6>C(lPwI@3#oY zhS_%x7e|j!$yG?ECXmh~EH~^OeuK}+sWoJse3Z3?ha3n`MM9KvA?uqpEnBg4Q46)7 zM$p%a$@l;+O}vfvx%XjH`}a{(-HHth9!JaUwV0*VqGR48^gWNYN<&~7x)y$e!X>e` zZ5!6KZoxbKuV9XUDI%#M1~IVh?pNSdeb~6@$y`v|yk=XK+fHxnDqnUK4&=QRNyIVf zYbDM*cI>~qIy*a7=z7uqkw@agd(<=y-Q7L!ty_23SGdXmahO<;N=wB+j;lNm%=OHC zy zU|>La6h%92y4IPufI$9>Xu!@y`TaNgtg&41@PwMwBdmSm7)xAWDLoqjZ==P2#*k7! z3o1)cVSI3KP_!?d8G^Lg0FtLXC~JYdxi|c%h~lXEixY=%VSFF@!*3&&9>(Rb|iK54Cx5;s~PY5iaV1het%w`dgQFBAJ;aFK zImQC}(|QaCFYUm1JVfzSc)ebv=)ObI)0jwJb``}Zj9J0n0Xgn*Zc(rFM9$xh_makZbm-at_v5^SW zM1y1SW@%+FuIy*WR)i3A2N_q;(YO`O!A|Ts^%z}9ZepCj3ytlw#x%N_fNrKKtPh`< z|1{UqF`4LxHaCQ79+E=uUXCOZ35jAMRz%R%0(P!0FMv=sk>Nr8%+OzY^c-M9@+fz=G`qa@v4sF5u-2289-#$**LWnyNNDwDf1( zkUiMnw|y$tn>pQP=Vn!#|17L^5AGrjtBkN$D@v)Z7LXc5EFhLB4<;7Wehh)CMqX|W zqsiZaO^benJ_hwa&V0ub$-_HUk**?g6fm9|!@kguU6*zhK)$qn-<3*kFrYPIaqR=V zUaUvk>@F_89b@tHs8R!*QKY;INJ<2_U+K6Ca3e9Gsl2{qY0%a7J?uICWgHuLfj+MB z=GkAN1&ifT#2u}B+2S#~$5jA(Qn^;H%CCmIae4AE-Dsng|Hl*Ov!z72k3ZnJs{pp| z+pW`DDueC#mEWOf=ucJ!dTL}hzOeiS-i?m2E;`EKz4<&Lu~NnW?peqVU^@<+T3KKu z{yrI%Qy-Z%HEvLUz}n^~m?7x`xuCtNR#L2En!T>dQtIKdS#V-Hzt3RtwTeYtmQ&dR z6qXZvac*oc@BUYEH%@Ylv_1&tSjkbzzU6*h1(3^C`;1z;g_SmOtclS?KWk2VYE zM*oS<=C483XckW?GN|1jfh3Ro(h + + Common + diff --git a/Android_Java/Common/src/com/openglesbook/common/ESShader.java b/Android_Java/Common/src/com/openglesbook/common/ESShader.java new file mode 100644 index 0000000..357bd83 --- /dev/null +++ b/Android_Java/Common/src/com/openglesbook/common/ESShader.java @@ -0,0 +1,235 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Dan Ginsburg, Dave Shreiner, Aaftab Munshi +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// ESShader +// +// Utility functions for loading GLSL ES 3.0 shaders and creating program objects. +// + +package com.openglesbook.common; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import android.content.Context; +import android.opengl.GLES30; +import android.util.Log; + +public class ESShader { + // + /// + /// \brief Read a shader source into a String + /// \param context Application context + /// \param fileName Name of shader file + /// \return A String object containing shader source, otherwise null + // + private static String readShader(Context context, String fileName) { + String shaderSource = null; + + if (fileName == null) + return shaderSource; + + // Read the shader file from assets + InputStream is = null; + byte [] buffer; + + try { + is = context.getAssets().open(fileName); + + // Create a buffer that has the same size as the InputStream + buffer = new byte[is.available()]; + + // Read the text file as a stream, into the buffer + is.read(buffer); + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + // Write this buffer to the output stream + os.write (buffer); + + // Close input and output streams + os.close(); + is.close(); + + shaderSource = os.toString(); + } catch (IOException ioe) { + is = null; + } + + if (is == null) + return shaderSource; + + return shaderSource; + } + + // + /// + /// \brief Load a shader, check for compile errors, print error messages to + /// output log + /// \param type Type of shader (GL_VERTEX_SHADER or GL_FRAGMENT_SHADER) + /// \param shaderSrc Shader source string + /// \return A new shader object on success, 0 on failure + // + public static int loadShader(int type, String shaderSrc) { + int shader; + int[] compiled = new int[1]; + + // Create the shader object + shader = GLES30.glCreateShader(type); + + if (shader == 0) + return 0; + + // Load the shader source + GLES30.glShaderSource(shader, shaderSrc); + + // Compile the shader + GLES30.glCompileShader(shader); + + // Check the compile status + GLES30.glGetShaderiv(shader, GLES30.GL_COMPILE_STATUS, compiled, 0); + + if (compiled[0] == 0) { + Log.e("ESShader", GLES30.glGetShaderInfoLog(shader)); + GLES30.glDeleteShader(shader); + return 0; + } + return shader; + } + + // + /// + /// \brief Load a vertex and fragment shader, create a program object, link + /// program. + /// Errors output to log. + /// \param vertShaderSrc Vertex shader source code + /// \param fragShaderSrc Fragment shader source code + /// \return A new program object linked with the vertex/fragment shader + /// pair, 0 on failure + // + public static int loadProgram(String vertShaderSrc, String fragShaderSrc) { + int vertexShader; + int fragmentShader; + int programObject; + int[] linked = new int[1]; + + // Load the vertex/fragment shaders + vertexShader = loadShader(GLES30.GL_VERTEX_SHADER, vertShaderSrc); + if (vertexShader == 0) + return 0; + + fragmentShader = loadShader(GLES30.GL_FRAGMENT_SHADER, fragShaderSrc); + if (fragmentShader == 0) { + GLES30.glDeleteShader(vertexShader); + return 0; + } + + // Create the program object + programObject = GLES30.glCreateProgram(); + + if (programObject == 0) + return 0; + + GLES30.glAttachShader(programObject, vertexShader); + GLES30.glAttachShader(programObject, fragmentShader); + + // Link the program + GLES30.glLinkProgram(programObject); + + // Check the link status + GLES30.glGetProgramiv(programObject, GLES30.GL_LINK_STATUS, linked, 0); + + if (linked[0] == 0) { + Log.e("ESShader", "Error linking program:"); + Log.e("ESShader", GLES30.glGetProgramInfoLog(programObject)); + GLES30.glDeleteProgram(programObject); + return 0; + } + + // Free up no longer needed shader resources + GLES30.glDeleteShader(vertexShader); + GLES30.glDeleteShader(fragmentShader); + + return programObject; + } + + // + /// + /// \brief Load a vertex and fragment shader from "assets", create a program object, link + /// program. + /// Errors output to log. + /// \param vertShaderFileName Vertex shader source file name + /// \param fragShaderFileName Fragment shader source file name + /// \return A new program object linked with the vertex/fragment shader + /// pair, 0 on failure + // + public static int loadProgramFromAsset(Context context, String vertexShaderFileName, String fragShaderFileName) { + int vertexShader; + int fragmentShader; + int programObject; + int[] linked = new int[1]; + + String vertShaderSrc = null; + String fragShaderSrc = null; + + // Read vertex shader from assets + vertShaderSrc = readShader(context, vertexShaderFileName); + + if (vertShaderSrc == null) + return 0; + + // Read fragment shader from assets + fragShaderSrc = readShader(context, fragShaderFileName); + + if (fragShaderSrc == null) + return 0; + + // Load the vertex shader + vertexShader = loadShader(GLES30.GL_VERTEX_SHADER, vertShaderSrc); + if (vertexShader == 0) + return 0; + + // Load the fragment shader + fragmentShader = loadShader(GLES30.GL_FRAGMENT_SHADER, fragShaderSrc); + if (fragmentShader == 0) { + GLES30.glDeleteShader(vertexShader); + return 0; + } + + // Create the program object + programObject = GLES30.glCreateProgram(); + + if (programObject == 0) + return 0; + + GLES30.glAttachShader(programObject, vertexShader); + GLES30.glAttachShader(programObject, fragmentShader); + + // Link the program + GLES30.glLinkProgram(programObject); + + // Check the link status + GLES30.glGetProgramiv(programObject, GLES30.GL_LINK_STATUS, linked, 0); + + if (linked[0] == 0) { + Log.e("ESShader", "Error linking program:"); + Log.e("ESShader", GLES30.glGetProgramInfoLog(programObject)); + GLES30.glDeleteProgram(programObject); + return 0; + } + + // Free up no longer needed shader resources + GLES30.glDeleteShader(vertexShader); + GLES30.glDeleteShader(fragmentShader); + + return programObject; + } +} diff --git a/Android_Java/Common/src/com/openglesbook/common/ESShapes.java b/Android_Java/Common/src/com/openglesbook/common/ESShapes.java new file mode 100644 index 0000000..724b573 --- /dev/null +++ b/Android_Java/Common/src/com/openglesbook/common/ESShapes.java @@ -0,0 +1,175 @@ +// +// Book: OpenGL(R) ES 2.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// ESShapes +// +// Utility cass for generating shapes +// + +package com.openglesbook.common; + +import java.lang.Math; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +public class ESShapes { + + public int genSphere(int numSlices, float radius) { + int i; + int j; + int numParallels = numSlices; + int numVertices = (numParallels + 1) * (numSlices + 1); + int numIndices = numParallels * numSlices * 6; + float angleStep = ((2.0f * (float) Math.PI) / numSlices); + + // Allocate memory for buffers + mVertices = ByteBuffer.allocateDirect(numVertices * 3 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mNormals = ByteBuffer.allocateDirect(numVertices * 3 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mTexCoords = ByteBuffer.allocateDirect(numVertices * 2 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mIndices = ByteBuffer.allocateDirect(numIndices * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + + for (i = 0; i < numParallels + 1; i++) { + for (j = 0; j < numSlices + 1; j++) { + int vertex = (i * (numSlices + 1) + j) * 3; + + mVertices + .put(vertex + 0, + (float) (radius + * Math.sin(angleStep * (float) i) * Math + .sin(angleStep * (float) j))); + + mVertices.put(vertex + 1, + (float) (radius * Math.cos(angleStep * (float) i))); + mVertices + .put(vertex + 2, + (float) (radius + * Math.sin(angleStep * (float) i) * Math + .cos(angleStep * (float) j))); + + mNormals.put(vertex + 0, mVertices.get(vertex + 0) / radius); + mNormals.put(vertex + 1, mVertices.get(vertex + 1) / radius); + mNormals.put(vertex + 2, mVertices.get(vertex + 2) / radius); + + int texIndex = (i * (numSlices + 1) + j) * 2; + mTexCoords.put(texIndex + 0, (float) j / (float) numSlices); + mTexCoords.put(texIndex + 1, (1.0f - (float) i) + / (float) (numParallels - 1)); + } + } + + int index = 0; + for (i = 0; i < numParallels; i++) { + for (j = 0; j < numSlices; j++) { + mIndices.put(index++, (short) (i * (numSlices + 1) + j)); + mIndices.put(index++, (short) ((i + 1) * (numSlices + 1) + j)); + mIndices.put(index++, + (short) ((i + 1) * (numSlices + 1) + (j + 1))); + + mIndices.put(index++, (short) (i * (numSlices + 1) + j)); + mIndices.put(index++, + (short) ((i + 1) * (numSlices + 1) + (j + 1))); + mIndices.put(index++, (short) (i * (numSlices + 1) + (j + 1))); + + } + } + mNumIndices = numIndices; + + return numIndices; + } + + public int genCube(float scale) { + int i; + int numVertices = 24; + int numIndices = 36; + + float[] cubeVerts = { -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, + -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, + 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, + -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, + -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, + 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, + -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, + 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, }; + + float[] cubeNormals = { 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, }; + + float[] cubeTex = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, }; + + // Allocate memory for buffers + mVertices = ByteBuffer.allocateDirect(numVertices * 3 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mNormals = ByteBuffer.allocateDirect(numVertices * 3 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mTexCoords = ByteBuffer.allocateDirect(numVertices * 2 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mIndices = ByteBuffer.allocateDirect(numIndices * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + + mVertices.put(cubeVerts).position(0); + for (i = 0; i < numVertices * 3; i++) { + mVertices.put(i, mVertices.get(i) * scale); + } + + mNormals.put(cubeNormals).position(0); + mTexCoords.put(cubeTex).position(0); + + short[] cubeIndices = { 0, 2, 1, 0, 3, 2, 4, 5, 6, 4, 6, 7, 8, 9, 10, + 8, 10, 11, 12, 15, 14, 12, 14, 13, 16, 17, 18, 16, 18, 19, 20, + 23, 22, 20, 22, 21 }; + + mIndices.put(cubeIndices).position(0); + mNumIndices = numIndices; + return numIndices; + } + + public FloatBuffer getVertices() { + return mVertices; + } + + public FloatBuffer getNormals() { + return mNormals; + } + + public FloatBuffer getTexCoords() { + return mTexCoords; + } + + public ShortBuffer getIndices() { + return mIndices; + } + + public int getNumIndices() { + return mNumIndices; + } + + // Member variables + private FloatBuffer mVertices; + private FloatBuffer mNormals; + private FloatBuffer mTexCoords; + private ShortBuffer mIndices; + private int mNumIndices; +} diff --git a/Android_Java/Common/src/com/openglesbook/common/ESTransform.java b/Android_Java/Common/src/com/openglesbook/common/ESTransform.java new file mode 100644 index 0000000..212f1e0 --- /dev/null +++ b/Android_Java/Common/src/com/openglesbook/common/ESTransform.java @@ -0,0 +1,214 @@ +package com.openglesbook.common; + +import java.lang.Math; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +public class ESTransform { + public ESTransform() { + mMatrixFloatBuffer = ByteBuffer.allocateDirect(16 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + } + + public void scale(float sx, float sy, float sz) { + mMatrix[0 * 4 + 0] *= sx; + mMatrix[0 * 4 + 1] *= sx; + mMatrix[0 * 4 + 2] *= sx; + mMatrix[0 * 4 + 3] *= sx; + + mMatrix[1 * 4 + 0] *= sy; + mMatrix[1 * 4 + 1] *= sy; + mMatrix[1 * 4 + 2] *= sy; + mMatrix[1 * 4 + 3] *= sy; + + mMatrix[2 * 4 + 0] *= sz; + mMatrix[2 * 4 + 1] *= sz; + mMatrix[2 * 4 + 2] *= sz; + mMatrix[2 * 4 + 3] *= sz; + } + + public void translate(float tx, float ty, float tz) { + mMatrix[3 * 4 + 0] += (mMatrix[0 * 4 + 0] * tx + mMatrix[1 * 4 + 0] + * ty + mMatrix[2 * 4 + 0] * tz); + mMatrix[3 * 4 + 1] += (mMatrix[0 * 4 + 1] * tx + mMatrix[1 * 4 + 1] + * ty + mMatrix[2 * 4 + 1] * tz); + mMatrix[3 * 4 + 2] += (mMatrix[0 * 4 + 2] * tx + mMatrix[1 * 4 + 2] + * ty + mMatrix[2 * 4 + 2] * tz); + mMatrix[3 * 4 + 3] += (mMatrix[0 * 4 + 3] * tx + mMatrix[1 * 4 + 3] + * ty + mMatrix[2 * 4 + 3] * tz); + } + + public void rotate(float angle, float x, float y, float z) { + float sinAngle, cosAngle; + float mag = (float) Math.sqrt((double) (x * x + y * y + z * z)); + + sinAngle = (float) Math.sin((double) (angle * Math.PI / 180.0)); + cosAngle = (float) Math.cos((double) (angle * Math.PI / 180.0)); + if (mag > 0.0f) { + float xx, yy, zz, xy, yz, zx, xs, ys, zs; + float oneMinusCos; + float[] rotMat = new float[16]; + + x /= mag; + y /= mag; + z /= mag; + + xx = x * x; + yy = y * y; + zz = z * z; + xy = x * y; + yz = y * z; + zx = z * x; + xs = x * sinAngle; + ys = y * sinAngle; + zs = z * sinAngle; + oneMinusCos = 1.0f - cosAngle; + + rotMat[0 * 4 + 0] = (oneMinusCos * xx) + cosAngle; + rotMat[0 * 4 + 1] = (oneMinusCos * xy) - zs; + rotMat[0 * 4 + 2] = (oneMinusCos * zx) + ys; + rotMat[0 * 4 + 3] = 0.0F; + + rotMat[1 * 4 + 0] = (oneMinusCos * xy) + zs; + rotMat[1 * 4 + 1] = (oneMinusCos * yy) + cosAngle; + rotMat[1 * 4 + 2] = (oneMinusCos * yz) - xs; + rotMat[1 * 4 + 3] = 0.0F; + + rotMat[2 * 4 + 0] = (oneMinusCos * zx) - ys; + rotMat[2 * 4 + 1] = (oneMinusCos * yz) + xs; + rotMat[2 * 4 + 2] = (oneMinusCos * zz) + cosAngle; + rotMat[2 * 4 + 3] = 0.0F; + + rotMat[3 * 4 + 0] = 0.0F; + rotMat[3 * 4 + 1] = 0.0F; + rotMat[3 * 4 + 2] = 0.0F; + rotMat[3 * 4 + 3] = 1.0F; + + matrixMultiply(rotMat, mMatrix); + } + } + + public void frustum(float left, float right, float bottom, float top, + float nearZ, float farZ) { + float deltaX = right - left; + float deltaY = top - bottom; + float deltaZ = farZ - nearZ; + float[] frust = new float[16]; + + if ((nearZ <= 0.0f) || (farZ <= 0.0f) || (deltaX <= 0.0f) + || (deltaY <= 0.0f) || (deltaZ <= 0.0f)) + return; + + frust[0 * 4 + 0] = 2.0f * nearZ / deltaX; + frust[0 * 4 + 1] = frust[0 * 4 + 2] = frust[0 * 4 + 3] = 0.0f; + + frust[1 * 4 + 1] = 2.0f * nearZ / deltaY; + frust[1 * 4 + 0] = frust[1 * 4 + 2] = frust[1 * 4 + 3] = 0.0f; + + frust[2 * 4 + 0] = (right + left) / deltaX; + frust[2 * 4 + 1] = (top + bottom) / deltaY; + frust[2 * 4 + 2] = -(nearZ + farZ) / deltaZ; + frust[2 * 4 + 3] = -1.0f; + + frust[3 * 4 + 2] = -2.0f * nearZ * farZ / deltaZ; + frust[3 * 4 + 0] = frust[3 * 4 + 1] = frust[3 * 4 + 3] = 0.0f; + + matrixMultiply(frust, mMatrix); + } + + public void perspective(float fovy, float aspect, float nearZ, float farZ) { + float frustumW, frustumH; + + frustumH = (float) Math.tan(fovy / 360.0 * Math.PI) * nearZ; + frustumW = frustumH * aspect; + + frustum(-frustumW, frustumW, -frustumH, frustumH, nearZ, farZ); + } + + public void ortho(float left, float right, float bottom, float top, + float nearZ, float farZ) { + float deltaX = right - left; + float deltaY = top - bottom; + float deltaZ = farZ - nearZ; + float[] orthoMat = makeIdentityMatrix(); + + if ((deltaX == 0.0f) || (deltaY == 0.0f) || (deltaZ == 0.0f)) + return; + + orthoMat[0 * 4 + 0] = 2.0f / deltaX; + orthoMat[3 * 4 + 0] = -(right + left) / deltaX; + orthoMat[1 * 4 + 1] = 2.0f / deltaY; + orthoMat[3 * 4 + 1] = -(top + bottom) / deltaY; + orthoMat[2 * 4 + 2] = -2.0f / deltaZ; + orthoMat[3 * 4 + 2] = -(nearZ + farZ) / deltaZ; + + matrixMultiply(orthoMat, mMatrix); + } + + public void matrixMultiply(float[] srcA, float[] srcB) { + float[] tmp = new float[16]; + int i; + + for (i = 0; i < 4; i++) { + tmp[i * 4 + 0] = (srcA[i * 4 + 0] * srcB[0 * 4 + 0]) + + (srcA[i * 4 + 1] * srcB[1 * 4 + 0]) + + (srcA[i * 4 + 2] * srcB[2 * 4 + 0]) + + (srcA[i * 4 + 3] * srcB[3 * 4 + 0]); + + tmp[i * 4 + 1] = (srcA[i * 4 + 0] * srcB[0 * 4 + 1]) + + (srcA[i * 4 + 1] * srcB[1 * 4 + 1]) + + (srcA[i * 4 + 2] * srcB[2 * 4 + 1]) + + (srcA[i * 4 + 3] * srcB[3 * 4 + 1]); + + tmp[i * 4 + 2] = (srcA[i * 4 + 0] * srcB[0 * 4 + 2]) + + (srcA[i * 4 + 1] * srcB[1 * 4 + 2]) + + (srcA[i * 4 + 2] * srcB[2 * 4 + 2]) + + (srcA[i * 4 + 3] * srcB[3 * 4 + 2]); + + tmp[i * 4 + 3] = (srcA[i * 4 + 0] * srcB[0 * 4 + 3]) + + (srcA[i * 4 + 1] * srcB[1 * 4 + 3]) + + (srcA[i * 4 + 2] * srcB[2 * 4 + 3]) + + (srcA[i * 4 + 3] * srcB[3 * 4 + 3]); + } + + mMatrix = tmp; + } + + public void matrixLoadIdentity() { + for (int i = 0; i < 16; i++) + mMatrix[i] = 0.0f; + + mMatrix[0 * 4 + 0] = 1.0f; + mMatrix[1 * 4 + 1] = 1.0f; + mMatrix[2 * 4 + 2] = 1.0f; + mMatrix[3 * 4 + 3] = 1.0f; + } + + private float[] makeIdentityMatrix() { + float[] result = new float[16]; + + for (int i = 0; i < 16; i++) + result[i] = 0.0f; + + result[0 * 4 + 0] = 1.0f; + result[1 * 4 + 1] = 1.0f; + result[2 * 4 + 2] = 1.0f; + result[3 * 4 + 3] = 1.0f; + + return result; + } + + public FloatBuffer getAsFloatBuffer() { + mMatrixFloatBuffer.put(mMatrix).position(0); + return mMatrixFloatBuffer; + } + + public float[] get() { + return mMatrix; + } + + private float[] mMatrix = new float[16]; + private FloatBuffer mMatrixFloatBuffer; + +} \ No newline at end of file From 790c641878da5b468b507112b23d7028fa6d715a Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 09:31:12 -0700 Subject: [PATCH 02/17] Added Android Java implementation of Chapter 2 Hello Triangle sample that draws a RED triangle on a black background. Currently tested with Google Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Chapter_2/Hello_Triangle/.classpath | 5 + .../Chapter_2/Hello_Triangle/.project | 33 ++++ .../Hello_Triangle/AndroidManifest.xml | 26 +++ .../Hello_Triangle/default.properties | 12 ++ .../Chapter_2/Hello_Triangle/proguard.cfg | 34 ++++ .../Hello_Triangle/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../Hello_Triangle/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../Hello_Triangle/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../Hello_Triangle/res/values/strings.xml | 4 + .../opengles/hellotriangle/HelloTriangle.java | 66 +++++++ .../hellotriangle/HelloTriangleRenderer.java | 181 ++++++++++++++++++ 11 files changed, 361 insertions(+) create mode 100644 Android_Java/Chapter_2/Hello_Triangle/.classpath create mode 100644 Android_Java/Chapter_2/Hello_Triangle/.project create mode 100644 Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml create mode 100644 Android_Java/Chapter_2/Hello_Triangle/default.properties create mode 100644 Android_Java/Chapter_2/Hello_Triangle/proguard.cfg create mode 100644 Android_Java/Chapter_2/Hello_Triangle/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_2/Hello_Triangle/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_2/Hello_Triangle/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_2/Hello_Triangle/res/values/strings.xml create mode 100644 Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangle.java create mode 100644 Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangleRenderer.java diff --git a/Android_Java/Chapter_2/Hello_Triangle/.classpath b/Android_Java/Chapter_2/Hello_Triangle/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Chapter_2/Hello_Triangle/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_2/Hello_Triangle/.project b/Android_Java/Chapter_2/Hello_Triangle/.project new file mode 100644 index 0000000..d0fce14 --- /dev/null +++ b/Android_Java/Chapter_2/Hello_Triangle/.project @@ -0,0 +1,33 @@ + + + Ch2_Hello_Triangle + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml b/Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml new file mode 100644 index 0000000..8445adb --- /dev/null +++ b/Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_2/Hello_Triangle/default.properties b/Android_Java/Chapter_2/Hello_Triangle/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_2/Hello_Triangle/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_2/Hello_Triangle/proguard.cfg b/Android_Java/Chapter_2/Hello_Triangle/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_2/Hello_Triangle/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_2/Hello_Triangle/res/drawable-hdpi/icon.png b/Android_Java/Chapter_2/Hello_Triangle/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_2/Hello_Triangle/res/drawable-ldpi/icon.png b/Android_Java/Chapter_2/Hello_Triangle/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch2_Hello_Triangle + diff --git a/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangle.java b/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangle.java new file mode 100644 index 0000000..81343be --- /dev/null +++ b/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangle.java @@ -0,0 +1,66 @@ +package com.opengles.hellotriangle; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class HelloTriangle extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new HelloTriangleRenderer(this)); + } + else + { + Log.e("HelloTriangle", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangleRenderer.java b/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangleRenderer.java new file mode 100644 index 0000000..bd87624 --- /dev/null +++ b/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangleRenderer.java @@ -0,0 +1,181 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// Hello_Triangle +// +// This is a simple example that draws a single triangle with +// a minimal vertex/fragment shader. The purpose of this +// example is to demonstrate the basic concepts of +// OpenGL ES 3.0 rendering. + +package com.opengles.hellotriangle; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; +import android.util.Log; + +public class HelloTriangleRenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public HelloTriangleRenderer(Context context) + { + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + } + + /// + // Create a shader object, load the shader source, and + // compile the shader. + // + private int LoadShader(int type, String shaderSrc) + { + int shader; + int[] compiled = new int[1]; + + // Create the shader object + shader = GLES30.glCreateShader(type); + + if (shader == 0) + return 0; + + // Load the shader source + GLES30.glShaderSource(shader, shaderSrc); + + // Compile the shader + GLES30.glCompileShader(shader); + + // Check the compile status + GLES30.glGetShaderiv(shader, GLES30.GL_COMPILE_STATUS, compiled, 0); + + if (compiled[0] == 0) + { + Log.e(TAG, GLES30.glGetShaderInfoLog(shader)); + GLES30.glDeleteShader(shader); + return 0; + } + return shader; + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "in vec4 vPosition; \n" + + "void main() \n" + + "{ \n" + + " gl_Position = vPosition; \n" + + "} \n"; + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "out vec4 fragColor; \n" + + "void main() \n" + + "{ \n" + + " fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 ); \n" + + "} \n"; + + int vertexShader; + int fragmentShader; + int programObject; + int[] linked = new int[1]; + + // Load the vertex/fragment shaders + vertexShader = LoadShader(GLES30.GL_VERTEX_SHADER, vShaderStr); + fragmentShader = LoadShader(GLES30.GL_FRAGMENT_SHADER, fShaderStr); + + // Create the program object + programObject = GLES30.glCreateProgram(); + + if (programObject == 0) + return; + + GLES30.glAttachShader(programObject, vertexShader); + GLES30.glAttachShader(programObject, fragmentShader); + + // Bind vPosition to attribute 0 + GLES30.glBindAttribLocation(programObject, 0, "vPosition"); + + // Link the program + GLES30.glLinkProgram(programObject); + + // Check the link status + GLES30.glGetProgramiv(programObject, GLES30.GL_LINK_STATUS, linked, 0); + + if (linked[0] == 0) + { + Log.e(TAG, "Error linking program:"); + Log.e(TAG, GLES30.glGetProgramInfoLog(programObject)); + GLES30.glDeleteProgram(programObject); + return; + } + + // Store the program object + mProgramObject = programObject; + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + // / + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex data + GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, mVertices); + GLES30.glEnableVertexAttribArray(0); + + GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 3); + } + + // / + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + // Member variables + private int mProgramObject; + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private static String TAG = "HelloTriangleRenderer"; + + private final float[] mVerticesData = + { 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f }; + +} From 03e6519fe9cb32e1aea1bdf1369226fc71658592 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 10:02:02 -0700 Subject: [PATCH 03/17] Added Android Java implementation of Chapter 8: 'Simple Vertex Shader' sample that draws a RED colored animating cube on a black background using OpenGL ES 3.0 Currently tested with Google Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Chapter_8/Simple_VertexShader/.classpath | 5 + .../Chapter_8/Simple_VertexShader/.project | 33 ++++ .../Simple_VertexShader/AndroidManifest.xml | 25 +++ .../Simple_VertexShader/default.properties | 12 ++ .../Simple_VertexShader/proguard.cfg | 34 ++++ .../res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../res/values/strings.xml | 4 + .../SimpleVertexShader.java | 66 +++++++ .../SimpleVertexShaderRenderer.java | 184 ++++++++++++++++++ 11 files changed, 363 insertions(+) create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/.classpath create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/.project create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/default.properties create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/proguard.cfg create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/res/values/strings.xml create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShader.java create mode 100644 Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShaderRenderer.java diff --git a/Android_Java/Chapter_8/Simple_VertexShader/.classpath b/Android_Java/Chapter_8/Simple_VertexShader/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Chapter_8/Simple_VertexShader/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_8/Simple_VertexShader/.project b/Android_Java/Chapter_8/Simple_VertexShader/.project new file mode 100644 index 0000000..481b0b7 --- /dev/null +++ b/Android_Java/Chapter_8/Simple_VertexShader/.project @@ -0,0 +1,33 @@ + + + Ch8_Simple_VertexShader + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml b/Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml new file mode 100644 index 0000000..5219a19 --- /dev/null +++ b/Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_8/Simple_VertexShader/default.properties b/Android_Java/Chapter_8/Simple_VertexShader/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_8/Simple_VertexShader/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_8/Simple_VertexShader/proguard.cfg b/Android_Java/Chapter_8/Simple_VertexShader/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_8/Simple_VertexShader/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_8/Simple_VertexShader/res/drawable-hdpi/icon.png b/Android_Java/Chapter_8/Simple_VertexShader/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_8/Simple_VertexShader/res/drawable-ldpi/icon.png b/Android_Java/Chapter_8/Simple_VertexShader/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + SimpleVertexShader + diff --git a/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShader.java b/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShader.java new file mode 100644 index 0000000..aded6e9 --- /dev/null +++ b/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShader.java @@ -0,0 +1,66 @@ +package com.opengles.simplevertexshader; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class SimpleVertexShader extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 2.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new SimpleVertexShaderRenderer(this)); + } + else + { + Log.e("HelloTriangle", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShaderRenderer.java b/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShaderRenderer.java new file mode 100644 index 0000000..811e1cf --- /dev/null +++ b/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShaderRenderer.java @@ -0,0 +1,184 @@ +// +// Book: OpenGL(R) ES 2.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// Simple_VertexShader +// +// This is a simple example that draws a rotating cube in perspective +// using a vertex shader to transform the object +// + +package com.opengles.simplevertexshader; + +import com.openglesbook.common.ESShapes; +import com.openglesbook.common.ESShader; +import com.openglesbook.common.ESTransform; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; +import android.os.SystemClock; + +public class SimpleVertexShaderRenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public SimpleVertexShaderRenderer(Context context) + { + + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "uniform mat4 u_mvpMatrix; \n" + + "layout(location = 0) in vec4 a_position; \n" + + "layout(location = 1) in vec4 a_color; \n" + + "out vec4 v_color; \n" + + "void main() \n" + + "{ \n" + + " v_color = a_color; \n" + + " gl_Position = u_mvpMatrix * a_position; \n" + + "} \n"; + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec4 v_color; \n" + + "layout(location = 0) out vec4 outColor; \n" + + "void main() \n" + + "{ \n" + + " outColor = v_color; \n" + + "} \n"; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + // Get the uniform locations + mMVPLoc = GLES30.glGetUniformLocation(mProgramObject, "u_mvpMatrix"); + + // Generate the vertex data + mCube.genCube(1.0f); + + // Starting rotation angle for the cube + mAngle = 45.0f; + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + private void update() + { + if (mLastTime == 0) + mLastTime = SystemClock.uptimeMillis(); + long curTime = SystemClock.uptimeMillis(); + long elapsedTime = curTime - mLastTime; + float deltaTime = elapsedTime / 1000.0f; + mLastTime = curTime; + + ESTransform perspective = new ESTransform(); + ESTransform modelview = new ESTransform(); + float aspect; + + // Compute a rotation angle based on time to rotate the cube + mAngle += (deltaTime * 40.0f); + if (mAngle >= 360.0f) + mAngle -= 360.0f; + + // Compute the window aspect ratio + aspect = (float) mWidth / (float) mHeight; + + // Generate a perspective matrix with a 60 degree FOV + perspective.matrixLoadIdentity(); + perspective.perspective(60.0f, aspect, 1.0f, 20.0f); + + // Generate a model view matrix to rotate/translate the cube + modelview.matrixLoadIdentity(); + + // Translate away from the viewer + modelview.translate(0.0f, 0.0f, -2.0f); + + // Rotate the cube + modelview.rotate(mAngle, 1.0f, 0.0f, 1.0f); + + // Compute the final MVP by multiplying the + // modevleiw and perspective matrices together + mMVPMatrix.matrixMultiply(modelview.get(), perspective.get()); + } + + /// + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + update(); + + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex data + GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, + 0, mCube.getVertices()); + GLES30.glEnableVertexAttribArray(0); + + // Set the vertex color to red + GLES30.glVertexAttrib4f( 1, 1.0f, 0.0f, 0.0f, 1.0f ); + + // Load the MVP matrix + GLES30.glUniformMatrix4fv(mMVPLoc, 1, false, + mMVPMatrix.getAsFloatBuffer()); + + // Draw the cube + GLES30.glDrawElements(GLES30.GL_TRIANGLES, mCube.getNumIndices(), + GLES30.GL_UNSIGNED_SHORT, mCube.getIndices()); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + // Handle to a program object + private int mProgramObject; + + // Uniform locations + private int mMVPLoc; + + // Vertex data + private ESShapes mCube = new ESShapes(); + + // Rotation angle + private float mAngle; + + // MVP matrix + private ESTransform mMVPMatrix = new ESTransform(); + + // Additional Member variables + private int mWidth; + private int mHeight; + private long mLastTime = 0; +} From 397e7e2b96ef55c107391e862e8f52adfd1dcede Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 10:25:09 -0700 Subject: [PATCH 04/17] Added Android Java implementation of Chapter 9: 'Simple Texture2D' sample that draws a programatically generated texture on a black background using OpenGL ES 3.0 Currently tested with Google Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Chapter_9/Simple_Texture2D/.classpath | 5 + .../Chapter_9/Simple_Texture2D/.project | 33 +++ .../Simple_Texture2D/AndroidManifest.xml | 26 +++ .../Simple_Texture2D/default.properties | 12 + .../Chapter_9/Simple_Texture2D/proguard.cfg | 34 +++ .../res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../Simple_Texture2D/res/values/strings.xml | 4 + .../simpletexture2d/SimpleTexture2D.java | 66 ++++++ .../SimpleTexture2DRenderer.java | 209 ++++++++++++++++++ 11 files changed, 389 insertions(+) create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/.classpath create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/.project create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/AndroidManifest.xml create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/default.properties create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/proguard.cfg create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/res/values/strings.xml create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2D.java create mode 100644 Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2DRenderer.java diff --git a/Android_Java/Chapter_9/Simple_Texture2D/.classpath b/Android_Java/Chapter_9/Simple_Texture2D/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_Texture2D/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_9/Simple_Texture2D/.project b/Android_Java/Chapter_9/Simple_Texture2D/.project new file mode 100644 index 0000000..42ecaa0 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_Texture2D/.project @@ -0,0 +1,33 @@ + + + Ch9_Simple_Texture2D + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_9/Simple_Texture2D/AndroidManifest.xml b/Android_Java/Chapter_9/Simple_Texture2D/AndroidManifest.xml new file mode 100644 index 0000000..441943a --- /dev/null +++ b/Android_Java/Chapter_9/Simple_Texture2D/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_9/Simple_Texture2D/default.properties b/Android_Java/Chapter_9/Simple_Texture2D/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_Texture2D/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_9/Simple_Texture2D/proguard.cfg b/Android_Java/Chapter_9/Simple_Texture2D/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_Texture2D/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_9/Simple_Texture2D/res/drawable-hdpi/icon.png b/Android_Java/Chapter_9/Simple_Texture2D/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_9/Simple_Texture2D/res/drawable-ldpi/icon.png b/Android_Java/Chapter_9/Simple_Texture2D/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch9_Simple_Texture2D + diff --git a/Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2D.java b/Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2D.java new file mode 100644 index 0000000..4ec8c40 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2D.java @@ -0,0 +1,66 @@ +package com.openglesbook.simpletexture2d; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class SimpleTexture2D extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new SimpleTexture2DRenderer(this)); + } + else + { + Log.e("SimpleTexture2D", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2DRenderer.java b/Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2DRenderer.java new file mode 100644 index 0000000..2595259 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_Texture2D/src/com/openglesbook/simpletexture2d/SimpleTexture2DRenderer.java @@ -0,0 +1,209 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// Simple_Texture2D +// +// This is a simple example that draws a quad with a 2D +// texture image. The purpose of this example is to demonstrate +// the basics of 2D texturing +// + +package com.openglesbook.simpletexture2d; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class SimpleTexture2DRenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public SimpleTexture2DRenderer(Context context) + { + + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + mIndices.put(mIndicesData).position(0); + } + + // + // Create a simple 2x2 texture image with four different colors + // + private int createSimpleTexture2D( ) + { + // Texture object handle + int[] textureId = new int[1]; + + // 2x2 Image, 3 bytes per pixel (R, G, B) + byte[] pixels = + { + (byte) 0xff, 0, 0, // Red + 0, (byte) 0xff, 0, // Green + 0, 0, (byte) 0xff, // Blue + (byte) 0xff, (byte) 0xff, 0 // Yellow + }; + ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(4*3); + pixelBuffer.put(pixels).position(0); + + // Use tightly packed data + GLES30.glPixelStorei ( GLES30.GL_UNPACK_ALIGNMENT, 1 ); + + // Generate a texture object + GLES30.glGenTextures ( 1, textureId, 0 ); + + // Bind the texture object + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, textureId[0] ); + + // Load the texture + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGB, 2, 2, 0, GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, pixelBuffer ); + + // Set the filtering mode + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_NEAREST ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_NEAREST ); + + return textureId[0]; + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "layout(location = 0) in vec4 a_position; \n" + + "layout(location = 1) in vec2 a_texCoord; \n" + + "out vec2 v_texCoord; \n" + + "void main() \n" + + "{ \n" + + " gl_Position = a_position; \n" + + " v_texCoord = a_texCoord; \n" + + "} \n"; + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec2 v_texCoord; \n" + + "layout(location = 0) out vec4 outColor; \n" + + "uniform sampler2D s_texture; \n" + + "void main() \n" + + "{ \n" + + " outColor = texture( s_texture, v_texCoord ); \n" + + "} \n"; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + // Get the sampler location + mSamplerLoc = GLES30.glGetUniformLocation ( mProgramObject, "s_texture" ); + + // Load the texture + mTextureId = createSimpleTexture2D (); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + // / + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex position + mVertices.position(0); + GLES30.glVertexAttribPointer ( 0, 3, GLES30.GL_FLOAT, + false, + 5 * 4, mVertices ); + // Load the texture coordinate + mVertices.position(3); + GLES30.glVertexAttribPointer ( 1, 2, GLES30.GL_FLOAT, + false, + 5 * 4, + mVertices ); + + GLES30.glEnableVertexAttribArray ( 0 ); + GLES30.glEnableVertexAttribArray ( 1 ); + + // Bind the texture + GLES30.glActiveTexture ( GLES30.GL_TEXTURE0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, mTextureId ); + + // Set the sampler texture unit to 0 + GLES30.glUniform1i ( mSamplerLoc, 0 ); + + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, mIndices ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + + // Handle to a program object + private int mProgramObject; + + // Sampler location + private int mSamplerLoc; + + // Texture handle + private int mTextureId; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private ShortBuffer mIndices; + + private final float[] mVerticesData = + { + -0.5f, 0.5f, 0.0f, // Position 0 + 0.0f, 0.0f, // TexCoord 0 + -0.5f, -0.5f, 0.0f, // Position 1 + 0.0f, 1.0f, // TexCoord 1 + 0.5f, -0.5f, 0.0f, // Position 2 + 1.0f, 1.0f, // TexCoord 2 + 0.5f, 0.5f, 0.0f, // Position 3 + 1.0f, 0.0f // TexCoord 3 + }; + + private final short[] mIndicesData = + { + 0, 1, 2, 0, 2, 3 + }; + +} From 1ed9f37c1ac519e066543b951f5143eb50589bec Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 10:41:54 -0700 Subject: [PATCH 05/17] Added Android Java implementation of Chapter 9: 'Simple TextureCubemap' sample that draws a programatically generated cube map texture on a black background using OpenGL ES 3.0 Currently tested with Google Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Simple_TextureCubemap/.classpath | 5 + .../Chapter_9/Simple_TextureCubemap/.project | 33 +++ .../Simple_TextureCubemap/AndroidManifest.xml | 26 +++ .../Simple_TextureCubemap/default.properties | 12 + .../Simple_TextureCubemap/proguard.cfg | 34 +++ .../res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../res/values/strings.xml | 4 + .../SimpleTextureCubemap.java | 65 ++++++ .../SimpleTextureCubemapRenderer.java | 212 ++++++++++++++++++ 11 files changed, 391 insertions(+) create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/.classpath create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/.project create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/AndroidManifest.xml create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/default.properties create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/proguard.cfg create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/res/values/strings.xml create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemap.java create mode 100644 Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemapRenderer.java diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/.classpath b/Android_Java/Chapter_9/Simple_TextureCubemap/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_TextureCubemap/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/.project b/Android_Java/Chapter_9/Simple_TextureCubemap/.project new file mode 100644 index 0000000..9083c72 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_TextureCubemap/.project @@ -0,0 +1,33 @@ + + + Ch9_Simple_TextureCubemap + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/AndroidManifest.xml b/Android_Java/Chapter_9/Simple_TextureCubemap/AndroidManifest.xml new file mode 100644 index 0000000..f2c12aa --- /dev/null +++ b/Android_Java/Chapter_9/Simple_TextureCubemap/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/default.properties b/Android_Java/Chapter_9/Simple_TextureCubemap/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_TextureCubemap/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/proguard.cfg b/Android_Java/Chapter_9/Simple_TextureCubemap/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_TextureCubemap/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/res/drawable-hdpi/icon.png b/Android_Java/Chapter_9/Simple_TextureCubemap/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/res/drawable-ldpi/icon.png b/Android_Java/Chapter_9/Simple_TextureCubemap/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch9_Simple_TextureCubemap + diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemap.java b/Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemap.java new file mode 100644 index 0000000..ac28107 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemap.java @@ -0,0 +1,65 @@ +package com.openglesbook.simpletexturecubemap; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class SimpleTextureCubemap extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new SimpleTextureCubemapRenderer(this)); + } + else + { + Log.e("SimpleTextureCubemap", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemapRenderer.java b/Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemapRenderer.java new file mode 100644 index 0000000..e0a0195 --- /dev/null +++ b/Android_Java/Chapter_9/Simple_TextureCubemap/src/com/openglesbook/simpletexturecubemap/SimpleTextureCubemapRenderer.java @@ -0,0 +1,212 @@ +// +// Book: OpenGL(R) ES 2.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// MipMap2D +// +// This is a simple example that demonstrates generating a mipmap chain +// and rendering with it +// + +package com.openglesbook.simpletexturecubemap; + +import java.nio.ByteBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; +import com.openglesbook.common.ESShapes; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class SimpleTextureCubemapRenderer implements GLSurfaceView.Renderer +{ + /// + // Constructor + // + public SimpleTextureCubemapRenderer(Context context) + { + } + + /// + // Create a simple cubemap with a 1x1 face with a different + // color for each face + private int createSimpleTextureCubemap( ) + { + int[] textureId = new int[1]; + + // Face 0 - Red + byte[] cubePixels0 = { 127, 0, 0 }; + // Face 1 - Green + byte[] cubePixels1 = { 0, 127, 0 }; + // Face 2 - Blue + byte[] cubePixels2 = { 0, 0, 127 }; + // Face 3 - Yellow + byte[] cubePixels3 = { 127, 127, 0 }; + // Face 4 - Purple + byte[] cubePixels4 = { 127, 0, 127 }; + // Face 5 - White + byte[] cubePixels5 = { 127, 127, 127 }; + + ByteBuffer cubePixels = ByteBuffer.allocateDirect(3); + + // Generate a texture object + GLES30.glGenTextures ( 1, textureId, 0 ); + + // Bind the texture object + GLES30.glBindTexture ( GLES30.GL_TEXTURE_CUBE_MAP, textureId[0] ); + + // Load the cube face - Positive X + cubePixels.put(cubePixels0).position(0); + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GLES30.GL_RGB, 1, 1, 0, + GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, cubePixels ); + + // Load the cube face - Negative X + cubePixels.put(cubePixels1).position(0); + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GLES30.GL_RGB, 1, 1, 0, + GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, cubePixels ); + + // Load the cube face - Positive Y + cubePixels.put(cubePixels2).position(0); + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GLES30.GL_RGB, 1, 1, 0, + GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, cubePixels ); + + // Load the cube face - Negative Y + cubePixels.put(cubePixels3).position(0); + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GLES30.GL_RGB, 1, 1, 0, + GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, cubePixels ); + + // Load the cube face - Positive Z + cubePixels.put(cubePixels4).position(0); + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GLES30.GL_RGB, 1, 1, 0, + GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, cubePixels ); + + // Load the cube face - Negative Z + cubePixels.put(cubePixels5).position(0); + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GLES30.GL_RGB, 1, 1, 0, + GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, cubePixels ); + + // Set the filtering mode + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_CUBE_MAP, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_NEAREST ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_CUBE_MAP, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_NEAREST ); + + return textureId[0]; + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + + "#version 300 es \n" + + "layout(location = 0) in vec4 a_position; \n" + + "layout(location = 1) in vec3 a_normal; \n" + + "out vec3 v_normal; \n" + + "void main() \n" + + "{ \n" + + " gl_Position = a_position; \n" + + " v_normal = a_normal; \n" + + "} \n"; + + String fShaderStr = + + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec3 v_normal; \n" + + "layout(location = 0) out vec4 outColor; \n" + + "uniform samplerCube s_texture; \n" + + "void main() \n" + + "{ \n" + + " outColor = texture( s_texture, v_normal ); \n" + + "} \n"; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + // Get the sampler location + mSamplerLoc = GLES30.glGetUniformLocation ( mProgramObject, "s_texture" ); + + // Load the texture + mTextureId = createSimpleTextureCubemap (); + + // Generate the vertex data + mSphere.genSphere( 20, 0.75f ); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + /// + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + GLES30.glCullFace(GLES30.GL_BACK); + GLES30.glEnable(GLES30.GL_CULL_FACE); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex position + GLES30.glVertexAttribPointer ( 0, 3, GLES30.GL_FLOAT, + false, 0, mSphere.getVertices()); + // Load the texture coordinate + + GLES30.glVertexAttribPointer ( 1, 3, GLES30.GL_FLOAT, + false, 0, mSphere.getNormals()); + + GLES30.glEnableVertexAttribArray( 0 ); + GLES30.glEnableVertexAttribArray( 1 ); + + // Bind the texture + GLES30.glActiveTexture ( GLES30.GL_TEXTURE0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_CUBE_MAP, mTextureId ); + + // Set the sampler texture unit to 0 + GLES30.glUniform1i ( mSamplerLoc, 0 ); + + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, mSphere.getNumIndices(), GLES30.GL_UNSIGNED_SHORT, mSphere.getIndices() ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + + // Handle to a program object + private int mProgramObject; + + // Sampler location + private int mSamplerLoc; + + // Texture ID + private int mTextureId; + + // Vertex data + private ESShapes mSphere = new ESShapes(); + + // Additional member variables + private int mWidth; + private int mHeight; +} From 9b1321b0c3d0fdc5c8860e80a06fc69e4d8183a8 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 11:01:51 -0700 Subject: [PATCH 06/17] Added Android Java implementation of Chapter 9: 'TextureWrap' sample that demonstrates different texture wrapping modes available in OpenGL ES 3.0 Currently tested with Google Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- Android_Java/Chapter_9/TextureWrap/.classpath | 5 + Android_Java/Chapter_9/TextureWrap/.project | 33 +++ .../Chapter_9/TextureWrap/AndroidManifest.xml | 26 ++ .../Chapter_9/TextureWrap/default.properties | 12 + .../Chapter_9/TextureWrap/proguard.cfg | 34 +++ .../TextureWrap/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../TextureWrap/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../TextureWrap/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../TextureWrap/res/values/strings.xml | 4 + .../openglesbook/texturewrap/TextureWrap.java | 65 +++++ .../texturewrap/TextureWrapRenderer.java | 263 ++++++++++++++++++ 11 files changed, 442 insertions(+) create mode 100644 Android_Java/Chapter_9/TextureWrap/.classpath create mode 100644 Android_Java/Chapter_9/TextureWrap/.project create mode 100644 Android_Java/Chapter_9/TextureWrap/AndroidManifest.xml create mode 100644 Android_Java/Chapter_9/TextureWrap/default.properties create mode 100644 Android_Java/Chapter_9/TextureWrap/proguard.cfg create mode 100644 Android_Java/Chapter_9/TextureWrap/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_9/TextureWrap/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_9/TextureWrap/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_9/TextureWrap/res/values/strings.xml create mode 100644 Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrap.java create mode 100644 Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrapRenderer.java diff --git a/Android_Java/Chapter_9/TextureWrap/.classpath b/Android_Java/Chapter_9/TextureWrap/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Chapter_9/TextureWrap/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_9/TextureWrap/.project b/Android_Java/Chapter_9/TextureWrap/.project new file mode 100644 index 0000000..c559ab7 --- /dev/null +++ b/Android_Java/Chapter_9/TextureWrap/.project @@ -0,0 +1,33 @@ + + + Ch9_TextureWrap + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_9/TextureWrap/AndroidManifest.xml b/Android_Java/Chapter_9/TextureWrap/AndroidManifest.xml new file mode 100644 index 0000000..a43f3ab --- /dev/null +++ b/Android_Java/Chapter_9/TextureWrap/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_9/TextureWrap/default.properties b/Android_Java/Chapter_9/TextureWrap/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_9/TextureWrap/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_9/TextureWrap/proguard.cfg b/Android_Java/Chapter_9/TextureWrap/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_9/TextureWrap/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_9/TextureWrap/res/drawable-hdpi/icon.png b/Android_Java/Chapter_9/TextureWrap/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_9/TextureWrap/res/drawable-ldpi/icon.png b/Android_Java/Chapter_9/TextureWrap/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch9_TextureWrap + diff --git a/Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrap.java b/Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrap.java new file mode 100644 index 0000000..5d0ddb9 --- /dev/null +++ b/Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrap.java @@ -0,0 +1,65 @@ +package com.openglesbook.texturewrap; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class TextureWrap extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new TextureWrapRenderer(this)); + } + else + { + Log.e("TextureWrap", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrapRenderer.java b/Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrapRenderer.java new file mode 100644 index 0000000..2ac8be3 --- /dev/null +++ b/Android_Java/Chapter_9/TextureWrap/src/com/openglesbook/texturewrap/TextureWrapRenderer.java @@ -0,0 +1,263 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// TextureWrap +// +// This is an example that demonstrates the three texture +// wrap modes available on 2D textures +// + +package com.openglesbook.texturewrap; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class TextureWrapRenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public TextureWrapRenderer(Context context) + { + + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + mIndices.put(mIndicesData).position(0); + } + + /// + // Generate an RGB8 checkerboard image + // + private ByteBuffer genCheckImage( int width, int height, int checkSize ) + { + int x, + y; + byte[] pixels = new byte[width * height * 3]; + + + for ( y = 0; y < height; y++ ) + for ( x = 0; x < width; x++ ) + { + byte rColor = 0; + byte bColor = 0; + + if ( ( x / checkSize ) % 2 == 0 ) + { + rColor = (byte)(127 * ( ( y / checkSize ) % 2 )); + bColor = (byte)(127 * ( 1 - ( ( y / checkSize ) % 2 ) )); + } + else + { + bColor = (byte)(127 * ( ( y / checkSize ) % 2 )); + rColor = (byte)(127 * ( 1 - ( ( y / checkSize ) % 2 ) )); + } + + pixels[(y * height + x) * 3] = rColor; + pixels[(y * height + x) * 3 + 1] = 0; + pixels[(y * height + x) * 3 + 2] = bColor; + } + + ByteBuffer result = ByteBuffer.allocateDirect(width*height*3); + result.put(pixels).position(0); + return result; + } + + /// + // Create a 2D texture image + // + private int createTexture2D( ) + { + // Texture object handle + int[] textureId = new int[1]; + int width = 256, + height = 256; + ByteBuffer pixels; + + pixels = genCheckImage( width, height, 64 ); + + // Generate a texture object + GLES30.glGenTextures ( 1, textureId, 0 ); + + // Bind the texture object + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, textureId[0] ); + + // Load mipmap level 0 + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGB, width, height, + 0, GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, pixels ); + + // Set the filtering mode + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR ); + + return textureId[0]; + } + + + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "uniform float u_offset; \n" + + "layout(location = 0) in vec4 a_position; \n" + + "layout(location = 1) in vec2 a_texCoord; \n" + + "out vec2 v_texCoord; \n" + + "void main() \n" + + "{ \n" + + " gl_Position = a_position; \n" + + " gl_Position.x += u_offset; \n" + + " v_texCoord = a_texCoord; \n" + + "} \n"; + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec2 v_texCoord; \n" + + "layout(location = 0) out vec4 outColor; \n" + + "uniform sampler2D s_texture; \n" + + "void main() \n" + + "{ \n" + + " outColor = texture( s_texture, v_texCoord ); \n" + + "} \n"; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + // Get the sampler location + mSamplerLoc = GLES30.glGetUniformLocation ( mProgramObject, "s_texture" ); + + // Get the offset location + mOffsetLoc = GLES30.glGetUniformLocation( mProgramObject, "u_offset" ); + + // Load the texture + mTextureId = createTexture2D (); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + /// + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex position + mVertices.position(0); + GLES30.glVertexAttribPointer ( 0, 4, GLES30.GL_FLOAT, + false, + 6 * 4, mVertices ); + // Load the texture coordinate + mVertices.position(4); + GLES30.glVertexAttribPointer ( 1, 2, GLES30.GL_FLOAT, + false, + 6 * 4, + mVertices ); + + GLES30.glEnableVertexAttribArray( 0 ); + GLES30.glEnableVertexAttribArray( 1 ); + + // Bind the texture + GLES30.glActiveTexture ( GLES30.GL_TEXTURE0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, mTextureId ); + + // Set the sampler texture unit to 0 + GLES30.glUniform1i ( mSamplerLoc, 0 ); + + // Draw quad with repeat wrap mode + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_REPEAT ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_REPEAT ); + GLES30.glUniform1f ( mOffsetLoc, -0.7f ); + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, mIndices ); + + // Draw quad with clamp to edge wrap mode + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE ); + GLES30.glUniform1f ( mOffsetLoc, 0.0f ); + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, mIndices ); + + // Draw quad with mirrored repeat + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_MIRRORED_REPEAT ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_MIRRORED_REPEAT ); + GLES30.glUniform1f ( mOffsetLoc, 0.7f ); + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, mIndices ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + + // Handle to a program object + private int mProgramObject; + + // Sampler location + private int mSamplerLoc; + + // Offset location + private int mOffsetLoc; + + // Texture handle + private int mTextureId; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private ShortBuffer mIndices; + + private final float[] mVerticesData = + { + -0.3f, 0.3f, 0.0f, 1.0f, // Position 0 + -1.0f, -1.0f, // TexCoord 0 + -0.3f, -0.3f, 0.0f, 1.0f, // Position 1 + -1.0f, 2.0f, // TexCoord 1 + 0.3f, -0.3f, 0.0f, 1.0f, // Position 2 + 2.0f, 2.0f, // TexCoord 2 + 0.3f, 0.3f, 0.0f, 1.0f, // Position 3 + 2.0f, -1.0f // TexCoord 3 + }; + + private final short[] mIndicesData = + { + 0, 1, 2, 0, 2, 3 + }; + +} From fc9a7bc1eb471596b0a54afcf5bd2bead16b3862 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 11:22:25 -0700 Subject: [PATCH 07/17] Added Android Java implementation of Chapter 9: 'MipMap2D' sample that demonstrates texture mip-mapping with OpenGL ES 3.0. This sample loads shaders (vertex and fragment) from 'assets' folder so that shaders can be modified outside of project with a shader editor like Imagination's PVRShaderEditor. In that case, ensure to refresh your Eclipse your project to update shader files used by the project. This facility of resource loading from assets will also be used for texture image loading in the Multi-Texture sample that will be added shortly. Currently tested with Google Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- Android_Java/Chapter_9/MipMap2D/.classpath | 5 + Android_Java/Chapter_9/MipMap2D/.project | 33 ++ .../Chapter_9/MipMap2D/AndroidManifest.xml | 26 ++ .../assets/shaders/fragmentShader.frag | 14 + .../MipMap2D/assets/shaders/vertexShader.vert | 16 + .../Chapter_9/MipMap2D/default.properties | 12 + Android_Java/Chapter_9/MipMap2D/proguard.cfg | 34 ++ .../MipMap2D/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../MipMap2D/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../MipMap2D/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../Chapter_9/MipMap2D/res/values/strings.xml | 4 + .../com/openglesbook/mipmap2d/MipMap2D.java | 65 ++++ .../mipmap2d/MipMap2DRenderer.java | 332 ++++++++++++++++++ 13 files changed, 541 insertions(+) create mode 100644 Android_Java/Chapter_9/MipMap2D/.classpath create mode 100644 Android_Java/Chapter_9/MipMap2D/.project create mode 100644 Android_Java/Chapter_9/MipMap2D/AndroidManifest.xml create mode 100644 Android_Java/Chapter_9/MipMap2D/assets/shaders/fragmentShader.frag create mode 100644 Android_Java/Chapter_9/MipMap2D/assets/shaders/vertexShader.vert create mode 100644 Android_Java/Chapter_9/MipMap2D/default.properties create mode 100644 Android_Java/Chapter_9/MipMap2D/proguard.cfg create mode 100644 Android_Java/Chapter_9/MipMap2D/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_9/MipMap2D/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_9/MipMap2D/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_9/MipMap2D/res/values/strings.xml create mode 100644 Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2D.java create mode 100644 Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2DRenderer.java diff --git a/Android_Java/Chapter_9/MipMap2D/.classpath b/Android_Java/Chapter_9/MipMap2D/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_9/MipMap2D/.project b/Android_Java/Chapter_9/MipMap2D/.project new file mode 100644 index 0000000..86f4b5b --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/.project @@ -0,0 +1,33 @@ + + + Ch9_MipMap2D + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_9/MipMap2D/AndroidManifest.xml b/Android_Java/Chapter_9/MipMap2D/AndroidManifest.xml new file mode 100644 index 0000000..4d3e05e --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_9/MipMap2D/assets/shaders/fragmentShader.frag b/Android_Java/Chapter_9/MipMap2D/assets/shaders/fragmentShader.frag new file mode 100644 index 0000000..446bb3f --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/assets/shaders/fragmentShader.frag @@ -0,0 +1,14 @@ +#version 300 es + +precision mediump float; + +in vec2 v_texCoord; + +layout(location = 0) out vec4 outColor; + +uniform sampler2D s_texture; + +void main() +{ + outColor = texture( s_texture, v_texCoord ); +} \ No newline at end of file diff --git a/Android_Java/Chapter_9/MipMap2D/assets/shaders/vertexShader.vert b/Android_Java/Chapter_9/MipMap2D/assets/shaders/vertexShader.vert new file mode 100644 index 0000000..f59c13a --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/assets/shaders/vertexShader.vert @@ -0,0 +1,16 @@ +#version 300 es + +uniform float u_offset; + +layout(location = 0) in vec4 a_position; +layout(location = 1) in vec2 a_texCoord; + +out vec2 v_texCoord; + +void main() +{ + gl_Position = a_position; + gl_Position.x += u_offset; + + v_texCoord = a_texCoord; +} \ No newline at end of file diff --git a/Android_Java/Chapter_9/MipMap2D/default.properties b/Android_Java/Chapter_9/MipMap2D/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_9/MipMap2D/proguard.cfg b/Android_Java/Chapter_9/MipMap2D/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_9/MipMap2D/res/drawable-hdpi/icon.png b/Android_Java/Chapter_9/MipMap2D/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_9/MipMap2D/res/drawable-ldpi/icon.png b/Android_Java/Chapter_9/MipMap2D/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch9_MipMap2D + diff --git a/Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2D.java b/Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2D.java new file mode 100644 index 0000000..b32dbb3 --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2D.java @@ -0,0 +1,65 @@ +package com.openglesbook.mipmap2d; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class MipMap2D extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 2.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new MipMap2DRenderer(this)); + } + else + { + Log.e("MipMap2D", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2DRenderer.java b/Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2DRenderer.java new file mode 100644 index 0000000..1eac4ad --- /dev/null +++ b/Android_Java/Chapter_9/MipMap2D/src/com/openglesbook/mipmap2d/MipMap2DRenderer.java @@ -0,0 +1,332 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// MipMap2D +// +// This is a simple example that demonstrates generating a mipmap chain +// and rendering with it +// + +package com.openglesbook.mipmap2d; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class MipMap2DRenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public MipMap2DRenderer(Context context) + { + mContext = context; + + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + mIndices.put(mIndicesData).position(0); + } + + /// + // From an RGB8 source image, generate the next level mipmap + // + private byte[] genMipMap2D( byte[] src,int srcWidth, int srcHeight, int dstWidth, int dstHeight ) + { + int x, + y; + int texelSize = 3; + + byte[] dst = new byte[texelSize * (dstWidth) * (dstHeight)]; + + for ( y = 0; y < dstHeight; y++ ) + { + for( x = 0; x < dstWidth; x++ ) + { + int[] srcIndex = new int[4]; + float r = 0.0f, + g = 0.0f, + b = 0.0f; + int sample; + + // Compute the offsets for 2x2 grid of pixels in previous + // image to perform box filter + srcIndex[0] = + (((y * 2) * srcWidth) + (x * 2)) * texelSize; + srcIndex[1] = + (((y * 2) * srcWidth) + (x * 2 + 1)) * texelSize; + srcIndex[2] = + ((((y * 2) + 1) * srcWidth) + (x * 2)) * texelSize; + srcIndex[3] = + ((((y * 2) + 1) * srcWidth) + (x * 2 + 1)) * texelSize; + + // Sum all pixels + for ( sample = 0; sample < 4; sample++ ) + { + r += src[srcIndex[sample]]; + g += src[srcIndex[sample] + 1]; + b += src[srcIndex[sample] + 2]; + } + + // Average results + r /= 4.0; + g /= 4.0; + b /= 4.0; + + // Store resulting pixels + dst[ ( y * (dstWidth) + x ) * texelSize ] = (byte)( r ); + dst[ ( y * (dstWidth) + x ) * texelSize + 1] = (byte)( g ); + dst[ ( y * (dstWidth) + x ) * texelSize + 2] = (byte)( b ); + } + } + return dst; + } + + /// + // Generate an RGB8 checkerboard image + // + private byte[] genCheckImage( int width, int height, int checkSize ) + { + int x, + y; + byte[] pixels = new byte[width * height * 3]; + + + for ( y = 0; y < height; y++ ) + for ( x = 0; x < width; x++ ) + { + byte rColor = 0; + byte bColor = 0; + + if ( ( x / checkSize ) % 2 == 0 ) + { + rColor = (byte)(127 * ( ( y / checkSize ) % 2 )); + bColor = (byte)(127 * ( 1 - ( ( y / checkSize ) % 2 ) )); + } + else + { + bColor = (byte)(127 * ( ( y / checkSize ) % 2 )); + rColor = (byte)(127 * ( 1 - ( ( y / checkSize ) % 2 ) )); + } + + pixels[(y * height + x) * 3] = rColor; + pixels[(y * height + x) * 3 + 1] = 0; + pixels[(y * height + x) * 3 + 2] = bColor; + } + + return pixels; + } + + + /// + // Create a mipmapped 2D texture image + // + private int createMipMappedTexture2D( ) + { + // Texture object handle + int[] textureId = new int[1]; + int width = 256, + height = 256; + int level; + byte[] pixels; + byte[] prevImage; + byte[] newImage; + + pixels = genCheckImage( width, height, 8 ); + + // Generate a texture object + GLES30.glGenTextures ( 1, textureId, 0 ); + + // Bind the texture object + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, textureId[0] ); + + // Load mipmap level 0 + ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(width * height * 3); + pixelBuffer.put(pixels).position(0); + + GLES30.glTexImage2D ( GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGB, width, height, + 0, GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, pixelBuffer ); + + level = 1; + prevImage = pixels; + + while ( width > 1 && height > 1 ) + { + int newWidth, + newHeight; + + newWidth = width / 2; + if ( newWidth <= 0 ) + newWidth = 1; + + newHeight = height / 2; + if ( newHeight <= 0 ) + newHeight = 1; + + // Generate the next mipmap level + newImage = genMipMap2D( prevImage, width, height, newWidth, newHeight ); + + // Load the mipmap level + pixelBuffer = ByteBuffer.allocateDirect(newWidth * newHeight * 3); + pixelBuffer.put(newImage).position(0); + GLES30.glTexImage2D( GLES30.GL_TEXTURE_2D, level, GLES30.GL_RGB, + newWidth, newHeight, 0, GLES30.GL_RGB, + GLES30.GL_UNSIGNED_BYTE, pixelBuffer ); + + // Set the previous image for the next iteration + prevImage = newImage; + level++; + + // Half the width and height + width = newWidth; + height = newHeight; + } + + + // Set the filtering mode + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_NEAREST_MIPMAP_NEAREST ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR ); + + return textureId[0]; + + } + + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + + + // Load the shaders from "assets" and get a linked program object + mProgramObject = ESShader.loadProgramFromAsset(mContext, + "shaders/vertexShader.vert", + "shaders/fragmentShader.frag"); + + // Get the sampler location + mSamplerLoc = GLES30.glGetUniformLocation ( mProgramObject, "s_texture" ); + + // Get the offset location + mOffsetLoc = GLES30.glGetUniformLocation( mProgramObject, "u_offset" ); + + // Load the texture + mTextureId = createMipMappedTexture2D(); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + /// + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex position + mVertices.position(0); + GLES30.glVertexAttribPointer ( 0, 4, GLES30.GL_FLOAT, + false, + 6 * 4, mVertices ); + // Load the texture coordinate + mVertices.position(4); + GLES30.glVertexAttribPointer ( 1, 2, GLES30.GL_FLOAT, + false, + 6 * 4, + mVertices ); + + GLES30.glEnableVertexAttribArray( 0 ); + GLES30.glEnableVertexAttribArray( 1 ); + + // Bind the texture + GLES30.glActiveTexture ( GLES30.GL_TEXTURE0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, mTextureId ); + + // Set the sampler texture unit to 0 + GLES30.glUniform1i ( mSamplerLoc, 0 ); + + // Draw quad with nearest sampling + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_NEAREST ); + GLES30.glUniform1f ( mOffsetLoc, -0.6f ); + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, mIndices ); + + // Draw quad with trilinear filtering + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR_MIPMAP_LINEAR ); + GLES30.glUniform1f ( mOffsetLoc, 0.6f ); + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, mIndices ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + + // Handle to a program object + private int mProgramObject; + + // Sampler location + private int mSamplerLoc; + + // Offset location + private int mOffsetLoc; + + // Texture handle + private int mTextureId; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private ShortBuffer mIndices; + + private final float[] mVerticesData = + { + -0.5f, 0.5f, 0.0f, 1.5f, // Position 0 + 0.0f, 0.0f, // TexCoord 0 + -0.5f, -0.5f, 0.0f, 0.75f, // Position 1 + 0.0f, 1.0f, // TexCoord 1 + 0.5f, -0.5f, 0.0f, 0.75f, // Position 2 + 1.0f, 1.0f, // TexCoord 2 + 0.5f, 0.5f, 0.0f, 1.5f, // Position 3 + 1.0f, 0.0f // TexCoord 3 + }; + + private final short[] mIndicesData = + { + 0, 1, 2, 0, 2, 3 + }; + + private Context mContext; +} From e992e077800638b4b54f22747a7c21365779cd33 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Sat, 14 Sep 2013 11:42:55 -0700 Subject: [PATCH 08/17] Added Android Java implementation of Chapter 10: 'MultiTexture' sample that demonstrates using multiple textures in OpenGL ES 3.0. This sample loads shaders (vertex and fragment) from 'assets' folder. This facility of resource loading from assets is reused for texture image loading as well. However, this facility has not been added to Common and might be moved there in the near future as the need arises for reusing this functionality in other samples. Currently tested with Google Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Chapter_10/MultiTexture/.classpath | 5 + Android_Java/Chapter_10/MultiTexture/.project | 33 +++ .../MultiTexture/AndroidManifest.xml | 26 +++ .../assets/shaders/fragmentShader.frag | 21 ++ .../assets/shaders/vertexShader.vert | 12 ++ .../MultiTexture/assets/textures/basemap.png | Bin 0 -> 457076 bytes .../MultiTexture/assets/textures/lightmap.png | Bin 0 -> 15573 bytes .../MultiTexture/default.properties | 12 ++ .../Chapter_10/MultiTexture/proguard.cfg | 34 +++ .../MultiTexture/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../MultiTexture/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../MultiTexture/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../MultiTexture/res/values/strings.xml | 4 + .../multitexture/MultiTexture.java | 65 ++++++ .../multitexture/MultiTextureRenderer.java | 202 ++++++++++++++++++ 15 files changed, 414 insertions(+) create mode 100644 Android_Java/Chapter_10/MultiTexture/.classpath create mode 100644 Android_Java/Chapter_10/MultiTexture/.project create mode 100644 Android_Java/Chapter_10/MultiTexture/AndroidManifest.xml create mode 100644 Android_Java/Chapter_10/MultiTexture/assets/shaders/fragmentShader.frag create mode 100644 Android_Java/Chapter_10/MultiTexture/assets/shaders/vertexShader.vert create mode 100644 Android_Java/Chapter_10/MultiTexture/assets/textures/basemap.png create mode 100644 Android_Java/Chapter_10/MultiTexture/assets/textures/lightmap.png create mode 100644 Android_Java/Chapter_10/MultiTexture/default.properties create mode 100644 Android_Java/Chapter_10/MultiTexture/proguard.cfg create mode 100644 Android_Java/Chapter_10/MultiTexture/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_10/MultiTexture/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_10/MultiTexture/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_10/MultiTexture/res/values/strings.xml create mode 100644 Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTexture.java create mode 100644 Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTextureRenderer.java diff --git a/Android_Java/Chapter_10/MultiTexture/.classpath b/Android_Java/Chapter_10/MultiTexture/.classpath new file mode 100644 index 0000000..ce8b321 --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_10/MultiTexture/.project b/Android_Java/Chapter_10/MultiTexture/.project new file mode 100644 index 0000000..35ab13d --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/.project @@ -0,0 +1,33 @@ + + + Ch10_MultiTexture + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_10/MultiTexture/AndroidManifest.xml b/Android_Java/Chapter_10/MultiTexture/AndroidManifest.xml new file mode 100644 index 0000000..fb89a3d --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_10/MultiTexture/assets/shaders/fragmentShader.frag b/Android_Java/Chapter_10/MultiTexture/assets/shaders/fragmentShader.frag new file mode 100644 index 0000000..72d9955 --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/assets/shaders/fragmentShader.frag @@ -0,0 +1,21 @@ +#version 300 es + +precision mediump float; + +in vec2 v_texCoord; + +layout(location = 0) out vec4 outColor; + +uniform sampler2D s_baseMap; +uniform sampler2D s_lightMap; + +void main() +{ + vec4 baseColor; + vec4 lightColor; + + baseColor = texture( s_baseMap, v_texCoord ); + lightColor = texture( s_lightMap, v_texCoord ); + + outColor = baseColor * (lightColor + 0.25); +} \ No newline at end of file diff --git a/Android_Java/Chapter_10/MultiTexture/assets/shaders/vertexShader.vert b/Android_Java/Chapter_10/MultiTexture/assets/shaders/vertexShader.vert new file mode 100644 index 0000000..fcb3e8d --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/assets/shaders/vertexShader.vert @@ -0,0 +1,12 @@ +#version 300 es + +layout(location = 0) in vec4 a_position; +layout(location = 1) in vec2 a_texCoord; + +out vec2 v_texCoord; + +void main() +{ + gl_Position = a_position; + v_texCoord = a_texCoord; +} \ No newline at end of file diff --git a/Android_Java/Chapter_10/MultiTexture/assets/textures/basemap.png b/Android_Java/Chapter_10/MultiTexture/assets/textures/basemap.png new file mode 100644 index 0000000000000000000000000000000000000000..084feadb361bfbecdecdb4e8f71aab3a5ac30373 GIT binary patch literal 457076 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ʽ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%0DS9SZ{db~kZO8{7y@vU5t5Gmu0Bl`UC%TVx1I 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 H`};60}HJjq#QSM-VS$4ah( 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

(h&#zz8LnTM^irtficlud9Xk!+q#$0Yn-XPKJ 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 z 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_10/MultiTexture/assets/textures/lightmap.png b/Android_Java/Chapter_10/MultiTexture/assets/textures/lightmap.png new file mode 100644 index 0000000000000000000000000000000000000000..40cd00b0e1c2225d4af40e0130f6274c5bb73987 GIT binary patch literal 15573 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 J)I7Hc{Xfx-qL}~y literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_10/MultiTexture/default.properties b/Android_Java/Chapter_10/MultiTexture/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_10/MultiTexture/proguard.cfg b/Android_Java/Chapter_10/MultiTexture/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_10/MultiTexture/res/drawable-hdpi/icon.png b/Android_Java/Chapter_10/MultiTexture/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_10/MultiTexture/res/drawable-ldpi/icon.png b/Android_Java/Chapter_10/MultiTexture/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch10_MultiTexture + diff --git a/Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTexture.java b/Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTexture.java new file mode 100644 index 0000000..cf4834a --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTexture.java @@ -0,0 +1,65 @@ +package com.openglesbook.multitexture; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class MultiTexture extends Activity { + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new MultiTextureRenderer(this)); + } + else + { + Log.e("MultiTexture", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTextureRenderer.java b/Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTextureRenderer.java new file mode 100644 index 0000000..08919ae --- /dev/null +++ b/Android_Java/Chapter_10/MultiTexture/src/com/openglesbook/multitexture/MultiTextureRenderer.java @@ -0,0 +1,202 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// MultiTexture +// +// This is an example that draws a quad with a basemap and +// lightmap to demonstrate multitexturing. +// + +package com.openglesbook.multitexture; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; +import android.opengl.GLUtils; + + +public class MultiTextureRenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public MultiTextureRenderer(Context context) + { + mContext = context; + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + mIndices.put(mIndicesData).position(0); + } + + /// + // Load texture from asset + // + private int loadTextureFromAsset ( String fileName ) + { + int[] textureId = new int[1]; + Bitmap bitmap = null; + InputStream is = null; + + try { + is = mContext.getAssets().open(fileName); + } catch (IOException ioe) { + is = null; + } + + if (is == null) + return 0; + + bitmap = BitmapFactory.decodeStream(is); + + GLES30.glGenTextures ( 1, textureId, 0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, textureId[0] ); + + GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, bitmap, 0); + + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE ); + + return textureId[0]; + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + // Load shaders from 'assets' and get a linked program object + mProgramObject = ESShader.loadProgramFromAsset(mContext, + "shaders/vertexShader.vert", + "shaders/fragmentShader.frag"); + + // Get the sampler locations + mBaseMapLoc = GLES30.glGetUniformLocation ( mProgramObject, "s_baseMap" ); + mLightMapLoc = GLES30.glGetUniformLocation ( mProgramObject, "s_lightMap" ); + + // Load the texture images from 'assets' + mBaseMapTexId = loadTextureFromAsset("textures/basemap.png"); + mLightMapTexId = loadTextureFromAsset("textures/lightmap.png"); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + // / + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the view-port + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex position + mVertices.position(0); + GLES30.glVertexAttribPointer ( 0, 3, GLES30.GL_FLOAT, + false, + 5 * 4, mVertices ); + // Load the texture coordinate + mVertices.position(3); + GLES30.glVertexAttribPointer ( 1, 2, GLES30.GL_FLOAT, + false, + 5 * 4, + mVertices ); + + GLES30.glEnableVertexAttribArray ( 0 ); + GLES30.glEnableVertexAttribArray ( 1 ); + + + // Bind the base map + GLES30.glActiveTexture ( GLES30.GL_TEXTURE0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, mBaseMapTexId ); + + // Set the base map sampler to texture unit to 0 + GLES30.glUniform1i ( mBaseMapLoc, 0 ); + + // Bind the light map + GLES30.glActiveTexture ( GLES30.GL_TEXTURE1 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, mLightMapTexId ); + + // Set the light map sampler to texture unit 1 + GLES30.glUniform1i ( mLightMapLoc, 1 ); + + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, mIndices ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + + // Handle to a program object + private int mProgramObject; + + // Sampler location + private int mBaseMapLoc; + private int mLightMapLoc; + + // Texture handle + private int mBaseMapTexId; + private int mLightMapTexId; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private ShortBuffer mIndices; + private Context mContext; + + private final float[] mVerticesData = + { + -0.5f, 0.5f, 0.0f, // Position 0 + 0.0f, 0.0f, // TexCoord 0 + -0.5f, -0.5f, 0.0f, // Position 1 + 0.0f, 1.0f, // TexCoord 1 + 0.5f, -0.5f, 0.0f, // Position 2 + 1.0f, 1.0f, // TexCoord 2 + 0.5f, 0.5f, 0.0f, // Position 3 + 1.0f, 0.0f // TexCoord 3 + }; + + private final short[] mIndicesData = + { + 0, 1, 2, 0, 2, 3 + }; + +} From 38391e7c922aebf3519b30a5ad9de825af5690c9 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Tue, 1 Oct 2013 16:21:23 -0700 Subject: [PATCH 09/17] Added Android Java implementation of Chapter 6: 'Example6_3' sample that demonstrates using client-side vertex arrays and a constant vertex attribute in OpenGL ES 3.0. Currently tested with Google LG Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- Android_Java/Chapter_6/Example_6_3/.classpath | 5 + Android_Java/Chapter_6/Example_6_3/.project | 33 +++++ .../Chapter_6/Example_6_3/AndroidManifest.xml | 26 ++++ .../Chapter_6/Example_6_3/default.properties | 12 ++ .../Chapter_6/Example_6_3/proguard.cfg | 34 +++++ .../Example_6_3/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../Example_6_3/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../Example_6_3/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../Example_6_3/res/values/strings.xml | 4 + .../openglesbook/example6_3/Example6_3.java | 66 +++++++++ .../example6_3/Example6_3Renderer.java | 133 ++++++++++++++++++ 11 files changed, 313 insertions(+) create mode 100644 Android_Java/Chapter_6/Example_6_3/.classpath create mode 100644 Android_Java/Chapter_6/Example_6_3/.project create mode 100644 Android_Java/Chapter_6/Example_6_3/AndroidManifest.xml create mode 100644 Android_Java/Chapter_6/Example_6_3/default.properties create mode 100644 Android_Java/Chapter_6/Example_6_3/proguard.cfg create mode 100644 Android_Java/Chapter_6/Example_6_3/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_6/Example_6_3/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_6/Example_6_3/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_6/Example_6_3/res/values/strings.xml create mode 100644 Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3.java create mode 100644 Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3Renderer.java diff --git a/Android_Java/Chapter_6/Example_6_3/.classpath b/Android_Java/Chapter_6/Example_6_3/.classpath new file mode 100644 index 0000000..4d67fc6 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_3/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_6/Example_6_3/.project b/Android_Java/Chapter_6/Example_6_3/.project new file mode 100644 index 0000000..d647781 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_3/.project @@ -0,0 +1,33 @@ + + + Ch6_Example_6_3 + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_6/Example_6_3/AndroidManifest.xml b/Android_Java/Chapter_6/Example_6_3/AndroidManifest.xml new file mode 100644 index 0000000..747662b --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_3/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_6/Example_6_3/default.properties b/Android_Java/Chapter_6/Example_6_3/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_3/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_6/Example_6_3/proguard.cfg b/Android_Java/Chapter_6/Example_6_3/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_3/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_6/Example_6_3/res/drawable-hdpi/icon.png b/Android_Java/Chapter_6/Example_6_3/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_6/Example_6_3/res/drawable-ldpi/icon.png b/Android_Java/Chapter_6/Example_6_3/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch6_Example_6_3 + diff --git a/Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3.java b/Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3.java new file mode 100644 index 0000000..40c11a5 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3.java @@ -0,0 +1,66 @@ +package com.openglesbook.example6_3; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class Example6_3 extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new Example6_3Renderer(this)); + } + else + { + Log.e("SimpleTexture2D", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3Renderer.java b/Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3Renderer.java new file mode 100644 index 0000000..f97a44b --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_3/src/com/openglesbook/example6_3/Example6_3Renderer.java @@ -0,0 +1,133 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// Example_6_3 +// +// This example demonstrates using client-side vertex arrays +// and a constant vertex attribute +// + +package com.openglesbook.example6_3; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class Example6_3Renderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public Example6_3Renderer(Context context) + { + + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "layout(location = 0) in vec4 a_color; \n" + + "layout(location = 1) in vec4 a_position; \n" + + "out vec4 v_color; \n" + + "void main() \n" + + "{ \n" + + " v_color = a_color; \n" + + " gl_Position = a_position; \n" + + "}"; + + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec4 v_color; \n" + + "out vec4 o_fragColor; \n" + + "void main() \n" + + "{ \n" + + " o_fragColor = v_color; \n" + + "}" ; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + // / + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Set the vertex color to red + GLES30.glVertexAttrib4f( 0, 1.0f, 0.0f, 0.0f, 1.0f ); + + // Load the vertex position + mVertices.position(0); + GLES30.glVertexAttribPointer ( 1, 3, GLES30.GL_FLOAT, + false, + 0, mVertices ); + + GLES30.glEnableVertexAttribArray ( 1 ); + + GLES30.glDrawArrays ( GLES30.GL_TRIANGLES, 0, 3 ); + + GLES30.glDisableVertexAttribArray ( 1 ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + + // Handle to a program object + private int mProgramObject; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + + private final float[] mVerticesData = + { + 0.0f, 0.5f, 0.0f, // v0 + -0.5f, -0.5f, 0.0f, // v1 + 0.5f, -0.5f, 0.0f // v2 + }; +} From ae8aca98d336b301217589367243185a5bbe1e55 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Tue, 1 Oct 2013 16:23:19 -0700 Subject: [PATCH 10/17] Added Android Java implementation of Chapter 6: 'Example6_6' sample that demonstrates drawing a primitive with a separate VBO per attribute in OpenGL ES 3.0. Currently tested with Google LG Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- Android_Java/Chapter_6/Example_6_6/.classpath | 5 + Android_Java/Chapter_6/Example_6_6/.project | 33 +++ .../Chapter_6/Example_6_6/AndroidManifest.xml | 26 +++ .../Chapter_6/Example_6_6/default.properties | 12 + .../Chapter_6/Example_6_6/proguard.cfg | 34 +++ .../Example_6_6/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../Example_6_6/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../Example_6_6/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../Example_6_6/res/values/strings.xml | 4 + .../openglesbook/example6_6/Example6_6.java | 66 ++++++ .../example6_6/Example6_6Renderer.java | 215 ++++++++++++++++++ 11 files changed, 395 insertions(+) create mode 100644 Android_Java/Chapter_6/Example_6_6/.classpath create mode 100644 Android_Java/Chapter_6/Example_6_6/.project create mode 100644 Android_Java/Chapter_6/Example_6_6/AndroidManifest.xml create mode 100644 Android_Java/Chapter_6/Example_6_6/default.properties create mode 100644 Android_Java/Chapter_6/Example_6_6/proguard.cfg create mode 100644 Android_Java/Chapter_6/Example_6_6/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_6/Example_6_6/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_6/Example_6_6/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_6/Example_6_6/res/values/strings.xml create mode 100644 Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6.java create mode 100644 Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6Renderer.java diff --git a/Android_Java/Chapter_6/Example_6_6/.classpath b/Android_Java/Chapter_6/Example_6_6/.classpath new file mode 100644 index 0000000..4d67fc6 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_6/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_6/Example_6_6/.project b/Android_Java/Chapter_6/Example_6_6/.project new file mode 100644 index 0000000..e41d267 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_6/.project @@ -0,0 +1,33 @@ + + + Ch6_Example_6_6 + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_6/Example_6_6/AndroidManifest.xml b/Android_Java/Chapter_6/Example_6_6/AndroidManifest.xml new file mode 100644 index 0000000..5e59d29 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_6/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_6/Example_6_6/default.properties b/Android_Java/Chapter_6/Example_6_6/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_6/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_6/Example_6_6/proguard.cfg b/Android_Java/Chapter_6/Example_6_6/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_6/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_6/Example_6_6/res/drawable-hdpi/icon.png b/Android_Java/Chapter_6/Example_6_6/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_6/Example_6_6/res/drawable-ldpi/icon.png b/Android_Java/Chapter_6/Example_6_6/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch6_Example_6_6 + diff --git a/Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6.java b/Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6.java new file mode 100644 index 0000000..f2b61e5 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6.java @@ -0,0 +1,66 @@ +package com.openglesbook.example6_6; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class Example6_6 extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new Example6_6Renderer(this)); + } + else + { + Log.e("SimpleTexture2D", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6Renderer.java b/Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6Renderer.java new file mode 100644 index 0000000..521a4f4 --- /dev/null +++ b/Android_Java/Chapter_6/Example_6_6/src/com/openglesbook/example6_6/Example6_6Renderer.java @@ -0,0 +1,215 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// Example_6_6 +// +// This example demonstrates drawing a primitive with +// a separate VBO per attribute +// +// + +package com.openglesbook.example6_6; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class Example6_6Renderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public Example6_6Renderer(Context context) + { + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + + mColors = ByteBuffer.allocateDirect(mColorData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mColors.put(mColorData).position(0); + + mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + mIndices.put(mIndicesData).position(0); + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "layout(location = 0) in vec4 a_position; \n" + + "layout(location = 1) in vec4 a_color; \n" + + "out vec4 v_color; \n" + + "void main() \n" + + "{ \n" + + " v_color = a_color; \n" + + " gl_Position = a_position; \n" + + "}"; + + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec4 v_color; \n" + + "out vec4 o_fragColor; \n" + + "void main() \n" + + "{ \n" + + " o_fragColor = v_color; \n" + + "}" ; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + mVBOIds[0] = 0; + mVBOIds[1] = 0; + mVBOIds[2] = 0; + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + // / + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + drawPrimitiveWithVBOs(); + } + + private void drawPrimitiveWithVBOs() + { + int numVertices = 3; + int numIndices = 3; + + // mVBOIds[0] - used to store vertex position + // mVBOIds[1] - used to store vertex color + // mVBOIds[2] - used to store element indices + if ( mVBOIds[0] == 0 && mVBOIds[1] == 0 && mVBOIds[2] == 0) + { + // Only allocate on the first draw + GLES30.glGenBuffers(3, mVBOIds, 0); + + mVertices.position(0); + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBOIds[0]); + GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vtxStrides[0] * numVertices, + mVertices, GLES30.GL_STATIC_DRAW); + + mColors.position(0); + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBOIds[1]); + GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vtxStrides[1] * numVertices, + mColors, GLES30.GL_STATIC_DRAW); + + mIndices.position(0); + GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, mVBOIds[2]); + GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, 2 * numIndices, + mIndices, GLES30.GL_STATIC_DRAW); + } + + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBOIds[0]); + + GLES30.glEnableVertexAttribArray(VERTEX_POS_INDX); + GLES30.glVertexAttribPointer(VERTEX_POS_INDX, VERTEX_POS_SIZE, + GLES30.GL_FLOAT, false, vtxStrides[0], 0); + + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBOIds[1]); + + GLES30.glEnableVertexAttribArray(VERTEX_COLOR_INDX); + GLES30.glVertexAttribPointer(VERTEX_COLOR_INDX, VERTEX_COLOR_SIZE, + GLES30.GL_FLOAT, false, vtxStrides[1], 0); + + GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, mVBOIds[2]); + + GLES30.glDrawElements(GLES30.GL_TRIANGLES, numIndices, + GLES30.GL_UNSIGNED_SHORT, 0); + + GLES30.glDisableVertexAttribArray(VERTEX_POS_INDX); + GLES30.glDisableVertexAttribArray(VERTEX_COLOR_INDX); + + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0); + GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + // Handle to a program object + private int mProgramObject; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private FloatBuffer mColors; + private ShortBuffer mIndices; + + // VertexBufferObject Ids + private int [] mVBOIds = new int[3]; + + // 3 vertices, with (x,y,z) ,(r, g, b, a) per-vertex + private final float[] mVerticesData = + { + 0.0f, 0.5f, 0.0f, // v0 + -0.5f, -0.5f, 0.0f, // v1 + 0.5f, -0.5f, 0.0f // v2 + }; + + private final short[] mIndicesData = + { + 0, 1, 2 + }; + + private final float [] mColorData = + { + 1.0f, 0.0f, 0.0f, 1.0f, // c0 + 0.0f, 1.0f, 0.0f, 1.0f, // c1 + 0.0f, 0.0f, 1.0f, 1.0f // c2 + }; + + final int VERTEX_POS_SIZE = 3; // x, y and z + final int VERTEX_COLOR_SIZE = 4; // r, g, b, and a + + final int VERTEX_POS_INDX = 0; + final int VERTEX_COLOR_INDX = 1; + + private int vtxStrides[] = + { + VERTEX_POS_SIZE * 4, + VERTEX_COLOR_SIZE * 4 + }; +} From cf56e0027b70dfdbdd82a0652089e743c7cc9b4b Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Tue, 1 Oct 2013 16:29:31 -0700 Subject: [PATCH 11/17] Added Android Java implementation of Chapter 6: 'VertexArrayObjects' sample that demonstrates drawing a primitive with Vertex Array Objects (VAOs)in OpenGL ES 3.0. Currently tested with Google LG Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Chapter_6/VertexArrayObjects/.classpath | 5 + .../Chapter_6/VertexArrayObjects/.project | 33 +++ .../VertexArrayObjects/AndroidManifest.xml | 26 +++ .../VertexArrayObjects/default.properties | 12 ++ .../Chapter_6/VertexArrayObjects/proguard.cfg | 34 +++ .../res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../VertexArrayObjects/res/values/strings.xml | 4 + .../openglesbook/VertexArrayObjects/VAO.java | 66 ++++++ .../VertexArrayObjects/VAORenderer.java | 193 ++++++++++++++++++ 11 files changed, 373 insertions(+) create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/.classpath create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/.project create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/AndroidManifest.xml create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/default.properties create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/proguard.cfg create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/res/values/strings.xml create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAO.java create mode 100644 Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAORenderer.java diff --git a/Android_Java/Chapter_6/VertexArrayObjects/.classpath b/Android_Java/Chapter_6/VertexArrayObjects/.classpath new file mode 100644 index 0000000..4d67fc6 --- /dev/null +++ b/Android_Java/Chapter_6/VertexArrayObjects/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_6/VertexArrayObjects/.project b/Android_Java/Chapter_6/VertexArrayObjects/.project new file mode 100644 index 0000000..3e90c2d --- /dev/null +++ b/Android_Java/Chapter_6/VertexArrayObjects/.project @@ -0,0 +1,33 @@ + + + Ch6_VertexArrayObjects + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_6/VertexArrayObjects/AndroidManifest.xml b/Android_Java/Chapter_6/VertexArrayObjects/AndroidManifest.xml new file mode 100644 index 0000000..d38c0a5 --- /dev/null +++ b/Android_Java/Chapter_6/VertexArrayObjects/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_6/VertexArrayObjects/default.properties b/Android_Java/Chapter_6/VertexArrayObjects/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_6/VertexArrayObjects/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_6/VertexArrayObjects/proguard.cfg b/Android_Java/Chapter_6/VertexArrayObjects/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_6/VertexArrayObjects/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_6/VertexArrayObjects/res/drawable-hdpi/icon.png b/Android_Java/Chapter_6/VertexArrayObjects/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_6/VertexArrayObjects/res/drawable-ldpi/icon.png b/Android_Java/Chapter_6/VertexArrayObjects/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch6_VertexArrayObjects + diff --git a/Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAO.java b/Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAO.java new file mode 100644 index 0000000..0819f4a --- /dev/null +++ b/Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAO.java @@ -0,0 +1,66 @@ +package com.openglesbook.VertexArrayObjects; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class VAO extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new VAORenderer(this)); + } + else + { + Log.e("SimpleTexture2D", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAORenderer.java b/Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAORenderer.java new file mode 100644 index 0000000..d32f79d --- /dev/null +++ b/Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAORenderer.java @@ -0,0 +1,193 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// VertexArrayObjects +// +// This is a simple example drawing a primitive with +// Vertex Array Objects (VAOs) +// + +package com.openglesbook.VertexArrayObjects; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class VAORenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public VAORenderer(Context context) + { + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + + mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + mIndices.put(mIndicesData).position(0); + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "layout(location = 0) in vec4 a_position; \n" + + "layout(location = 1) in vec4 a_color; \n" + + "out vec4 v_color; \n" + + "void main() \n" + + "{ \n" + + " v_color = a_color; \n" + + " gl_Position = a_position; \n" + + "}"; + + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec4 v_color; \n" + + "out vec4 o_fragColor; \n" + + "void main() \n" + + "{ \n" + + " o_fragColor = v_color; \n" + + "}" ; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + // Generate VBO Ids and load the VBOs with data + GLES30.glGenBuffers(2, mVBOIds, 0); + + GLES30.glBindBuffer ( GLES30.GL_ARRAY_BUFFER, mVBOIds[0] ); + + mVertices.position(0); + GLES30.glBufferData ( GLES30.GL_ARRAY_BUFFER, mVerticesData.length * 4, + mVertices, GLES30.GL_STATIC_DRAW); + + GLES30.glBindBuffer ( GLES30.GL_ELEMENT_ARRAY_BUFFER, mVBOIds[1]); + + mIndices.position(0); + GLES30.glBufferData ( GLES30.GL_ELEMENT_ARRAY_BUFFER, 2 * mIndicesData.length, + mIndices, GLES30.GL_STATIC_DRAW ); + + // Generate VAO Id + GLES30.glGenVertexArrays ( 1, mVAOId, 0 ); + + // Bind the VAO and then setup the vertex + // attributes + GLES30.glBindVertexArray ( mVAOId[0] ); + + GLES30.glBindBuffer( GLES30.GL_ARRAY_BUFFER, mVBOIds[0] ); + GLES30.glBindBuffer( GLES30.GL_ELEMENT_ARRAY_BUFFER, mVBOIds[1] ); + + GLES30.glEnableVertexAttribArray( VERTEX_POS_INDX ); + GLES30.glEnableVertexAttribArray( VERTEX_COLOR_INDX ); + + GLES30.glVertexAttribPointer ( VERTEX_POS_INDX, VERTEX_POS_SIZE, + GLES30.GL_FLOAT, false, VERTEX_STRIDE, + 0 ); + + GLES30.glVertexAttribPointer ( VERTEX_COLOR_INDX, VERTEX_COLOR_SIZE, + GLES30.GL_FLOAT, false, VERTEX_STRIDE, + (VERTEX_POS_SIZE * 4) ); + + // Reset to the default VAO + GLES30.glBindVertexArray ( 0 ); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + // / + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Bind the VAO + GLES30.glBindVertexArray ( mVAOId[0] ); + + // Draw with the VAO settings + GLES30.glDrawElements ( GLES30.GL_TRIANGLES, mIndicesData.length, GLES30.GL_UNSIGNED_SHORT, 0 ); + + // Return to the default VAO + GLES30.glBindVertexArray ( 0 ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + // Handle to a program object + private int mProgramObject; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private ShortBuffer mIndices; + + // VertexBufferObject Ids + private int [] mVBOIds = new int[2]; + + // VertexArrayObject Id + private int [] mVAOId = new int[1]; + + // 3 vertices, with (x,y,z) ,(r, g, b, a) per-vertex + private final float[] mVerticesData = + { + 0.0f, 0.5f, 0.0f, // v0 + 1.0f, 0.0f, 0.0f, 1.0f, // c0 + -0.5f, -0.5f, 0.0f, // v1 + 0.0f, 1.0f, 0.0f, 1.0f, // c1 + 0.5f, -0.5f, 0.0f, // v2 + 0.0f, 0.0f, 1.0f, 1.0f, // c2 + }; + + private final short[] mIndicesData = + { + 0, 1, 2 + }; + + final int VERTEX_POS_SIZE = 3; // x, y and z + final int VERTEX_COLOR_SIZE = 4; // r, g, b, and a + + final int VERTEX_POS_INDX = 0; + final int VERTEX_COLOR_INDX = 1; + + final int VERTEX_STRIDE = ( 4 * ( VERTEX_POS_SIZE + VERTEX_COLOR_SIZE ) ); +} From f1f76d5d9ec217323b484bc703ac6c4563c311ff Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Tue, 1 Oct 2013 16:33:51 -0700 Subject: [PATCH 12/17] Added Android Java implementation of Chapter 6: 'VertexBufferObjects' sample that demonstrates drawing a primitive with Vertex Buffer Objects (VBOs)in OpenGL ES 3.0. Currently tested with Google LG Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Chapter_6/VertexBufferObjects/.classpath | 5 + .../Chapter_6/VertexBufferObjects/.project | 33 +++ .../VertexBufferObjects/AndroidManifest.xml | 26 ++ .../VertexBufferObjects/default.properties | 12 + .../VertexBufferObjects/proguard.cfg | 34 +++ .../res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../res/values/strings.xml | 4 + .../openglesbook/VertexBufferObjects/VBO.java | 66 +++++ .../VertexBufferObjects/VBORenderer.java | 237 ++++++++++++++++++ 11 files changed, 417 insertions(+) create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/.classpath create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/.project create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/AndroidManifest.xml create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/default.properties create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/proguard.cfg create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/res/values/strings.xml create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBO.java create mode 100644 Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBORenderer.java diff --git a/Android_Java/Chapter_6/VertexBufferObjects/.classpath b/Android_Java/Chapter_6/VertexBufferObjects/.classpath new file mode 100644 index 0000000..4d67fc6 --- /dev/null +++ b/Android_Java/Chapter_6/VertexBufferObjects/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/Android_Java/Chapter_6/VertexBufferObjects/.project b/Android_Java/Chapter_6/VertexBufferObjects/.project new file mode 100644 index 0000000..559cc10 --- /dev/null +++ b/Android_Java/Chapter_6/VertexBufferObjects/.project @@ -0,0 +1,33 @@ + + + Ch6_VertexBufferObjects + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_6/VertexBufferObjects/AndroidManifest.xml b/Android_Java/Chapter_6/VertexBufferObjects/AndroidManifest.xml new file mode 100644 index 0000000..d554f76 --- /dev/null +++ b/Android_Java/Chapter_6/VertexBufferObjects/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_6/VertexBufferObjects/default.properties b/Android_Java/Chapter_6/VertexBufferObjects/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_6/VertexBufferObjects/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_6/VertexBufferObjects/proguard.cfg b/Android_Java/Chapter_6/VertexBufferObjects/proguard.cfg new file mode 100644 index 0000000..8ad7d33 --- /dev/null +++ b/Android_Java/Chapter_6/VertexBufferObjects/proguard.cfg @@ -0,0 +1,34 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_6/VertexBufferObjects/res/drawable-hdpi/icon.png b/Android_Java/Chapter_6/VertexBufferObjects/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_6/VertexBufferObjects/res/drawable-ldpi/icon.png b/Android_Java/Chapter_6/VertexBufferObjects/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch6_VertexBufferObjects + diff --git a/Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBO.java b/Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBO.java new file mode 100644 index 0000000..51d0e49 --- /dev/null +++ b/Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBO.java @@ -0,0 +1,66 @@ +package com.openglesbook.VertexBufferObjects; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class VBO extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 3.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new VBORenderer(this)); + } + else + { + Log.e("SimpleTexture2D", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBORenderer.java b/Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBORenderer.java new file mode 100644 index 0000000..dca5fd5 --- /dev/null +++ b/Android_Java/Chapter_6/VertexBufferObjects/src/com/openglesbook/VertexBufferObjects/VBORenderer.java @@ -0,0 +1,237 @@ +// +// Book: OpenGL(R) ES 3.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// VertexBufferObjects +// +// This example demonstrates drawing a primitive with +// and without Vertex Buffer Objects (VBOs) +// + +package com.openglesbook.VertexBufferObjects; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.openglesbook.common.ESShader; + +import android.content.Context; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; + +public class VBORenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public VBORenderer(Context context) + { + mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices.put(mVerticesData).position(0); + + // Offset the vertex positions so both can be seen + for ( int i = 0; i < 3; i++ ) + { + mVerticesData[ i * (VERTEX_POS_SIZE + VERTEX_COLOR_SIZE) + 0] += 1.0f; + } + + mVertices1 = ByteBuffer.allocateDirect(mVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mVertices1.put(mVerticesData).position(0); + + mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2) + .order(ByteOrder.nativeOrder()).asShortBuffer(); + mIndices.put(mIndicesData).position(0); + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "layout(location = 0) in vec4 a_position; \n" + + "layout(location = 1) in vec4 a_color; \n" + + "out vec4 v_color; \n" + + "void main() \n" + + "{ \n" + + " v_color = a_color; \n" + + " gl_Position = a_position; \n" + + "}"; + + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "in vec4 v_color; \n" + + "out vec4 o_fragColor; \n" + + "void main() \n" + + "{ \n" + + " o_fragColor = v_color; \n" + + "}" ; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + mVBOIds[0] = 0; + mVBOIds[1] = 0; + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + // / + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // without VBOs + drawPrimitiveWithoutVBOs(); + + // with VBOs + drawPrimitiveWithVBOs(); + } + + private void drawPrimitiveWithoutVBOs() + { + int numIndices = 3; + int vtxStride = 4 * (VERTEX_POS_SIZE + VERTEX_COLOR_SIZE); + + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0); + GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0); + + GLES30.glEnableVertexAttribArray(VERTEX_POS_INDX); + GLES30.glEnableVertexAttribArray(VERTEX_COLOR_INDX); + + mVertices.position(0); + GLES30.glVertexAttribPointer(VERTEX_POS_INDX, VERTEX_POS_SIZE, + GLES30.GL_FLOAT, false, vtxStride, mVertices); + + mVertices.position(VERTEX_POS_SIZE); + GLES30.glVertexAttribPointer(VERTEX_COLOR_INDX, VERTEX_COLOR_SIZE, + GLES30.GL_FLOAT, false, vtxStride, mVertices); + + GLES30.glDrawElements(GLES30.GL_TRIANGLES, numIndices, + GLES30.GL_UNSIGNED_SHORT, mIndices); + + GLES30.glDisableVertexAttribArray(VERTEX_POS_INDX); + GLES30.glDisableVertexAttribArray(VERTEX_COLOR_INDX); + } + + private void drawPrimitiveWithVBOs() + { + int offset = 0; + int numVertices = 3; + int numIndices = 3; + int vtxStride = 4 * (VERTEX_POS_SIZE + VERTEX_COLOR_SIZE); + + // mVBOIds[0] - used to store vertex attribute data + // mVBOIds[l] - used to store element indices + if ( mVBOIds[0] == 0 && mVBOIds[1] == 0) + { + // Only allocate on the first draw + GLES30.glGenBuffers(2, mVBOIds, 0); + + mVertices1.position(0); + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBOIds[0]); + GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vtxStride * numVertices, + mVertices1, GLES30.GL_STATIC_DRAW); + + mIndices.position(0); + GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, mVBOIds[1]); + GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, 2 * numIndices, + mIndices, GLES30.GL_STATIC_DRAW); + } + + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBOIds[0]); + GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, mVBOIds[1]); + + GLES30.glEnableVertexAttribArray(VERTEX_POS_INDX); + GLES30.glEnableVertexAttribArray(VERTEX_COLOR_INDX); + + GLES30.glVertexAttribPointer(VERTEX_POS_INDX, VERTEX_POS_SIZE, + GLES30.GL_FLOAT, false, vtxStride, offset); + offset += VERTEX_POS_SIZE * 4; + + GLES30.glVertexAttribPointer(VERTEX_COLOR_INDX, VERTEX_COLOR_SIZE, + GLES30.GL_FLOAT, false, vtxStride, offset); + + GLES30.glDrawElements(GLES30.GL_TRIANGLES, numIndices, + GLES30.GL_UNSIGNED_SHORT, 0); + + GLES30.glDisableVertexAttribArray(VERTEX_POS_INDX); + GLES30.glDisableVertexAttribArray(VERTEX_COLOR_INDX); + + GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0); + GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + // Handle to a program object + private int mProgramObject; + + // Additional member variables + private int mWidth; + private int mHeight; + private FloatBuffer mVertices; + private FloatBuffer mVertices1; + private ShortBuffer mIndices; + + // VertexBufferObject Ids + private int [] mVBOIds = new int[2]; + + // 3 vertices, with (x,y,z) ,(r, g, b, a) per-vertex + private final float[] mVerticesData = + { + -0.5f, 0.5f, 0.0f, // v0 + 1.0f, 0.0f, 0.0f, 1.0f, // c0 + -1.0f, -0.5f, 0.0f, // v1 + 0.0f, 1.0f, 0.0f, 1.0f, // c1 + 0.0f, -0.5f, 0.0f, // v2 + 0.0f, 0.0f, 1.0f, 1.0f, // c2 + }; + + // Index buffer data + private final short[] mIndicesData = + { + 0, 1, 2 + }; + + final int VERTEX_POS_SIZE = 3; // x, y and z + final int VERTEX_COLOR_SIZE = 4; // r, g, b, and a + + final int VERTEX_POS_INDX = 0; + final int VERTEX_COLOR_INDX = 1; + + final int VERTEX_STRIDE = ( 4 * ( VERTEX_POS_SIZE + VERTEX_COLOR_SIZE ) ); +} From 0d9368ca234448b24c19afdfc0166b445300406d Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Tue, 1 Oct 2013 16:57:20 -0700 Subject: [PATCH 13/17] Added Android Java implementation of Chapter 14: 'ParticleSystem' sample that demonstrates rendering a particle system using a vertex shader and point sprites.in OpenGL ES 3.0. Currently tested with Google LG Nexus 4 (Qualcomm Adreno 320). Will be later tested on Nexus 7 (Gen 2) and Nexus 10. --- .../Chapter_14/ParticleSystem/.classpath | 9 + .../Chapter_14/ParticleSystem/.project | 33 ++ .../ParticleSystem/AndroidManifest.xml | 26 ++ .../ParticleSystem/assets/smoke.png | Bin 0 -> 9380 bytes .../Chapter_14/ParticleSystem/proguard.cfg | 34 ++ .../ParticleSystem/res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes .../ParticleSystem/res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes .../ParticleSystem/res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes .../ParticleSystem/res/values/strings.xml | 4 + .../particlesystem/ParticleSystem.java | 66 ++++ .../ParticleSystemRenderer.java | 302 ++++++++++++++++++ 11 files changed, 474 insertions(+) create mode 100644 Android_Java/Chapter_14/ParticleSystem/.classpath create mode 100644 Android_Java/Chapter_14/ParticleSystem/.project create mode 100644 Android_Java/Chapter_14/ParticleSystem/AndroidManifest.xml create mode 100644 Android_Java/Chapter_14/ParticleSystem/assets/smoke.png create mode 100644 Android_Java/Chapter_14/ParticleSystem/proguard.cfg create mode 100644 Android_Java/Chapter_14/ParticleSystem/res/drawable-hdpi/icon.png create mode 100644 Android_Java/Chapter_14/ParticleSystem/res/drawable-ldpi/icon.png create mode 100644 Android_Java/Chapter_14/ParticleSystem/res/drawable-mdpi/icon.png create mode 100644 Android_Java/Chapter_14/ParticleSystem/res/values/strings.xml create mode 100644 Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystem.java create mode 100644 Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystemRenderer.java diff --git a/Android_Java/Chapter_14/ParticleSystem/.classpath b/Android_Java/Chapter_14/ParticleSystem/.classpath new file mode 100644 index 0000000..b76ec6c --- /dev/null +++ b/Android_Java/Chapter_14/ParticleSystem/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Android_Java/Chapter_14/ParticleSystem/.project b/Android_Java/Chapter_14/ParticleSystem/.project new file mode 100644 index 0000000..0e664e9 --- /dev/null +++ b/Android_Java/Chapter_14/ParticleSystem/.project @@ -0,0 +1,33 @@ + + + Ch14_ParticleSystem + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Android_Java/Chapter_14/ParticleSystem/AndroidManifest.xml b/Android_Java/Chapter_14/ParticleSystem/AndroidManifest.xml new file mode 100644 index 0000000..8c67ded --- /dev/null +++ b/Android_Java/Chapter_14/ParticleSystem/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Java/Chapter_14/ParticleSystem/assets/smoke.png b/Android_Java/Chapter_14/ParticleSystem/assets/smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..828308d3d44d87dae25a847618ffb73869d237b5 GIT binary patch literal 9380 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 +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/Android_Java/Chapter_14/ParticleSystem/res/drawable-hdpi/icon.png b/Android_Java/Chapter_14/ParticleSystem/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/Android_Java/Chapter_14/ParticleSystem/res/drawable-ldpi/icon.png b/Android_Java/Chapter_14/ParticleSystem/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + Ch14_ParticleSystem + diff --git a/Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystem.java b/Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystem.java new file mode 100644 index 0000000..1c3d193 --- /dev/null +++ b/Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystem.java @@ -0,0 +1,66 @@ +package com.openglesbook.particlesystem; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.util.Log; + +/** + * Activity class for example program that detects OpenGL ES 3.0. + **/ +public class ParticleSystem extends Activity { + + private final int CONTEXT_CLIENT_VERSION = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + mGLSurfaceView = new GLSurfaceView(this); + if (detectOpenGLES30()) + { + // Tell the surface view we want to create an OpenGL ES 3.0-compatible + // context, and set an OpenGL ES 2.0-compatible renderer. + mGLSurfaceView.setEGLContextClientVersion(CONTEXT_CLIENT_VERSION); + mGLSurfaceView.setRenderer(new ParticleSystemRenderer(this)); + } + else + { + Log.e("HelloTriangle", "OpenGL ES 3.0 not supported on device. Exiting..."); + finish(); + + } + setContentView(mGLSurfaceView); + } + + private boolean detectOpenGLES30() + { + ActivityManager am = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + ConfigurationInfo info = am.getDeviceConfigurationInfo(); + return (info.reqGlEsVersion >= 0x30000); + } + + @Override + protected void onResume() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mGLSurfaceView.onResume(); + } + + @Override + protected void onPause() + { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mGLSurfaceView.onPause(); + } + + private GLSurfaceView mGLSurfaceView; +} diff --git a/Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystemRenderer.java b/Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystemRenderer.java new file mode 100644 index 0000000..80f16a9 --- /dev/null +++ b/Android_Java/Chapter_14/ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystemRenderer.java @@ -0,0 +1,302 @@ +// +// Book: OpenGL(R) ES 2.0 Programming Guide +// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner +// ISBN-10: 0321502795 +// ISBN-13: 9780321502797 +// Publisher: Addison-Wesley Professional +// URLs: http://safari.informit.com/9780321563835 +// http://www.opengles-book.com +// + +// ParticleSystem +// +// This is an example that demonstrates rendering a particle system +// using a vertex shader and point sprites. +// + +package com.openglesbook.particlesystem; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +import com.openglesbook.common.ESShader; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.opengl.GLES30; +import android.opengl.GLSurfaceView; +import android.opengl.GLUtils; +import android.os.SystemClock; + +public class ParticleSystemRenderer implements GLSurfaceView.Renderer +{ + + /// + // Constructor + // + public ParticleSystemRenderer(Context context) + { + mContext = context; + + // Fill in particle data array + for ( int i = 0; i < (NUM_PARTICLES * PARTICLE_SIZE); i+=PARTICLE_SIZE ) + { + // Lifetime of particle + mParticleData[i + 0] = ( (float)( (int)(Math.random() * 10000) % 10000) / 10000.0f );; + + // End position of particle + mParticleData[i + 1] = ( (float)( (int)(Math.random() * 10000) % 10000) / 5000.0f ) - 1.0f; + mParticleData[i + 2] = ( (float)( (int)(Math.random() * 10000) % 10000) / 5000.0f ) - 1.0f; + mParticleData[i + 3] = ( (float)( (int)(Math.random() * 10000) % 10000) / 5000.0f ) - 1.0f; + + // Start position of particle + mParticleData[i + 4] = ( (float)( (int)(Math.random() * 10000) % 10000) / 40000.0f ) - 0.125f; + mParticleData[i + 5] = ( (float)( (int)(Math.random() * 10000) % 10000) / 40000.0f ) - 0.125f; + mParticleData[i + 6] = ( (float)( (int)(Math.random() * 10000) % 10000) / 40000.0f ) - 0.125f; + } + + mParticles = ByteBuffer.allocateDirect(mParticleData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mParticles.put(mParticleData).position(0); + } + + /// + // Load texture from asset + // + private int loadTextureFromAsset ( String fileName ) + { + int[] textureId = new int[1]; + Bitmap bitmap = null; + InputStream is = null; + + try { + is = mContext.getAssets().open(fileName); + } catch (IOException ioe) { + is = null; + } + + if (is == null) + return 0; + + bitmap = BitmapFactory.decodeStream(is); + + GLES30.glGenTextures ( 1, textureId, 0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, textureId[0] ); + + GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, bitmap, 0); + + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE ); + GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE ); + + return textureId[0]; + } + + /// + // Initialize the shader and program object + // + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + String vShaderStr = + "#version 300 es \n" + + "uniform float u_time; \n" + + "uniform vec3 u_centerPosition; \n" + + "layout(location = 0) in float a_lifetime; \n" + + "layout(location = 1) in vec3 a_startPosition; \n" + + "layout(location = 2) in vec3 a_endPosition; \n" + + "out float v_lifetime; \n" + + "void main() \n" + + "{ \n" + + " if ( u_time <= a_lifetime ) \n" + + " { \n" + + " gl_Position.xyz = a_startPosition + \n" + + " (u_time * a_endPosition); \n" + + " gl_Position.xyz += u_centerPosition; \n" + + " gl_Position.w = 1.0; \n" + + " } \n" + + " else \n" + + " gl_Position = vec4( -1000, -1000, 0, 0 ); \n" + + " v_lifetime = 1.0 - ( u_time / a_lifetime ); \n" + + " v_lifetime = clamp ( v_lifetime, 0.0, 1.0 ); \n" + + " gl_PointSize = ( v_lifetime * v_lifetime ) * 40.0; \n" + + "} \n"; + + String fShaderStr = + "#version 300 es \n" + + "precision mediump float; \n" + + "uniform vec4 u_color; \n" + + "in float v_lifetime; \n" + + "layout(location = 0) out vec4 fragColor; \n" + + "uniform sampler2D s_texture; \n" + + "void main() \n" + + "{ \n" + + " vec4 texColor; \n" + + " texColor = texture( s_texture, gl_PointCoord ); \n" + + " fragColor = vec4( u_color ) * texColor; \n" + + " fragColor.a *= v_lifetime; \n" + + "} \n"; + + // Load the shaders and get a linked program object + mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr); + + // Get the uniform locations + mTimeLoc = GLES30.glGetUniformLocation ( mProgramObject, "u_time" ); + mCenterPositionLoc = GLES30.glGetUniformLocation ( mProgramObject, "u_centerPosition" ); + mColorLoc = GLES30.glGetUniformLocation ( mProgramObject, "u_color" ); + mSamplerLoc = GLES30.glGetUniformLocation ( mProgramObject, "s_texture" ); + + GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + // Load the texture images from 'assets' + mTextureId = loadTextureFromAsset("smoke.png"); + + // Initialize time to cause reset on first update + mTime = 1.0f; + } + + private void update() + { + if (mLastTime == 0) + mLastTime = SystemClock.uptimeMillis(); + long curTime = SystemClock.uptimeMillis(); + long elapsedTime = curTime - mLastTime; + float deltaTime = elapsedTime / 1000.0f; + mLastTime = curTime; + + mTime += deltaTime; + + GLES30.glUseProgram(mProgramObject); + + if ( mTime >= 1.0f ) + { + float [] centerPos = new float[3]; + float [] color = new float[4]; + + mTime = 0.0f; + + // Pick a new start location and color + centerPos[0] = ( (float)( (int)(Math.random() * 10000) % 10000) / 10000.0f ) - 0.5f; + centerPos[1] = ( (float)( (int)(Math.random() * 10000) % 10000) / 10000.0f ) - 0.5f; + centerPos[2] = ( (float)( (int)(Math.random() * 10000) % 10000) / 10000.0f ) - 0.5f; + + GLES30.glUniform3f ( mCenterPositionLoc, centerPos[0], centerPos[1], centerPos[2] ); + + // Random color + color[0] = ( (float)( (int)(Math.random() * 1000) % 10000) / 20000.0f ) + 0.5f; + color[1] = ( (float)( (int)(Math.random() * 1000) % 10000) / 20000.0f ) + 0.5f; + color[2] = ( (float)( (int)(Math.random() * 1000) % 10000) / 20000.0f ) + 0.5f; + color[3] = 0.5f; + + GLES30.glUniform4f ( mColorLoc, color[0], color[1], color[2], color[3] ); + } + + // Load uniform time variable + GLES30.glUniform1f ( mTimeLoc, mTime ); + } + + /// + // Draw a triangle using the shader pair created in onSurfaceCreated() + // + public void onDrawFrame(GL10 glUnused) + { + update(); + + // Set the viewport + GLES30.glViewport(0, 0, mWidth, mHeight); + + // Clear the color buffer + GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + + // Use the program object + GLES30.glUseProgram(mProgramObject); + + // Load the vertex attributes + //[0] + mParticles.position(0); + GLES30.glVertexAttribPointer ( ATTRIBUTE_LIFETIME_LOCATION, 1, GLES30.GL_FLOAT, + false, PARTICLE_SIZE * (4), + mParticles ); + + //[1] + mParticles.position(1); + GLES30.glVertexAttribPointer ( ATTRIBUTE_ENDPOSITION_LOCATION, 3, GLES30.GL_FLOAT, + false, PARTICLE_SIZE * (4), + mParticles ); + + //[4] + mParticles.position(4); + GLES30.glVertexAttribPointer ( ATTRIBUTE_STARTPOSITION_LOCATION, 3, GLES30.GL_FLOAT, + false, PARTICLE_SIZE * (4), + mParticles ); + + + GLES30.glEnableVertexAttribArray ( ATTRIBUTE_LIFETIME_LOCATION ); + GLES30.glEnableVertexAttribArray ( ATTRIBUTE_ENDPOSITION_LOCATION ); + GLES30.glEnableVertexAttribArray ( ATTRIBUTE_STARTPOSITION_LOCATION ); + + // Blend particles + GLES30.glEnable ( GLES30.GL_BLEND ); + GLES30.glBlendFunc ( GLES30.GL_SRC_ALPHA, GLES30.GL_ONE ); + + // Bind the texture + GLES30.glActiveTexture ( GLES30.GL_TEXTURE0 ); + GLES30.glBindTexture ( GLES30.GL_TEXTURE_2D, mTextureId ); + + // Set the sampler texture unit to 0 + GLES30.glUniform1i ( mSamplerLoc, 0 ); + + GLES30.glDrawArrays( GLES30.GL_POINTS, 0, NUM_PARTICLES ); + } + + /// + // Handle surface changes + // + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + mWidth = width; + mHeight = height; + } + + // Handle to a program object + private int mProgramObject; + + // Uniform location + private int mTimeLoc; + private int mColorLoc; + private int mCenterPositionLoc; + private int mSamplerLoc; + + // Texture handle + private int mTextureId; + + // Current time + float time; + + // Additional Member variables + private int mWidth; + private int mHeight; + private long mLastTime = 0; + + private final int NUM_PARTICLES = 1000; + private final int PARTICLE_SIZE = 7; + + private final int ATTRIBUTE_LIFETIME_LOCATION = 0; + private final int ATTRIBUTE_STARTPOSITION_LOCATION = 1; + private final int ATTRIBUTE_ENDPOSITION_LOCATION = 2; + + // Particle vertex data + private float [] mParticleData = new float[ NUM_PARTICLES * PARTICLE_SIZE ]; + + private FloatBuffer mParticles; + + private float mTime; + private Context mContext; +} From edda655e52106eda2cb9e50ef56b2ce0a95846f3 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Thu, 3 Oct 2013 16:59:50 -0700 Subject: [PATCH 14/17] Updated the package name to be consistent with other samples. --- Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml | 2 +- .../{opengles => openglesbook}/hellotriangle/HelloTriangle.java | 2 +- .../hellotriangle/HelloTriangleRenderer.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename Android_Java/Chapter_2/Hello_Triangle/src/com/{opengles => openglesbook}/hellotriangle/HelloTriangle.java (97%) rename Android_Java/Chapter_2/Hello_Triangle/src/com/{opengles => openglesbook}/hellotriangle/HelloTriangleRenderer.java (99%) diff --git a/Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml b/Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml index 8445adb..e9b1f47 100644 --- a/Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml +++ b/Android_Java/Chapter_2/Hello_Triangle/AndroidManifest.xml @@ -1,6 +1,6 @@ diff --git a/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangle.java b/Android_Java/Chapter_2/Hello_Triangle/src/com/openglesbook/hellotriangle/HelloTriangle.java similarity index 97% rename from Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangle.java rename to Android_Java/Chapter_2/Hello_Triangle/src/com/openglesbook/hellotriangle/HelloTriangle.java index 81343be..697be8e 100644 --- a/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangle.java +++ b/Android_Java/Chapter_2/Hello_Triangle/src/com/openglesbook/hellotriangle/HelloTriangle.java @@ -1,4 +1,4 @@ -package com.opengles.hellotriangle; +package com.openglesbook.hellotriangle; import android.app.Activity; import android.app.ActivityManager; diff --git a/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangleRenderer.java b/Android_Java/Chapter_2/Hello_Triangle/src/com/openglesbook/hellotriangle/HelloTriangleRenderer.java similarity index 99% rename from Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangleRenderer.java rename to Android_Java/Chapter_2/Hello_Triangle/src/com/openglesbook/hellotriangle/HelloTriangleRenderer.java index bd87624..9384404 100644 --- a/Android_Java/Chapter_2/Hello_Triangle/src/com/opengles/hellotriangle/HelloTriangleRenderer.java +++ b/Android_Java/Chapter_2/Hello_Triangle/src/com/openglesbook/hellotriangle/HelloTriangleRenderer.java @@ -15,7 +15,7 @@ // example is to demonstrate the basic concepts of // OpenGL ES 3.0 rendering. -package com.opengles.hellotriangle; +package com.openglesbook.hellotriangle; import java.nio.ByteBuffer; import java.nio.ByteOrder; From 3dc8b3046338e70fdd38ad318ead34abfed6b7e2 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Thu, 3 Oct 2013 17:02:07 -0700 Subject: [PATCH 15/17] Updated the package name to be consistent with other samples. --- Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml | 2 +- .../simplevertexshader/SimpleVertexShader.java | 2 +- .../simplevertexshader/SimpleVertexShaderRenderer.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename Android_Java/Chapter_8/Simple_VertexShader/src/com/{opengles => openglesbook}/simplevertexshader/SimpleVertexShader.java (97%) rename Android_Java/Chapter_8/Simple_VertexShader/src/com/{opengles => openglesbook}/simplevertexshader/SimpleVertexShaderRenderer.java (99%) diff --git a/Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml b/Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml index 5219a19..6174d2c 100644 --- a/Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml +++ b/Android_Java/Chapter_8/Simple_VertexShader/AndroidManifest.xml @@ -1,6 +1,6 @@ diff --git a/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShader.java b/Android_Java/Chapter_8/Simple_VertexShader/src/com/openglesbook/simplevertexshader/SimpleVertexShader.java similarity index 97% rename from Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShader.java rename to Android_Java/Chapter_8/Simple_VertexShader/src/com/openglesbook/simplevertexshader/SimpleVertexShader.java index aded6e9..f1c2527 100644 --- a/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShader.java +++ b/Android_Java/Chapter_8/Simple_VertexShader/src/com/openglesbook/simplevertexshader/SimpleVertexShader.java @@ -1,4 +1,4 @@ -package com.opengles.simplevertexshader; +package com.openglesbook.simplevertexshader; import android.app.Activity; import android.app.ActivityManager; diff --git a/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShaderRenderer.java b/Android_Java/Chapter_8/Simple_VertexShader/src/com/openglesbook/simplevertexshader/SimpleVertexShaderRenderer.java similarity index 99% rename from Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShaderRenderer.java rename to Android_Java/Chapter_8/Simple_VertexShader/src/com/openglesbook/simplevertexshader/SimpleVertexShaderRenderer.java index 811e1cf..9148f05 100644 --- a/Android_Java/Chapter_8/Simple_VertexShader/src/com/opengles/simplevertexshader/SimpleVertexShaderRenderer.java +++ b/Android_Java/Chapter_8/Simple_VertexShader/src/com/openglesbook/simplevertexshader/SimpleVertexShaderRenderer.java @@ -14,7 +14,7 @@ // using a vertex shader to transform the object // -package com.opengles.simplevertexshader; +package com.openglesbook.simplevertexshader; import com.openglesbook.common.ESShapes; import com.openglesbook.common.ESShader; From 732ea1652655d195c5e4a4e45582df59b75abbdb Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Thu, 3 Oct 2013 17:11:06 -0700 Subject: [PATCH 16/17] Added missing default.properties for ParticleSystem sample --- .../Chapter_14/ParticleSystem/project.properties | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Android_Java/Chapter_14/ParticleSystem/project.properties diff --git a/Android_Java/Chapter_14/ParticleSystem/project.properties b/Android_Java/Chapter_14/ParticleSystem/project.properties new file mode 100644 index 0000000..84334b5 --- /dev/null +++ b/Android_Java/Chapter_14/ParticleSystem/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +android.library.reference.1=../../Common/ +# Project target. +target=android-18 From b7a7d52d5ace656320cfdb09f0360e3989ff3dc8 Mon Sep 17 00:00:00 2001 From: javedrabbani Date: Thu, 3 Oct 2013 17:14:09 -0700 Subject: [PATCH 17/17] Removed project.properties and added default.properties for ParticleSystem sample. Previous commit mistakenly added project.properties instead of default.properties! --- .../Chapter_14/ParticleSystem/default.properties | 12 ++++++++++++ .../Chapter_14/ParticleSystem/project.properties | 15 --------------- 2 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 Android_Java/Chapter_14/ParticleSystem/default.properties delete mode 100644 Android_Java/Chapter_14/ParticleSystem/project.properties diff --git a/Android_Java/Chapter_14/ParticleSystem/default.properties b/Android_Java/Chapter_14/ParticleSystem/default.properties new file mode 100644 index 0000000..5ccd841 --- /dev/null +++ b/Android_Java/Chapter_14/ParticleSystem/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-18 +android.library.reference.1=../../Common/ diff --git a/Android_Java/Chapter_14/ParticleSystem/project.properties b/Android_Java/Chapter_14/ParticleSystem/project.properties deleted file mode 100644 index 84334b5..0000000 --- a/Android_Java/Chapter_14/ParticleSystem/project.properties +++ /dev/null @@ -1,15 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -android.library.reference.1=../../Common/ -# Project target. -target=android-18