package ddddbb.gui; import java.awt.Color; import java.awt.Composite; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import javax.swing.JPanel; import ddddbb.game.Settings; import ddddbb.gen.DoubleModel; import ddddbb.gen.IntModel; import ddddbb.gen.MyChangeListener; import ddddbb.math.Camera3d; import ddddbb.math.D2Graphics; import ddddbb.math.D3Graphics; import ddddbb.math.Point3d; public class TestScreenCanvas extends JPanel implements MyChangeListener { private static final long serialVersionUID = -6777833202679708271L; int width; int height; private Graphics2D g = null; private BufferedImage buffImg; private D2Graphics g2; private D3Graphics g3; private Composite ocomposite; private final DoubleModel xdpcm; private final DoubleModel ydpcm; private final IntModel<Settings.ViewType> viewType; private final DoubleModel brightness; private final DoubleModel eyesDistHalf; private final DoubleModel screenEyeDist; private final DoubleModel barEyeFocusDelta; public TestScreenCanvas( final DoubleModel _xdpcm, final DoubleModel _ydpcm, final DoubleModel _brightness, final IntModel<Settings.ViewType> _viewType, final DoubleModel _eyesDistHalf, final DoubleModel _screenEyeDist, final DoubleModel _barEyeFocusDelta ) { xdpcm = _xdpcm; ydpcm = _ydpcm; viewType = _viewType; brightness = _brightness; eyesDistHalf = _eyesDistHalf; screenEyeDist = _screenEyeDist; barEyeFocusDelta = _barEyeFocusDelta; setPreferredSize(); eyesDistHalf.addChangeListener(this); screenEyeDist.addChangeListener(this); xdpcm.addChangeListener(this); ydpcm.addChangeListener(this); brightness.addChangeListener(this); barEyeFocusDelta.addChangeListener(this); viewType.addChangeListener(this); } public void setPreferredSize() { setPreferredSize(new Dimension( 10+(int)(xdpcm.getDouble(Settings.ResolutionUnit.DotsPerInch)), 10+(int)(ydpcm.getDouble(Settings.ResolutionUnit.DotsPerInch)) )); } private void initializeGraphics() { Dimension size = getSize(); width = size.width; height = size.height; buffImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); } private void initGCs() { g = buffImg.createGraphics(); g.setBackground(Color.BLACK); g.setTransform(new AffineTransform()); g.translate(width/2,height/2); ocomposite = g.getComposite(); g2 = new D2Graphics(g,xdpcm.getDouble(),ydpcm.getDouble()); g3 = viewType.sel().getD3Graphics(g2, new Camera3d(screenEyeDist,eyesDistHalf,barEyeFocusDelta)); } private void drawTestCube(double x0,double y0) { double f = 1; g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,f),new Point3d(x0+0.5*f,y0-0.5*f,f)); g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,f),new Point3d(x0-0.5*f,y0+0.5*f,f)); g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,f),new Point3d(x0-0.5*f,y0+0.5*f,f)); g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,f),new Point3d(x0+0.5*f,y0-0.5*f,f)); g3.drawString("Back",new Point3d(x0+0.5*f,y0+0.5*f,f)); g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,0),new Point3d(x0+0.5*f,y0-0.5*f,0)); g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,0),new Point3d(x0-0.5*f,y0+0.5*f,0)); g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,0),new Point3d(x0-0.5*f,y0+0.5*f,0)); g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,0),new Point3d(x0+0.5*f,y0-0.5*f,0)); g3.drawString("Middle",new Point3d(x0+0.5*f,y0,0)); g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,-f),new Point3d(x0+0.5*f,y0-0.5*f,-f)); g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,-f),new Point3d(x0-0.5*f,y0+0.5*f,-f)); g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,-f),new Point3d(x0-0.5*f,y0+0.5*f,-f)); g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,-f),new Point3d(x0+0.5*f,y0-0.5*f,-f)); g3.drawString("Front",new Point3d(x0+0.5*f,y0-0.5*f,-f)); // g3.drawLine(new Point3d(x0-1,y0,0), new Point3d(x0-1,y0,1)); // g3.drawLine(new Point3d(x0-1,y0,-1),new Point3d(x0-1,y0,0)); // g3.drawBlob(new double[] {x0-1,y0,-1}); // g3.drawBlob(new double[] {x0-1,y0, 0}); // g3.drawBlob(new double[] {x0-1,y0,+1}); // g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,0),new Point3d(x0+0.5*f,y0-0.5*f,0)); // g3.drawLine(new Point3d(x0-0.5*f,y0-0.5*f,0),new Point3d(x0-0.5*f,y0+0.5*f,0)); // g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,0),new Point3d(x0-0.5*f,y0+0.5*f,0)); // g3.drawLine(new Point3d(x0+0.5*f,y0+0.5*f,0),new Point3d(x0+0.5*f,y0-0.5*f,0)); g3.drawTrihedral(new Point3d(x0-1,y0-1,0),2.54); } private void test3D(double y0) { g3.setBrightness(brightness.getDouble()); drawTestCube(0, y0); } private void test2D(double y0) { g2.setColor(Color.WHITE); g2.drawRect(-2.54/2,y0-2.54/2,2.54,2.54); g2.drawString("1\"",-0.1,y0-2.54/2+0.1); g2.drawRect(-1.0/2,y0-1.0/2,1.0,1.0); g2.drawString("1cm",-1.0/4-0.1,y0-1.0/2+0.1); } public void paint(Graphics g0) { if (buffImg==null) initializeGraphics(); initGCs(); g.clearRect(-width/2,-height/2,width,height); test3D(-3); g.setComposite(ocomposite); test2D(3); ((Graphics2D)g0).drawImage(buffImg, null, 0, 0); } public void stateChanged() { repaint(); } }