package jp.testj3d; import com.sun.j3d.utils.geometry.Sphere; import com.sun.j3d.utils.image.TextureLoader; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.media.j3d.Appearance; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.GraphicsConfigTemplate3D; import javax.media.j3d.ImageComponent; import javax.media.j3d.ImageComponent2D; import javax.media.j3d.Locale; import javax.media.j3d.Material; import javax.media.j3d.PhysicalBody; import javax.media.j3d.PhysicalEnvironment; import javax.media.j3d.Shape3D; import javax.media.j3d.Texture; import javax.media.j3d.TextureAttributes; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.media.j3d.View; import javax.media.j3d.ViewPlatform; import javax.media.j3d.VirtualUniverse; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3d; import javax.vecmath.Vector3f; /** * * @author frup47043 */ public class J3dOffscreenTestCase extends javax.swing.JFrame { private VirtualUniverse universe; private BranchGroup rootBranchGroup; private TransformGroup objTg; private View v3d; private TransformGroup tg3d; private Canvas3D c3don; /** * Creates a 3DScene with a textured sphere and a menu to save image */ public J3dOffscreenTestCase() { initComponents(); init3d(); } public void init3d() { try { GraphicsConfiguration gc = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(). getDefaultScreenDevice().getBestConfiguration(new GraphicsConfigTemplate3D()); //JCanvas3D jc3don = new JCanvas3D(); c3don = new Canvas3D(gc) { @Override public void paint(Graphics g) { super.paint(g); Toolkit.getDefaultToolkit().sync(); } // paint() }; // Canvas3D; getContentPane().add(c3don, BorderLayout.CENTER); //View v3d = new View(); ViewPlatform lVp3d = new ViewPlatform(); v3d.setPhysicalBody(new PhysicalBody()); v3d.setPhysicalEnvironment(new PhysicalEnvironment()); v3d.attachViewPlatform(lVp3d); v3d.setDepthBufferFreezeTransparent(false); //Attach main view v3d.addCanvas3D(c3don); rootBranchGroup = new BranchGroup(); TransformGroup rootTransformGroup = new TransformGroup(); BranchGroup viewBranchGroup = new BranchGroup(); TransformGroup viewTransformGroup = new TransformGroup(); tg3d = new TransformGroup(); tg3d.addChild(lVp3d); viewTransformGroup.addChild(tg3d); universe = new VirtualUniverse(); Transform3D lViewTransform = new Transform3D(); v3d.setFieldOfView(0.7854); // 45deg v3d.setFrontClipDistance(0.2f); v3d.setBackClipDistance(100); lViewTransform.lookAt(new Point3d(0, 0, -50), new Point3d(0, 0, 0), new Vector3d(0, 1, 0)); lViewTransform.invert(); tg3d.setTransform(lViewTransform); BoundingSphere lBounds = new BoundingSphere(new Point3d(0, 0, 0), Double.POSITIVE_INFINITY); Color3f lDirectionLightColour = new Color3f(1.0f, 1.0f, 1.0f); Vector3f lDirectionLightDir = new Vector3f(-1.0f, -1.0f, .5f); DirectionalLight directionLight = new DirectionalLight(lDirectionLightColour, lDirectionLightDir); directionLight.setInfluencingBounds(lBounds); rootTransformGroup.addChild(directionLight); Sphere lSphere = new Sphere(10, Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS, 100); Shape3D lShape = new Shape3D(lSphere.getShape().getGeometry()); setTexture(lShape, "D:/lbeigbed/3dview/resources/textures/mars/Mars_small.jpg"); objTg = new TransformGroup(); objTg.addChild(lShape); objTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); rootTransformGroup.addChild(objTg); rootBranchGroup.addChild(rootTransformGroup); viewBranchGroup.addChild(viewTransformGroup); viewBranchGroup.compile(); rootBranchGroup.compile(); Locale lLocale = new javax.media.j3d.Locale(universe); lLocale.addBranchGraph(rootBranchGroup); lLocale.addBranchGraph(viewBranchGroup); // repaint(); revalidate(); } catch (Exception ex) { System.out.println("Error init 3D: " + ex.getMessage()); ex.printStackTrace(System.err); } } /** * Makes a bufferedImage from an image * @param image Image to convert. * @return BufferedImage created. */ public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) return ((BufferedImage) image); image = new ImageIcon(image).getImage(); BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics g = bufferedImage.createGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return (bufferedImage); } /** * Apply texture on planet from image URL in texUrl * * @param texUrl Texture URL. */ public boolean setTexture(Shape3D pShape, String filename) { Image texImg = null; BufferedImage texture = null; Color3f color = null; if (filename != null) { try { texImg = Toolkit.getDefaultToolkit().getImage(filename); texture = toBufferedImage(texImg); color = new Color3f(1, 1, 1); } catch (Exception e) { e.printStackTrace(); texture = null; } } Appearance app = new Appearance(); // Create default colours for the material Color3f ambientColor = new Color3f(color); Color3f diffuseColor = new Color3f(color); Color3f specularColor = new Color3f(color); Color3f emissiveColor = new Color3f(color); // Define the shininess float shininess = 10.0f; // Create a new appearance //ambientColor.scale(0.4f); ambientColor.scale(1.0f); diffuseColor.scale(1.0f); specularColor.scale(0.1f); emissiveColor.scale(0.0f); // Set the material of the appearance app.setMaterial(new Material(ambientColor, emissiveColor, diffuseColor, specularColor, shininess)); if (texture != null) { // load a texture image using the Java 3D texture loader Texture tex = new TextureLoader(texture).getTexture(); TextureAttributes texAtt = new TextureAttributes(); texAtt.setTextureMode(TextureAttributes.MODULATE); // apply the texture to the Appearance app.setTexture(tex); app.setTextureAttributes(texAtt); pShape.setAppearance(app); return true; } else { pShape.setAppearance(app); return false; } } private void initComponents() { jMenuBar1 = new javax.swing.JMenuBar(); jStart = new javax.swing.JMenu(); jmiAdd3dPanel = new javax.swing.JMenuItem(); jmiSaveImage = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jStart.setText("File"); jmiSaveImage.setText("Save image"); jmiSaveImage.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jmiSaveImageActionPerformed(evt); } }); jStart.add(jmiSaveImage); jMenuBar1.add(jStart); setJMenuBar(jMenuBar1); pack(); }// private void jmiSaveImageActionPerformed(java.awt.event.ActionEvent evt) { File lFile; JFileChooser lJfchooser; lJfchooser = new JFileChooser(); lJfchooser.setAcceptAllFileFilterUsed(false); // lJfchooser.setFileFilter(new SimpleFileFilter(new String[]{".png", ".PNG"}, "Png files")); lJfchooser.setFileSelectionMode(JFileChooser.FILES_ONLY); lJfchooser.setDialogTitle("Choose an image file"); lJfchooser.setDragEnabled(false); lJfchooser.setMultiSelectionEnabled(false); lJfchooser.setApproveButtonText("Save"); int lReturnVal = lJfchooser.showSaveDialog(this); if (lReturnVal != JFileChooser.APPROVE_OPTION) { return; } if (lJfchooser.getSelectedFile().getName().endsWith(".png")) { lFile = lJfchooser.getSelectedFile(); } else { lFile = new File(lJfchooser.getSelectedFile().getAbsolutePath() + ".png"); } BufferedImage lImage = null; GraphicsConfigTemplate3D lTemplate = new GraphicsConfigTemplate3D(); GraphicsConfiguration lGc = GraphicsEnvironment.getLocalGraphicsEnvironment(). getDefaultScreenDevice().getBestConfiguration(lTemplate); Canvas3D lC3doff = new Canvas3D(lGc, true) { @Override public void paint(Graphics g) { super.paint(g); Toolkit.getDefaultToolkit().sync(); } // paint() }; int xSize = (int) (c3don.getWidth()); int ySize = (int) (c3don.getHeight()); v3d.addCanvas3D(lC3doff); System.out.println("View attached"); ImageComponent2D lBuffer = null; lImage = new BufferedImage(xSize, ySize, BufferedImage.TYPE_INT_RGB); lBuffer = new ImageComponent2D(ImageComponent.FORMAT_RGB, lImage); lBuffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ); //lBuffer.setCapability(ImageComponent2D.ALLOW_FORMAT_READ); System.out.println("set off buffer"); lC3doff.setOffScreenBuffer(lBuffer); lC3doff.getScreen3D().setSize(xSize, ySize); Dimension lScreenSize = c3don.getSize(); lC3doff.getScreen3D().setPhysicalScreenWidth( 0.0254 / 90.0 * lScreenSize.width); lC3doff.getScreen3D().setPhysicalScreenHeight( 0.0254 / 90.0 * lScreenSize.height); System.out.println("render"); lC3doff.renderOffScreenBuffer(); System.out.println("wait little"); lC3doff.waitForOffScreenRendering(); System.out.println("GetImage."); lImage = lC3doff.getOffScreenBuffer().getImage(); // try { // lC3doff.setOffScreenBuffer(null); // } catch (Exception e) { // System.out.println("offscreen buffer free not implemented:" + e.getMessage()); // } if (lImage != null) { try { ImageIO.write(lImage, "png", lFile); } catch (IOException ioe) { JOptionPane.showMessageDialog(this, "Error generating offscreen image: " + ioe.getMessage(), "Image generation error", JOptionPane.ERROR_MESSAGE); return; } } else { JOptionPane.showMessageDialog(this, "Error generating offscreen image", "Image generation error", JOptionPane.ERROR_MESSAGE); return; } } /** * @param args the command line arguments */ public static void main(String args[]) { //final int lTimeBeforeRefresh = 200; //System.setProperty("sun.java2d.noddraw", "true"); java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { //java.awt.EventQueue.invokeLater(new Runnable() { // public void run() { J3dOffscreenTestCase lFrame = new J3dOffscreenTestCase(); //lFrame.getContentPane().setLayout(new BorderLayout()); lFrame.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(WindowEvent event) { J3dOffscreenTestCase lFrame = (J3dOffscreenTestCase) event.getSource(); lFrame.setVisible(false); lFrame.dispose(); System.exit(0); } }); java.awt.Dimension lScrSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); lFrame.setSize(800, 600); lFrame.setLocation((lScrSize.width - 800) / 2, (lScrSize.height - 600) / 2); lFrame.setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenu jStart; private javax.swing.JMenuItem jmiAdd3dPanel; private javax.swing.JMenuItem jmiSaveImage; // End of variables declaration }