import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;

import javax.media.j3d.*;

/**
 *
 * @author  zero
 */
public class ImageRenderCanvas3D extends Canvas3D  {
    
    private BufferedImage buffer;
    private boolean printing  = false;
    private boolean started    = false;
    
    /** Creates a new instance of OffCanvas3D */
    public ImageRenderCanvas3D(java.awt.GraphicsConfiguration graphicsConfiguration, BufferedImage buffer) {
        super(graphicsConfiguration, true);
        this.buffer = buffer;
        
        int width  = buffer.getWidth();
        int height = buffer.getWidth();
        
        BufferedImage bImage = new BufferedImage(
        width, height , BufferedImage.TYPE_INT_ARGB);
        
        ImageComponent2D imgBuffer = new ImageComponent2D(
        ImageComponent.FORMAT_RGBA, bImage);
        imgBuffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
        //buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_WRITE);
        
        this.setOffScreenBuffer(imgBuffer);
    }
    
    
    public void start() {
        if(!started) {
            new Ready().start();
            started = true;
        }
    }
    
    public void postSwap() {
        super.postSwap();
        drawOffScreenBuffer();
    }
    
    private void drawOffScreenBuffer() {        
        BufferedImage bImage = this.getOffScreenBuffer().getImage();
        buffer.getGraphics().drawImage(bImage, 0, 0, this);
    }
    
    
    private class Ready extends Thread {
        
        public void run() {
            while(true) {                
                if(printing) {
                    waitForOffScreenRendering();                    
                    printing = false;
                }
                else {
                    renderOffScreenBuffer();
                    printing = true;
                }
            }
        }
        
    }
    
    
    
    
}
