package ddddbb.game; import java.awt.Color; import java.awt.Container; import java.awt.DisplayMode; import java.awt.Font; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.Toolkit; import ddddbb.comb.DSignedAxis; import ddddbb.gen.BoolModel; import ddddbb.gen.DiIntModel; import ddddbb.gen.DoubleModel; import ddddbb.gen.IntModel; import ddddbb.gen.Unit; import ddddbb.math.AnaglyphGraphics; import ddddbb.math.Camera3d; import ddddbb.math.Camera4d; import ddddbb.math.Camera4dOrthographic; import ddddbb.math.CavalierPerspective; import ddddbb.math.CrossEyedGraphics; import ddddbb.math.D2GraphicsIF; import ddddbb.math.D3Graphics; import ddddbb.math.Flat3dGraphics; import ddddbb.math.Isometric30Perspective; import ddddbb.math.ParallelEyedGraphics; import ddddbb.math.PhotoPerspective; public class Settings { public final static int defaultWidth = 800; public final static int defaultHeight = 600; public final static Font font = new Font(Font.DIALOG,Font.PLAIN,12); public final static DoubleModel brightness = new DoubleModel(0.75,0,1); public static Color fgColor() { float brightness = (float) Settings.brightness.getDouble(); return new Color(brightness,brightness,brightness); } public static enum ResolutionUnit implements Unit { DotsPerCM("dots/cm",1.0), DotsPerInch("dpi",1/2.54); private String name; private double value; ResolutionUnit(String _name, double _value) { name=_name; value=_value; } public String toString() { return name; } public double unitFactor() { return value; } } public final IntModel<ResolutionUnit> resolutionUnit = new IntModel<ResolutionUnit>(ResolutionUnit.DotsPerCM,ResolutionUnit.values()); public final DoubleModel xdpcm = new DoubleModel(35.96,LengthUnit.CM); public final DoubleModel ydpcm = new DoubleModel(35.68,LengthUnit.CM); public final IntModel<LengthUnit> lengthUnit = new IntModel<LengthUnit>(LengthUnit.CM,LengthUnit.values()); public static enum LengthUnit implements Unit { CM("cm",1.0), INCH("inch",2.54); private String name; private double value; LengthUnit(String _name, double _value) { name=_name; value=_value; } public String toString() { return name; } public double unitFactor() { return value; } } public final DoubleModel eyesDistHalf = new DoubleModel(3,0.2,LengthUnit.CM); public final DoubleModel screenEyeDist = new DoubleModel(30,1,LengthUnit.CM); public final DoubleModel mouseTransSens = new DoubleModel(3,1); // cm/cm public final DoubleModel mouseRotSens = new DoubleModel(Math.PI/6,Math.PI/36); // rad/cm public final DoubleModel barEyeFocusDelta = new DoubleModel(0,1,LengthUnit.CM); public static enum Dim { D3("3d",3), D4("4d",4); String name; int dim; Dim(String name, int dim) { this.name = name; this.dim = dim; } public String toString() { return name; } public int dim() { return dim; } } public final IntModel<Dim> dim34 = new IntModel<Dim>(Dim.D3,Dim.values()); public static enum Axis4d { X(1,"x"), Y(2,"y"), Z(3,"z"), W(4,"w"); String name; int axis; Axis4d(int axis, String name) { this.axis = axis; this.name = name; } public int axis() { return axis; } public String toString() { return name; } } public final static DiIntModel<Axis4d> mouseTransAxes4d = new DiIntModel<Axis4d>(Axis4d.X,Axis4d.Y,Axis4d.values()); public static enum Axis3d { X(1,"x"), Y(2,"y"), Z(3,"z"); String name; int axis; Axis3d(int axis, String name) { this.axis = axis; this.name = name; } public int axis() { return axis; } public String toString() { return name; } } public final static DiIntModel<Axis3d> mouseTransAxes3d = new DiIntModel<Axis3d>(Axis3d.X,Axis3d.Y,Axis3d.values()); public static enum DiAxis4d { XY(1,2,"xy"), XZ(1,3,"xz"), XW(1,4,"xw"), YZ(2,3,"yz"), YW(2,3,"yw"), ZW(3,4,"zw"); String name; int axis1; int axis2; DiAxis4d(int axis1, int axis2, String name) { this.axis1 = axis1; this.axis2 = axis2; this.name=name; } public String toString() { return name; } public int axis1() { return axis1; } public int axis2() { return axis2; } }; public static final DiIntModel<DiAxis4d> mouseRotDiAxes4d = new DiIntModel<DiAxis4d>(DiAxis4d.XZ,DiAxis4d.YW,DiAxis4d.values()); public static enum DiAxis3d { XY(1,2,"xy"), XZ(1,3,"xz"), YZ(2,3,"yz"); String name; int axis1; int axis2; DiAxis3d(int axis1, int axis2, String name) { this.axis1 = axis1; this.axis2 = axis2; this.name=name; } public String toString() { return name; } public int axis1() { return axis1; } public int axis2() { return axis2; } }; public static final DiIntModel<DiAxis3d> mouseRotDiAxes3d = new DiIntModel<DiAxis3d>(DiAxis3d.XZ,DiAxis3d.YZ,DiAxis3d.values()); public static enum Occlusion4dAllowance { NONE("No 4D occlusion") {}, BACKFACE("4D Backface culling"), COMPLETE("4D Occlusion culling"); String name; Occlusion4dAllowance(String _name) { name = _name; } public String toString() { return name; } } public final IntModel<Occlusion4dAllowance> occlusion4dAllowance = new IntModel<Occlusion4dAllowance>(Occlusion4dAllowance.COMPLETE,Occlusion4dAllowance.values()); public static enum Orientation3d { LEFTHANDED("3D Left Handed",+1), RIGHTHANDED("3D Right Handed",-1); String name; int value; Orientation3d(String _name, int _value ) { name = _name; value = _value; } public int value() { return value; } public String toString() { return name; } } public final IntModel<Orientation3d> orientation3d = new IntModel<Orientation3d>(Orientation3d.LEFTHANDED,Orientation3d.values()); public static enum Orientation4d { LEFTHANDED("4D Left Handed",+1), RIGHTHANDED("4D Right Handed",-1); String name; int value; private Orientation4d(String _name, int _value) { name=_name; value =_value; } public int value() { return value; } public String toString() { return name; } } public final IntModel<Orientation4d> orientation4d = new IntModel<Orientation4d>(Orientation4d.RIGHTHANDED,Orientation4d.values()); public static enum ViewType { FLAT("Flat") { public D3Graphics getD3Graphics(D2GraphicsIF g,Camera3d c) { return new Flat3dGraphics(g,c); } }, CROSSED("Crossed Eyes") { public D3Graphics getD3Graphics(D2GraphicsIF g,Camera3d c) { return new CrossEyedGraphics(g,c); } }, PARALLEL("Parallel Eyes") { public D3Graphics getD3Graphics(D2GraphicsIF g,Camera3d c) { return new ParallelEyedGraphics(g,c); } }, ANAGLYPH("Red/Cyan") { public D3Graphics getD3Graphics(D2GraphicsIF g,Camera3d c) { return new AnaglyphGraphics(g,c); } }; private String name; private ViewType(String _name) { name = _name; } public abstract D3Graphics getD3Graphics(D2GraphicsIF g,Camera3d c); public String toString() { return name; } } public final IntModel<ViewType> viewType = new IntModel<ViewType>( ViewType.ANAGLYPH, ViewType.values() ); public static class PerspectiveEnum extends IntModel<Camera4d>{ public final Camera4d LINEAR; public final Camera4d ISOMETRIC30; public final Camera4d CAVALIER; // public final Camera4d ORTHOGRAPHIC; public final Camera4d DIMETRIC; public Camera4d[] values; public PerspectiveEnum() { LINEAR = new PhotoPerspective(); ISOMETRIC30 = new Isometric30Perspective(); CAVALIER = new CavalierPerspective(); // ORTHOGRAPHIC = new OrthographicPerspective(); DIMETRIC = new Camera4dOrthographic.Dimetric(); values = new Camera4d[] { LINEAR, ISOMETRIC30, CAVALIER, // ORTHOGRAPHIC, DIMETRIC }; super.init(CAVALIER, values); } } public static enum GameStatus { NONE, PENDING, REACHED, MISSED; } public final IntModel<GameStatus> gameStatus = new IntModel<Settings.GameStatus>(Settings.GameStatus.PENDING, Settings.GameStatus.values()); public final BoolModel antiAliased = new BoolModel(true,"Antialiased"); //public final BoolModel drawTrihedral = new BoolModel(false,"Trihedral"); public final BoolModel drawTetrahedral = new BoolModel(true,"Tetrahedral"); public final BoolModel showGoal = new BoolModel(false,"Goal"); public final BoolModel showInternalFaces = new BoolModel( false, "Show internal faces"); public final static DoubleModel zoom = new DoubleModel(1,0.2); public final IntModel<DSignedAxis> perspectiveAxis = new IntModel<DSignedAxis>( 0, new String[] { "+" + Main.axisNames[3], "+" + Main.axisNames[2], "+" + Main.axisNames[1], "+" + Main.axisNames[0], "-" + Main.axisNames[0], "-" + Main.axisNames[1], "-" + Main.axisNames[2], "-" + Main.axisNames[3] }, new DSignedAxis[] { new DSignedAxis(4), new DSignedAxis(3), new DSignedAxis(2), new DSignedAxis(1), new DSignedAxis(-1), new DSignedAxis(-2), new DSignedAxis(-3), new DSignedAxis(-4), } ); public final IntModel<Objective> objectives = new IntModel<Objective>(ObjectiveEnum.values()); public final IntModel<Camera4d> perspective = new PerspectiveEnum(); public static final BoolModel soundOn = new BoolModel(true,"Sound on"); public void screenDefaults(Container window) { brightness.setToDefault(); GraphicsConfiguration gconf = window.getGraphicsConfiguration(); assert gconf != null; GraphicsDevice gdev = gconf.getDevice(); DisplayMode dm = gdev.getDisplayMode(); dm.getHeight(); dm.getWidth(); //Toolkit.getDefaultToolkit().getScreenInsets(gc); Toolkit.getDefaultToolkit().getScreenSize();//pixels int dotsPerInch = Toolkit.getDefaultToolkit().getScreenResolution();//dots per inch if (dotsPerInch == 0) { dotsPerInch = 96; } /* 4:3 y=3/5*d x=4/3*y=4/5*d 1600x1200 d=19" : ydpi=5/3*1200/19=xdpi=5/4*1600=105.26 1024x768 d=19" : ydpi=5/3*768/19=xdpi=5/4*1024/19=67.4 800x600 d=19" : ydpi=5/3*600/19=xdpi=5/4*800/19=52.63 800x600 d=14" : ydpi=5/3*600/14=xdpi=5/4*800/14=71.43 Most computer LCD screens are build such that xdpi=ydpi though x:y dont have to be always 4:3, for example my monitor: 1280:1024=5:4 but also x:y=14":11.2"=5:4 dpi=1280/14=91.43 The above getScreenResolution() is very unprecise (enforced by returning int!) */ xdpcm.setDouble(dotsPerInch,Settings.ResolutionUnit.DotsPerInch); ydpcm.setDouble(dotsPerInch,Settings.ResolutionUnit.DotsPerInch); eyesDistHalf.setDouble(3); screenEyeDist.setDouble(30); barEyeFocusDelta.setDouble(0); mouseRotSens.setDouble(Math.PI/6); mouseTransSens.setDouble(3); //System.out.println(xcm.getDouble(ResolutionUnit.DotsPerCM)); } }