Transparent background of android scene

Hello,

what is the preferred way of changing the background color of the jme scene to transparent? I put the code

[java]

ctx = (OGLESContext) app.getContext();

view = ctx.createView(this);

view.setBackgroundColor(Color.TRANSPARENT);

view.getHolder().setFormat(PixelFormat.TRANSPARENT);

[/java]

right before the view is added to the layout.

But this always causes an exception:

05-09 14:18:38.688: ERROR/AndroidRuntime(10724): FATAL EXCEPTION: GLThread 9

05-09 14:18:38.688: ERROR/AndroidRuntime(10724): java.lang.RuntimeException: createWindowSurface failed: EGL_BAD_MATCH

05-09 14:18:38.688: ERROR/AndroidRuntime(10724): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1077)

05-09 14:18:38.688: ERROR/AndroidRuntime(10724): at android.opengl.GLSurfaceView$EglHelper.createSurface(GLSurfaceView.java:981)

05-09 14:18:38.688: ERROR/AndroidRuntime(10724): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1304)

05-09 14:18:38.688: ERROR/AndroidRuntime(10724): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)

I guess this can be avoided when using other parameters on view.setEGLConfigChooser. (theres set 0 to opacity and i guess therefore it does not work)

The problem is that I do not really understand where the OGLESContext comes from (I guess the origin is JmeSystem.newContext, but I am not shure) and to make any changes I probably have to recompile the Android lib of JMonkey.

Is there any simple solution to set a transparent background?

thx in advance



edit:



To be more accurate, I want to use the same settings that are shown in this example: → mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0)

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.html



when I override the method getContext() from SimpleApplication and return my own Subclass of OGLESContext, which uses the settings I need, the scene is empty and I only see the camera image I positioned behind the GLSurfaceView (so maybe the background of the GLSurfaceView IS transparent now, but I do not see any models ^^).

The EGL config is set in OGLESContext:



[java]

public GLSurfaceView createView(AndroidInput view)

{

this.view = view;

/*

  • Requesting client version from GLSurfaceView which is extended by
  • AndroidInput.
  • This is required to get OpenGL ES 2.0

    */

    view.setEGLContextClientVersion(2);



    //RGB565, Depth16

    view.setEGLConfigChooser(5, 6, 5, 0, 16, 0);

    view.setFocusableInTouchMode(true);

    view.setFocusable(true);

    view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU);

    view.setRenderer(this);

    return view;

    }[/java]



    createView gets called from the MainActivity



    [java] logger.info("creating view …");

    view = ctx.createView(input);

    logger.info("creating view … done.");[/java]



    So you could do everything that is done in createView yourself in MainActivity,

    like setting the view of OGLESContext and setting OGLESContext as the renderer of the view.

This is what i hoped for as well, but some more changes need to be made to make this work.

I just made it work this way:

I created my own Subclass of OGLESContext and changed the createView method accordingly.

Then I removed the call to super.start(contextType) in my SimpleApplication but copied the code from the Application.start(contextType) and changed the code where the context was assigned from JmeSystem.newContext(settings, contextType).

I guess this needs to be done as the context variable is accessed in multiple ways and just assigning a “custom” GLSurfaceContext as the main view of the Android application is not enough, as JME will still render to the GLSurfaceView that was return by context.createView.

At least I think so :), now it works anyway.

Thanks for your help.

@mrfluff said:
This is what i hoped for as well, but some more changes need to be made to make this work.
I just made it work this way:
I created my own Subclass of OGLESContext and changed the createView method accordingly.
Then I removed the call to super.start(contextType) in my SimpleApplication but copied the code from the Application.start(contextType) and changed the code where the context was assigned from JmeSystem.newContext(settings, contextType).
I guess this needs to be done as the context variable is accessed in multiple ways and just assigning a "custom" GLSurfaceContext as the main view of the Android application is not enough, as JME will still render to the GLSurfaceView that was return by context.createView.
At least I think so :), now it works anyway.
Thanks for your help.

Any chance you might post the code on how you did that?

It’s been some time since I worked on the project but ill take a look at the source code this week.

Here we go.



I made a subclass of com.jme3.app.Application.



In the start() method, i wrote the following code:

[java]

context = new MyOGLESContext();

context.setSystemListener(this);

context.create(false);

[/java]



Thus, I replace the context of the JME3 application with my own context.



My own implementation of the context looks like this:



[java]

public class MyOGLESContext extends OGLESContext {



public MyOGLESContext(){

super();

}



public GLSurfaceView createView(Activity activity){

view = new MyAndroidInput(activity);



view.setEGLContextClientVersion(2);



view.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

view.setFocusableInTouchMode(true);

view.setFocusable(true);

view.setRenderer(this);

view.getHolder().setFormat(PixelFormat.TRANSLUCENT);

return view;



}



}

[/java]



Here is the class of MyAndroidInput:



[java]

public class MyAndroidInput extends AndroidInput {



public MyAndroidInput(Context ctx, AttributeSet attribs){

super(ctx, attribs);

}



public MyAndroidInput(Context ctx){

super(ctx);

}



@Override

public boolean onTouchEvent(MotionEvent e) {

((FooActivity)getContext()).reactTotouchEvent((int)e.getX(), (int)e.getY());

return super.onTouchEvent(e);

}

}

[/java]



Please note that, in the end, I dropped JME3 for developing my mobile application as there were graphical artifacts when displaying animated 3D models. I cannot remember if these artifacts were introduced by using this context, though.



I wrote about this in my master thesis but I could not gather more information about Android JME3 application development.

There, the main focus was on using Augmented Reality running on Android devices.

Finally I used JPCT to write the application.

If you are interested in my findings about AR and Android have a look at Homepage of Andreas Korat - Massively Multiplayer Augmented Reality Games



Best regards

1 Like