0

I have some trouble tring to print graphics from Java3d some computer (Intel based Graphic cards) crash completly when printing. I got this exception.

    javax.media.j3d.IllegalRenderingStateException: GL_VERSION
    at javax.media.j3d.NativePipeline.createNewContext(Native Method)
    at javax.media.j3d.NativePipeline.createNewContext(NativePipeline.java:2736)
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:4895)
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:2421)
    at javax.media.j3d.Renderer.doWork(Renderer.java:895)
    at javax.media.j3d.J3dThread.run(J3dThread.java:256)

    DefaultRenderingErrorListener.errorOccurred: 
    CONTEXT_CREATION_ERROR: Renderer: Error creating Canvas3D graphics context
    graphicsDevice = Win32GraphicsDevice[screen=0]
    canvas =   visualization.show3D.show.print.OffScreenCanvas3D[canvas0,0,0,3000x2167,invalid]
    Java 3D ERROR : OpenGL 1.2 or better is required (GL_VERSION=1.1)
    Java Result: 1

I know it said i have to upgrade to OpenGL 1.2 but after checking i already have 1.5 installed (error message is not accurate)

String glVersion = (String)getCanvas3D().queryProperties().get("native.version");

I tried to catch IllegalRenderingStateException but it doesn't work, JVM just crash in any case. Doesnt anyone know how to have a printing function to work on Intel based Graphic cards ?

kwenji
  • 68
  • 1
  • 7

1 Answers1

0

I found out the cause of my problem. Some computer haven't OffScreenRendering support needed by PrintCanvas3D.java.

So i used robot to create a screen capture

 public BufferedImage canvasCapture(Dimension size, Point locationOnScreen) {
    Rectangle bounds = new Rectangle(locationOnScreen.x, locationOnScreen.y, size.width, size.height);
    try{
    Robot robot = new Robot(this.getGraphicsConfiguration().getDevice());
    return robot.createScreenCapture(bounds);
    }catch (Exception e){
    e.printStackTrace();
    return null;
    }
 }

Last tricky part was to detect when to switch from proper printing method to ScreenCapture method (since catching the raised exception doesn't work), after some search i found out that queryProperties() could give me this information

here is the code in my Frame3D to choose proper method

Boolean OffScreenRenderingSupport = (Boolean)getCanvas3D().queryProperties().get("textureLodOffsetAvailable");
if (OffScreenRenderingSupport){
    bImage = getOffScreenCanvas3D().doRender(dim.width, dim.height); 
}else{
    bImage = getOffScreenCanvas3D().canvasCapture(getCanvas3D().getSize(), getCanvas3D().getLocationOnScreen());
}

If anyone can find a better way to handle this, please let me know ;)

kwenji
  • 68
  • 1
  • 7