javaandroidopengl-estexturing

OpenGL Texturing with Android Context


I'm trying to create a program that can texture multiple cubes. I have been successful in coloring but am facing some difficulties texturing, primarily regarding my Android Activity.

I don't know how to set 2 contents (or if that is even possible) or how to set Renderer to my original setContentView(R.layout.activity_my_glsurface_view).

I need this in order to call mCube.loadTexture(this.context, R.drawable.app_icon_your_company) in my GLRenderer to apply my texture to my cube. I'll attach my code below, if there is another way of doing this in Android please let me know but all the tutorials I've come across do it this way and I face the same problem.

Below is my Main Activity:

public class MainActivity extends Activity implements OnClickListener{

int TriData = (Triangle.triangleCoords.length)/Triangle.COORDS_PER_VERTEX;
int SquData = (Square.squareCoords.length)/Square.COORDS_PER_VERTEX;
int CubeData = Cube.COORDS_PER_VERTEX * 4;
int amount = CubeData;

private GLSurfaceView mGLView;
private TextView mText;
private Button mBTN;




        @Override
        public void onCreate (Bundle savedInstanceState){
            super.onCreate(savedInstanceState);

            // Create a GLSurfaceView instance and set it-altered glsurfaceview to contain GL elements
            // as the ContentView for this Activity.
            // mGLView = new MyGLSurfaceView(this);
            setContentView(R.layout.activity_my_glsurface_view);

            FrameLayout surface = (FrameLayout) findViewById(R.id.middleSurface);
            surface.addView(new MyGLSurfaceView(this));

            mGLView = new GLSurfaceView(this); //this is where my error occurs
            mGLView.setRenderer(new MyGLRenderer(this));
            setContentView(mGLView);

            mBTN = (Button) findViewById(R.id.MyButton);
            mBTN.setOnClickListener(MainActivity.this);



            mText = (TextView) findViewById(R.id.MyGl);
            mText.setText("Vertices drawn: " + amount + "\r\n" + "FPS: " + MyGLRenderer.FPS + "\r\n" + "Frametime: " + MyGLRenderer.FRAME_TIME_MILLIS + "\r\n" + "Cube Total: " );


        }

@Override
public void onClick(View v) {
    Intent push = new Intent(MainActivity.this, Test.class);
    //where the 2nd in this case is the class you want to run.

    startActivity(push);

  }
}

I'll include my loadTexture from my Cube.java class as well:

public int loadTexture(final Context context, final int resourceId) {
    //Get the texture from the Android resource directory
    final int[] textureHandle = new int[1];
    InputStream is = context.getResources().openRawResource(+ R.drawable.app_icon_your_company);
    Bitmap bitmap = null;
    try {
        //BitmapFactory is an Android graphics utility for images
        bitmap = BitmapFactory.decodeStream(is);

    } finally {
        //Always clear and close
        try {
            is.close();
            is = null;
        } catch (IOException e) {
        }
    }

    //Generate one texture pointer...
    GLES20.glGenTextures(1, textureHandle, 0);
    //...and bind it to our array
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);

    //Create Nearest Filtered Texture
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

    //Accounting for different texture parameters
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

    //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

    //Clean up
    bitmap.recycle();


    if (textureHandle[0] == 0)

    {
        throw new RuntimeException("Error loading texture");
    }

    return textureHandle[0];
}

Solution

  • I was calling loadTexture incorrectly and should have been as follows within onSurfaceCreated rather than in onSurfaceChanged:

    TexturedCube.mTextureDataHandle = TexturedCube.loadTexture(context, R.drawable.app_icon_your_company);
    

    Additionally, I was able to properly access context via my MyGLSurfaceViewFunction that I neglected to provide rather than setting my content view to mGLView. This enabled me to properly texture.