20 Chapter Programming 3d graphics with OpenGL


Using GLSurfaceView from an Activity



Download 320.47 Kb.
Page5/11
Date19.06.2017
Size320.47 Kb.
#21018
1   2   3   4   5   6   7   8   9   10   11

Using GLSurfaceView from an Activity


Listing 20–11 shows a typical activity that uses a GLSurfaceView along with a suitable renderer.

Listing 20–11. A Simple OpenGLTestHarness Activity

public class OpenGLTestHarnessActivity extends Activity {

private GLSurfaceView mTestHarness;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mTestHarness = new GLSurfaceView(this);

mTestHarness.setEGLConfigChooser(false);

mTestHarness.setRenderer(new SimpleTriangleRenderer(this));

mTestHarness.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

//mTestHarness.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

setContentView(mTestHarness);

}

@Override



protected void onResume() {

super.onResume();

mTestHarness.onResume();

}

@Override



protected void onPause() {

super.onPause();

mTestHarness.onPause();

}

}



Let's explain the key elements of this source code. Here is the code that instantiates the GLSurfaceView:

mTestHarness = new GLSurfaceView(this);

We then tell the view that we don't need a special EGL config chooser and the default will work by doing the following:

mTestHarness.setEGLConfigChooser(false);

Then we set our renderer as follows:

mTestHarness.setRenderer(new SimpleTriangleRenderer(this));

Next, we use one of these two methods to allow for animation or not:

mTestHarness.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

//mTestHarness.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

If we choose the first line, the drawing is going to be called only once or, more accurately, whenever it needs to be drawn. If we choose the second option, our drawing code will be called repeatedly so that we can animate our drawings.

That's all there is to interfacing with OpenGL on Android.

Now we have all the pieces necessary to test this drawing. We have the activity in Listing 20–11, we have the abstract renderer in Listing 20–9, and the SimpleTriangleRenderer (Listing 20–10) itself. All we have to do is invoke the Activity class through any of our menu items using the following:

private void invokeSimpleTriangle()

{

Intent intent = new Intent(this,OpenGLTestHarnessActivity.class);



startActivity(intent);

}

Of course, we will have to register the activity in the Android manifest file, like so:



android:label="OpenGL Test Harness"/>

Although it’s perfectly reasonable to design a standalone activity like the OpenGLTestHarnessActivity in Listing 20–11, we would like to propose an alternative that fits this chapter much better.

This need comes from the fact that we have a number of demos in this chapter. If we were to design a separate activity for each demo, we would end up with lot of code that looks very similar to what we have in Listing 20–11 and does not elucidate over and above. In addition, each of those activities needs to be registered in the manifest file.

With this in mind, let's create a unified activity that allows us to test all OpenGL ES 1.0 demos. The code is in Listing 20–12. It may look extensive compared to the activity listed in 20–11; however, if you look at the menu response for R.id.mid_opengl_simpletriangle, you'll see that we are doing essentially the same thing. As more menu options are implemented, we'll have more if statements, one each for the type of demo.

The other menu options will be explored as we go through the chapter. After Listing 20–12, we'll present the menu .xml file followed by an explanation of this multipurpose activity in a bit more detail.



Listing 20–12. MultiviewTestHarness Activity

//filename: MultiViewTestHarnessActivity.java

public class MultiViewTestHarnessActivity extends Activity {

private GLSurfaceView mTestHarness;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mTestHarness = new GLSurfaceView(this);

mTestHarness.setEGLConfigChooser(false);

Intent intent = getIntent();

int mid = intent.getIntExtra("com.ai.menuid", R.id.mid_OpenGL_Current);

if (mid == R.id.mid_OpenGL_SimpleTriangle)

{

mTestHarness.setRenderer(new SimpleTriangleRenderer(this));



mTestHarness.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

setContentView(mTestHarness);

return;

}

if (mid == R.id.mid_OpenGL_Current)



{

//Call someother OpenGL Renderer

//and

//return;



}

//otherwise do this

mTestHarness.setRenderer(new SimpleTriangleRenderer(this));

mTestHarness.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

setContentView(mTestHarness);

return;


}

