I am using the OpenGl Es library to render a 3D object. I get an OutofMemoryError exception I tried and searched on google but could not succeed
Please help me solve this problem.
package com.amplimesh.models; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.StringTokenizer; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLUtils; import android.util.Log; import com.amplimesh.util.Point3; public class ObjModel { public void bindTextures(Context context, GL10 gl) { Bitmap bitmap; try { InputStream is = context.getAssets().open("textures/"+mTextureName); bitmap = BitmapFactory.decodeStream(is); if (bitmap == null) { Log.v("ObjModel", "err loading bitmap!"); } } catch (java.io.IOException e) { Log.v("ObjModel", "err loading tex: "+e.toString()); return; } mTextures = new int[1]; gl.glGenTextures(1, mTextures, 0); gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); bitmap.recycle(); } public void draw(GL10 gl) { gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); for (Model model : mModels) { gl.glVertexPointer(3, GL10.GL_FLOAT, 0, model.v); if (model.vt != null && mTextures != null) { gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, model.vt); } if (model.vn != null) { gl.glNormalPointer(GL10.GL_FLOAT, 0, model.vn); } gl.glDrawArrays(GL10.GL_TRIANGLES, 0, model.v_size); } gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); } public static ObjModel loadFromStream(InputStream is, String texture_name) throws IOException { ObjModel obj = ObjLoader.loadFromStream(is); obj.mTextureName = texture_name; return obj; } private Model mModels[]; private int mTextures[]; private String mTextureName; private static class ObjLoader { public static ObjModel loadFromStream(InputStream is) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); ObjModel obj = new ObjModel(); ArrayList<Point3> v = new ArrayList<Point3>(); ArrayList<Point3> vt = new ArrayList<Point3>(); ArrayList<Point3> vn = new ArrayList<Point3>(); ArrayList<Face> f = new ArrayList<Face>(); ArrayList<Model> o = new ArrayList<Model>(); boolean o_pending=false; while(reader.ready()) { String line = reader.readLine(); if (line == null) break; StringTokenizer tok = new StringTokenizer(line); String cmd = tok.nextToken(); if (cmd.equals("o")) { if (o_pending) { Model model = new Model(); model.fill(f, vt.size() > 0, vn.size() > 0); o.add(model); } else { o_pending=true; } } else if (cmd.equals("v")) { v.add(read_point(tok)); } else if (cmd.equals("vn")) { vn.add(read_point(tok)); } else if (cmd.equals("vt")) { vt.add(read_point(tok)); } else if (cmd.equals("f")) { if (tok.countTokens() != 3) continue; Face face = new Face(3); while (tok.hasMoreTokens()) { StringTokenizer face_tok = new StringTokenizer(tok.nextToken(), "/"); int v_idx = -1; int vt_idx = -1; int vn_idx = -1; v_idx = Integer.parseInt(face_tok.nextToken()); if (face_tok.hasMoreTokens()) vt_idx = Integer.parseInt(face_tok.nextToken()); if (face_tok.hasMoreTokens()) vn_idx = Integer.parseInt(face_tok.nextToken());
Stacktrace
08-03 16:22:31.794: E/AndroidRuntime(18878): FATAL EXCEPTION: AsyncTask
source share