I'm running into a chicken-and-egg problem when trying to
dynamically create Java3D images from within a servlet.
I assume that I need to set java.awt.headless=true, but if
I do so, then there seems to be no way to create a GraphicsConfiguration
object that Canvas3D will accept.
My question:
(a) How do I create a valid GraphicsConfiguration in headless mode?
(b) If I can not do (a), is there a way to generate java3d-rendered
images in servlets?
Here is test code that illustrates my problem:
[EMAIL PROTECTED] test]$ cat TestOffScreen.java
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.media.j3d.*;
import java.io.*;
import java.awt.*;
public class TestOffScreen {
public static GraphicsConfiguration withHead() throws Exception
{
System.out.println("GraphicsConfiguration based on screen device");
// fails if java.awt.headless=true
return (
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(new
GraphicsConfigTemplate3D()) );
}
public static GraphicsConfiguration withImage() throws Exception
{
System.out.println("GraphicsConfiguration based on image");
// throws ClassCastException at
javax.media.j3d.J3dGraphicsConfig.isValidPixelFormat(J3dGraphicsConfig.java:28)
when Canvas3D is instantiated
BufferedImage template = ImageIO.read( new File("/tmp/test.jpg") );
Graphics2D g = template.createGraphics();
GraphicsConfiguration config = g.getDeviceConfiguration();
return config;
}
public static void main(String[] args) throws Exception {
GraphicsConfiguration config = null;
if ( args.length == 0 )
config = withHead();
else
config = withImage();
if ( config != null )
System.out.println("Got valid graphics configuration");
Canvas3D myCanvas = new Canvas3D( config, true );
}
}
Can't use ScreenDevice in headless mode:
[EMAIL PROTECTED] test]$ java -Djava.awt.headless=true TestOffScreen
GraphicsConfiguration based on screen device
Exception in thread "main" java.awt.HeadlessException
at
sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(HeadlessGraphicsEnvironment.java:66)
at TestOffScreen.withHead(TestOffScreen.java:14)
at TestOffScreen.main(TestOffScreen.java:31)
So, how do I create a valid GraphicsConfiguration object in headless mode?
[EMAIL PROTECTED] test]$ java -Djava.awt.headless=true TestOffScreen 2
GraphicsConfiguration based on image
Got valid graphics configuration
Exception in thread "main" java.lang.ClassCastException
at
javax.media.j3d.J3dGraphicsConfig.isValidPixelFormat(J3dGraphicsConfig.java:28)
at
javax.media.j3d.Canvas3D.compatibleGraphicsConfiguration(Canvas3D.java:837)
at javax.media.j3d.Canvas3D.<init>(Canvas3D.java:891)
at TestOffScreen.main(TestOffScreen.java:38)
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".