@@ -467,11 +467,34 @@ public void onCreate(Bundle savedInstanceState) {
467
467
int sw = sketchWidth ();
468
468
int sh = sketchHeight ();
469
469
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 )) {
471
484
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 ));
474
485
}
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
+
475
498
// g = ((SketchSurfaceView) surfaceView).getGraphics();
476
499
477
500
// surfaceView.setLayoutParams(new LayoutParams(sketchWidth(), sketchHeight()));
@@ -784,7 +807,9 @@ public class SketchSurfaceViewGL extends GLSurfaceView /*implements SketchSurfac
784
807
SurfaceHolder surfaceHolder ;
785
808
786
809
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 ){
788
813
super (context );
789
814
790
815
// Check if the system supports OpenGL ES 2.0.
@@ -805,11 +830,31 @@ public SketchSurfaceViewGL(Context context, int wide, int high, boolean is3D) {
805
830
// null. This is required because PApplet.onResume events (which call
806
831
// this.onResume() and thus require a valid renderer) are triggered
807
832
// before surfaceChanged() is ever called.
808
- if ( is3D ) {
809
- g3 = new PGraphics3D ();
810
- } else {
833
+
834
+ //P2D
835
+ if ( renderer_class . equals ( PGraphics2D . class )) {
811
836
g3 = new PGraphics2D ();
812
837
}
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
813
858
g3 .setParent (PApplet .this );
814
859
g3 .setPrimary (true );
815
860
// Set semi-arbitrary size; will be set properly when surfaceChanged() called
0 commit comments