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];
}
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.