@Override

protected void onResume() {

super.onResume();

mTestHarness.onResume();

}

@Override



protected void onPause() {

super.onPause();

mTestHarness.onPause();

}

}



The menu file in Listing 20–13 supports the code in Listing 20–12. This file is called res/menu/main_menu.xml. We went ahead and created all the possible menu items for all the demos of this chapter.

Listing 20–13. Main Menu File





android:title="Simple Triangle" />



android:title="Two Triangles" />



android:title="Animated Triangle" />



android:title="Rectangle" />



android:title="Square polygon" />



android:title="Polygon" />



android:title="Textured Square" />



android:title="Textured Polygon" />



android:title="Multiple Figures" />



android:title="Current" />



android:title="ES20 Triangle" />





By looking at the menu .xml file, we can anticipate the type of OpenGL renderers that will be demonstrated. If we return to the multiview activity in Listing 20–12, we'll notice that the activity is switching the renderer based on the menu IDs defined in this menu .xml file.

How does the multiview activity get the menu ID? This is done by the following code snippet (taken from Listing 20–12):

Intent intent = getIntent();

int mid = intent.getIntExtra("com.ai.menuid",

R.id.mid_OpenGL_Current);

This code snippet is asking the intent that is responsible for invoking this activity if there is an extra called "com.ai.menuid." If it's not present, then the code should use a menu id called "mid_opengl_current" as the default menu ID.

Who puts this extra in the intent? Where is the invoking driver activity? This invoking driver activity is presented in Listing 20–14.



Listing 20–14. TestOpenGLMainDriver Activity

public class TestOpenGLMainDriverActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override



public boolean onCreateOptionsMenu(Menu menu){

super.onCreateOptionsMenu(menu);

MenuInflater inflater = getMenuInflater(); //from activity

inflater.inflate(R.menu.main_menu, menu);

return true;

}

@Override



public boolean onOptionsItemSelected(MenuItem item)

{

this.invokeMultiView(item.getItemId());



return true;

}

private void invokeMultiView(int mid)



{

Intent intent =

new Intent(this,MultiViewTestHarnessActivity.class);

intent.putExtra("com.ai.menuid", mid);

startActivity(intent);

}

}



We need a layout file to complete and compile this activity. This layout file is in Listing 20–15.

Listing 20–15. TestOpenGLMainDriver Activity Layout File (layout/main.xml)



android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="A Simple Main Activity. Click Menu to Proceed"

/>

Of course, nothing moves in Android without a manifest file. The manifest file is given in Listing 20–16.



Listing 20–16. AndroidManifest File

package="com.androidbook.OpenGL"

android:versionCode="1"

android:versionName="1.0.0">



android:label="OpenGL Test Harness"

android:debuggable="true">

android:label="OpenGL Test Harness">













android:label="OpenGL MultiView Test Harness"/>







To summarize, we need the following files to compile and run our program:

TestOpenGLMainDriverActivity.java (Main driver activty; Listing 20–14)

AbstractRenderer.java (Listing 20–9)

SimpleTriangleRenderer.java (Listing 20–10)

MultiViewTestHarnessActivity.java (Listing 20–12)

res/menu/main_menu.xml (Menu file; Listing 20–13)

layout/main.xml (Layout file; Listing 20–15)

Once we compile and run the program, we'll see the driver activity show up. We can click on the menu to see the possible menus, as shown in Figure 20–2.

Figure 20–2. OpenGL test harness driver

Now if you click the "Simple Triangle" menu item, you will see the triangle like the one in Figure 20–3.



Figure 20–3. A simple OpenGL triangle


Download 320.47 Kb.

Share with your friends:
1   2   3   4   5   6   7   8   9   10   11




The database is protected by copyright ©ininet.org 2024
send message

    Main page