kodiak211
Member
I'm wanting to give my model in my live wallpaper some animations. How I have it set up now, It's spins around my model. What I want to do is, have it pan left and right, and when you touch the screen, it animates my model. Here are some references of what I'm doing, and what I'm wanting to do.
My own app
3D Jelly Bean Live Wallpaper
Jelly Bean 3D Live Wallpaper - YouTube
What I'm trying to do
Amazing Spider-Man 3D Live WP
https://www.youtube.com/watch?v=OlXuubJs0b0&feature=player_embedded
minus the soundboard and widgets.
Crown Skull LiveWallpaper
https://play.google.com/store/apps/...sMSwxLDEsImNyb3duc2t1bGwubGl2ZXdhbGxwYXBlciJd
FileTexture.java
GLModel.java
OpenGLRenderer.java
My own app
3D Jelly Bean Live Wallpaper
Jelly Bean 3D Live Wallpaper - YouTube
What I'm trying to do
Amazing Spider-Man 3D Live WP
https://www.youtube.com/watch?v=OlXuubJs0b0&feature=player_embedded
minus the soundboard and widgets.
Crown Skull LiveWallpaper
https://play.google.com/store/apps/...sMSwxLDEsImNyb3duc2t1bGwubGl2ZXdhbGxwYXBlciJd
FileTexture.java
Code:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Random;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
import javax.microedition.khronos.opengles.GL11Ext;
import com.Beck.GLExample.R;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
public class FileTexture {
public Context context;
private GL10 gl;
private int[] textures = new int[1];
private static BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options();
private Bitmap bitmap;
private String fname;
public FileTexture(GL10 gl,String fname) {
if(gl==null)return;
this.gl = gl;
this.fname=fname;
sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;
context = GLExample.context;
}
public void loadTexture() {
InputStream is = context.getResources().openRawResource(R.drawable.jellytext);
bitmap = BitmapFactory.decodeStream(is);
createTexture();
}
private void createTexture() {
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glPixelStorei(GL10.GL_UNPACK_ALIGNMENT, 1);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_REPEAT);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_MODULATE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
int error = gl.glGetError();
if (error != GL10.GL_NO_ERROR) {
Log.w("", "" + error);
}
//}
}
public void setTexture() {
gl.glBindTexture(GL10.GL_TEXTURE_2D, this.textures[0]);
}
}
GLModel.java
Code:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
import com.Beck.GLExample.R;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Handler;
import android.util.Log;
class GLModel implements Serializable {
private static String mTex;
private static int intTex;
private float moonangle = 0f;
private int IdxCnt;
private float langle = 0f;
public static boolean useshading = false;
public static float shadowcolor = 0.50f;
private static FileTexture filetexture;
// public static final Handler mHandler = new Handler();
// Create runnable for posting
public static final Runnable mUpdateTex = new Runnable() {
public void run() {
InitTex();
}
};
public GLModel(Context context) {
mContext = context;
loadObj();
Log.e("Model", "LOADED");
}
public static void InitTex() {
intTex = 3;
setTexture(1);
filetexture = new FileTexture(gl11, "null");
filetexture.loadTexture();
textures = new GLTextures(gl11, mContext);
textures.add(R.drawable.jellytext);
textures.loadTextures();
}
public void Init(GL10 gl) {
if (gl == null)
return;
gl11 = (GL11) gl;
InitTex();
int[] buffer = new int[1];
gl11.glGenBuffers(1, buffer, 0);
mVertBufferIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertBufferIndex);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, mVertexBuffer.capacity() * 4,
mVertexBuffer, GL11.GL_STATIC_DRAW);
Log.e("Vertex", "ok");
gl11.glGenBuffers(1, buffer, 0);
mNormBufferIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mNormBufferIndex);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, mNormBuffer.capacity() * 4,
mNormBuffer, GL11.GL_STATIC_DRAW);
Log.e("Normal", "ok");
// texcoord buffer
gl11.glGenBuffers(1, buffer, 0);
mTexBufferIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mTexBufferIndex);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, mTexBuffer.capacity() * 4,
mTexBuffer, GL11.GL_STATIC_DRAW);
Log.e("Texture", "ok");
// unbind array buffer
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
// Buffer d'indices
gl11.glGenBuffers(1, buffer, 0);
mIndexBufferIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mIndexBufferIndex);
gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER,
mIndexBuffer.capacity() * 2, mIndexBuffer, GL11.GL_STATIC_DRAW);
// Unbind the element array buffer.
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);
Log.e("VboCube", "Idx ok");
IdxCnt = mIndexBuffer.capacity();
}
private void loadObj() {
try {
AssetManager am = mContext.getAssets();
String str;
String[] tmp;
String[] ftmp;
float v;
ArrayList<Float> vlist = new ArrayList<Float>();
ArrayList<Float> tlist = new ArrayList<Float>();
ArrayList<Float> nlist = new ArrayList<Float>();
ArrayList<Fp> fplist = new ArrayList<Fp>();
BufferedReader inb = new BufferedReader(new InputStreamReader(am
.open("jellybean.obj")), 1024);
while ((str = inb.readLine()) != null) {
tmp = str.split(" ");
if (tmp[0].equalsIgnoreCase("v")) {
for (int i = 1; i < 4; i++) {
v = Float.parseFloat(tmp[i]);
vlist.add(v);
}
}
if (tmp[0].equalsIgnoreCase("vn")) {
for (int i = 1; i < 4; i++) {
v = Float.parseFloat(tmp[i]);
nlist.add(v);
}
}
if (tmp[0].equalsIgnoreCase("vt")) {
for (int i = 1; i < 3; i++) {
v = Float.parseFloat(tmp[i]);
tlist.add(v);
}
}
if (tmp[0].equalsIgnoreCase("f")) {
for (int i = 1; i < 4; i++) {
ftmp = tmp[i].split("/");
long chi = Integer.parseInt(ftmp[0]) - 1;
int cht = Integer.parseInt(ftmp[1]) - 1;
int chn = Integer.parseInt(ftmp[2]) - 1;
fplist.add(new Fp(chi, cht, chn));
}
NBFACES++;
}
}
ByteBuffer vbb = ByteBuffer.allocateDirect(fplist.size() * 4 * 3);
vbb.order(ByteOrder.nativeOrder());
mVertexBuffer = vbb.asFloatBuffer();
ByteBuffer vtbb = ByteBuffer.allocateDirect(fplist.size() * 4 * 2);
vtbb.order(ByteOrder.nativeOrder());
mTexBuffer = vtbb.asFloatBuffer();
ByteBuffer nbb = ByteBuffer.allocateDirect(fplist.size() * 4 * 3);
nbb.order(ByteOrder.nativeOrder());
mNormBuffer = nbb.asFloatBuffer();
for (int j = 0; j < fplist.size(); j++) {
mVertexBuffer.put(vlist.get((int) (fplist.get(j).Vi * 3)));
mVertexBuffer.put(vlist.get((int) (fplist.get(j).Vi * 3 + 1)));
mVertexBuffer.put(vlist.get((int) (fplist.get(j).Vi * 3 + 2)));
mTexBuffer.put(tlist.get(fplist.get(j).Ti * 2));
mTexBuffer.put(tlist.get((fplist.get(j).Ti * 2) + 1));
mNormBuffer.put(nlist.get(fplist.get(j).Ni * 3));
mNormBuffer.put(nlist.get((fplist.get(j).Ni * 3) + 1));
mNormBuffer.put(nlist.get((fplist.get(j).Ni * 3) + 2));
}
mIndexBuffer = CharBuffer.allocate(fplist.size());
for (int j = 0; j < fplist.size(); j++) {
mIndexBuffer.put((char) j);
}
mVertexBuffer.position(0);
mTexBuffer.position(0);
mNormBuffer.position(0);
mIndexBuffer.position(0);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void draw(GL10 gl, boolean showmoon) {
if (gl11 == null)
return;
if (gl11 == null)
return;
gl.glPushMatrix();
gl.glEnable(GL10.GL_TEXTURE_2D);
filetexture.setTexture();
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mTexBufferIndex);
gl11.glClientActiveTexture(GL10.GL_TEXTURE0); // lightmap
gl11.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl11.glTexCoordPointer(2, GL10.GL_FLOAT, 0, 0);
gl11.glClientActiveTexture(GL10.GL_TEXTURE1); // color
gl11.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl11.glTexCoordPointer(2, GL10.GL_FLOAT, 0, 0);
gl11.glActiveTexture(GL10.GL_TEXTURE0);
gl11.glEnable(GL10.GL_TEXTURE_2D);
gl11.glActiveTexture(GL10.GL_TEXTURE1);
gl11.glEnable(GL10.GL_TEXTURE_2D);
gl11.glColor4f(shadowcolor, shadowcolor, shadowcolor, shadowcolor);
gl11.glActiveTexture(GL10.GL_TEXTURE0);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL11.GL_COMBINE);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB,
GL10.GL_ADD);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB,
GL10.GL_TEXTURE);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB,
GL11.GL_PREVIOUS);
gl11.glActiveTexture(GL10.GL_TEXTURE1);
filetexture.setTexture();
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL11.GL_COMBINE);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB,
GL10.GL_MODULATE);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB,
GL11.GL_PREVIOUS);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB,
GL10.GL_TEXTURE);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB,
GL10.GL_SRC_COLOR);
gl11.glTexEnvi(GL10.GL_TEXTURE_ENV, GL11.GL_OPERAND1_RGB,
GL10.GL_SRC_COLOR);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertBufferIndex);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mNormBufferIndex);
gl11.glNormalPointer(GL10.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mIndexBufferIndex);
gl11.glDrawElements(GL11.GL_TRIANGLES, IdxCnt, GL11.GL_UNSIGNED_SHORT,
0);
gl.glPopMatrix();
}
public void freeHardwareBuffers() {
int[] buffer = new int[1];
buffer[0] = mVertBufferIndex;
buffer[0] = mTexBufferIndex;
buffer[0] = mNormBufferIndex;
buffer[0] = mIndexBufferIndex;
mVertBufferIndex = 0;
mIndexBufferIndex = 0;
mTexBufferIndex = 0;
mNormBufferIndex = 0;
Log.d("Log", "hardware buffer freed");
}
public static void setTexture(int t) {
intTex = t;
t = 1;
switch (t) {
case 0:
mTex = "0";
break;
}
}
private class Fp {
public long Vi;
public int Ti;
public int Ni;
public Fp(long chi, int ti, int ni) {
Vi = chi;
Ti = ti;
Ni = ni;
}
}
public static GL11 gl11;
private static int NBFACES = 0;
private static GLTextures textures;
private static int mVertBufferIndex;
private static int mNormBufferIndex;
private static int mTexBufferIndex;
private static int mIndexBufferIndex;
private static FloatBuffer mVertexBuffer;
private static FloatBuffer mTexBuffer;
private static FloatBuffer mNormBuffer;
private static CharBuffer mIndexBuffer;
private static Context mContext;
}
OpenGLRenderer.java
Code:
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.*;
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
public class OpenGLRenderer implements GLWallpaperService.Renderer {
public int toss;
public int count;
private GLModel model;
public Context context;
public float angle =0;
public OpenGLRenderer() {
this.context = GLExample.context;
model = new GLModel(this.context);
}
/*
* (non-Javadoc)
*
* @see
* android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(javax.microedition
* .khronos.opengles.GL10, javax.microedition.khronos.egl.EGLConfig)
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Set the background color to black ( rgba ).
model.Init(gl);
gl.glEnable(GL10.GL_TEXTURE_2D); //Enable Texture Mapping ( NEW )
gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //Black Background
gl.glClearDepthf(1.0f); //Depth Buffer Setup
gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing
gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do
//Really Nice Perspective Calculations
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
}
/*
* (non-Javadoc)
*
* @see
* android.opengl.GLSurfaceView.Renderer#onDrawFrame(javax.microedition.
* khronos.opengles.GL10)
*/
public void onDrawFrame(GL10 gl) {
if (gl == null)
return;
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
gl.glScalef(.2f, .2f, .2f);
gl.glTranslatef(0, -1f, -20f);
gl.glRotatef (angle, 0.0f, 1.0f, 0.0f);
gl.glRotatef (90f, 0.0f, 0.0f, 1.0f);
gl.glRotatef(-90f, 0.0f, 0.0f, 1.0f);
gl.glScalef(1.6f, 1.6f, 1.6f);
model.draw(gl, false);
gl.glPopMatrix();
angle = angle + .1f;
}
/*
* (non-Javadoc)
*
* @see
* android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(javax.microedition
* .khronos.opengles.GL10, int, int)
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
// Sets the current view port to the new size.
model.Init(gl);
//model.InitTex();
//square.loadGLTexture(gl, this.context);
//square2.loadGLTexture(gl, this.context);
gl.glViewport(0, 0, width, height);
// Select the projection matrix
gl.glMatrixMode(GL10.GL_PROJECTION);
// Reset the projection matrix
gl.glLoadIdentity();
// Calculate the aspect ratio of the window
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
100.0f);
// Select the modelview matrix
gl.glMatrixMode(GL10.GL_MODELVIEW);
// Reset the modelview matrix
gl.glLoadIdentity();
}
}