I get this error message
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): FATAL EXCEPTION: GLThread 9
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): java.lang.IllegalArgumentException: length - offset < n
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): at android.opengl.Matrix.multiplyMV(Native Method)
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): at android.opengl.GLU.gluUnProject(GLU.java:237)
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): at android.app.ui.GLSurfaceRenderer.vector3(GLSurfaceRenderer.java:70)
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): at android.app.ui.GLSurfaceRenderer.onDrawFrame(GLSurfaceRenderer.java:103)
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1332)
08-30 19:20:17.774: ERROR/AndroidRuntime(4681): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)
With this code:
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
import android.util.*;
public class GLSurfaceRenderer implements Renderer{
public static float setx, sety;
private static float posx, posy, posz = 100;
private double speed;
private static float rotation;
private static float statrotation;
public static boolean isPressed;
private static FlatColoredSquare square;
private static FlatColoredSquare statSquare;
public final static String TAG = "input";
public GLSurfaceRenderer () {
square = new FlatColoredSquare();
statSquare = new FlatColoredSquare();
rotation = (float) Math.floor(Math.random()*361);
speed = 0.1;
}
public void vector3 (GL11 gl){
int[] viewport = new int[4];
float[] modelview = new float[16];
float[] projection = new float[16];
float winx, winy, winz;
float[] newcoords = new float[3];
gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
((GL11) gl).glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
((GL11) gl).glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);
winx = (float)setx;
winy = (float)viewport[3] - sety;
winz = 0;
GLU.gluUnProject(winx, winy, winz, modelview, 0, projection, 0, viewport, 0, newcoords, 0);
posx = (int)newcoords[1];
posy = (int)newcoords[2];
posz = (int)newcoords[3];
Log.d(TAG, "vector3 Used");
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glScalef(100, 100, 0);
gl.glPushMatrix();
gl.glRotatef(rotation, 0, 0, 1);
gl.glTranslatef((float) speed/10, 0, 0);
square.draw(gl);
gl.glPopMatrix();
gl.glPushMatrix();
gl.glTranslatef(posx, posy, posz);
gl.glRotatef(statrotation,0,0,1);
statSquare.draw(gl);
gl.glPopMatrix();
statrotation++;
speed++;
Log.d(TAG, "Frame Drawn");
vector3((GL11) gl);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl, -width, width, -height, height);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}
}
Notice that I have attempted to call the vector3() method in my Draw method which appears to work because it reads far enough to pick out an error in the actual method. The error is thrown at this line
GLU.gluUnProject(winx, winy, winz, modelview, 0, projection, 0, viewport, 0, newcoords, 0);
Note that setx and sety should be equal to 0 at the point the error is thrown as the screen has not yet been touched.
Could the error be anything to do with my glSurfaceView?
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.*;
import android.view.MotionEvent;
public class Input extends GLSurfaceView {
public GLSurfaceRenderer glSurfaceRenderer;
public float setx, sety;
public final static String TAG = "input";
public Input(Context context) {
super(context);
glSurfaceRenderer = new GLSurfaceRenderer();
setRenderer(glSurfaceRenderer);
}
@Override
public boolean onTouchEvent(MotionEvent event){
if (event.getAction() == MotionEvent.ACTION_DOWN){
setx = event.getX();
sety = event.getY();
Log.d(TAG, "isPressed triggered");
}
return true;
}
}