@@ -467,11 +467,34 @@ public void onCreate(Bundle savedInstanceState) {
467467 int sw = sketchWidth ();
468468 int sh = sketchHeight ();
469469
470- if (sketchRenderer ().equals (JAVA2D )) {
470+ //get renderer name anc class
471+ String renderer_name = sketchRenderer ();
472+ Class <?> renderer_class = null ;
473+ try {
474+ renderer_class = Class .forName (renderer_name );
475+ } catch (ClassNotFoundException exception ) {
476+ //what to throw here?
477+ String message = String .format (
478+ "Error: Could not resolve renderer class name: %s" , renderer_name );
479+ throw new RuntimeException (message , exception );
480+ }
481+
482+ //java2d renderer
483+ if (renderer_name .equals (JAVA2D )) {
471484 surfaceView = new SketchSurfaceView (this , sw , sh );
472- } else if (sketchRenderer ().equals (P2D ) || sketchRenderer ().equals (P3D )) {
473- surfaceView = new SketchSurfaceViewGL (this , sw , sh , sketchRenderer ().equals (P3D ));
474485 }
486+ //P2D, P3D, and any other PGraphicsOpenGL-based renderer
487+ else if (PGraphicsOpenGL .class .isAssignableFrom (renderer_class )){
488+ surfaceView = new SketchSurfaceViewGL (this , sw , sh ,
489+ (Class <? extends PGraphicsOpenGL >) renderer_class );
490+ }
491+ //anything else
492+ else {
493+ String message = String .format (
494+ "Error: Unsupported renderer class: %s" , renderer_name )
495+ throw new RuntimeException (message );
496+ }
497+
475498// g = ((SketchSurfaceView) surfaceView).getGraphics();
476499
477500// surfaceView.setLayoutParams(new LayoutParams(sketchWidth(), sketchHeight()));
@@ -784,7 +807,9 @@ public class SketchSurfaceViewGL extends GLSurfaceView /*implements SketchSurfac
784807 SurfaceHolder surfaceHolder ;
785808
786809
787- public SketchSurfaceViewGL (Context context , int wide , int high , boolean is3D ) {
810+ public SketchSurfaceViewGL (
811+ Context context , int wide , int high ,
812+ Class <? extends PGraphicsOpenGL > renderer_class ){
788813 super (context );
789814
790815 // Check if the system supports OpenGL ES 2.0.
@@ -805,11 +830,31 @@ public SketchSurfaceViewGL(Context context, int wide, int high, boolean is3D) {
805830 // null. This is required because PApplet.onResume events (which call
806831 // this.onResume() and thus require a valid renderer) are triggered
807832 // before surfaceChanged() is ever called.
808- if ( is3D ) {
809- g3 = new PGraphics3D ();
810- } else {
833+
834+ //P2D
835+ if ( renderer_class . equals ( PGraphics2D . class )) {
811836 g3 = new PGraphics2D ();
812837 }
838+ //P3D
839+ else if (renderer_class .equals ( PGraphics3D .class )) {
840+ g3 = new PGraphics3D ();
841+ }
842+ //something that extends P2D, P3D, or PGraphicsOpenGL
843+ else {
844+ try {
845+ //dang java generics
846+ Constructor <? extends PGraphicsOpenGL > constructor =
847+ renderer_class .getConstructor ();
848+ g3 = constructor .newInstance ();
849+ } catch (Exception exception ) {
850+ throw new RuntimeException (
851+ "Error: Failed to initialize custom OpenGL renderer" ,
852+ exception );
853+ }
854+ }
855+
856+
857+ //set it up
813858 g3 .setParent (PApplet .this );
814859 g3 .setPrimary (true );
815860 // Set semi-arbitrary size; will be set properly when surfaceChanged() called
0 commit comments