/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package automenta.spacenet.run.old.app; import automenta.spacenet.run.ArdorSpacetime; import automenta.spacenet.run.DemoDefaults; import automenta.spacenet.space.Repeat; import automenta.spacenet.space.control.Pressable; import automenta.spacenet.space.geom.Box; import automenta.spacenet.space.geom.ProcessBox; import automenta.spacenet.space.geom.Rect; import automenta.spacenet.space.geom.Rect.RectShape; import automenta.spacenet.space.widget.spinner.Spinner; import automenta.spacenet.var.physical.Color; import automenta.spacenet.var.scalar.DoubleRange; import automenta.spacenet.var.scalar.DoubleVar; import com.ardor3d.framework.Canvas; import com.ardor3d.input.Key; import com.ardor3d.input.logical.InputTrigger; import com.ardor3d.input.logical.KeyPressedCondition; import com.ardor3d.input.logical.TriggerAction; import com.ardor3d.input.logical.TwoInputStates; import com.ardor3d.intersection.PickData; import com.ardor3d.math.Vector3; import com.ardor3d.scenegraph.Spatial; /** * * @author seh */ public class SpaceStrobe extends ProcessBox { public static class BrainwaveState { //TODO set at modern schumann resonance frequency private DoubleVar primaryFrequency = new DoubleVar(7.4); private DoubleVar sharpness = new DoubleVar(1.0); //1.0 = flat line, > 1.0 = sharper distortion private Color primaryColor = new Color(Color.White); public DoubleVar getPrimaryFrequency() { return primaryFrequency; } public DoubleVar getSharpness() { return sharpness; } public Color getPrimaryColor() { return primaryColor; } } public static class BrainwaveSpaceMenu extends Box { public BrainwaveSpaceMenu(final BrainwaveSpace space) { super(BoxShape.Empty); Spinner freqSpin = add(new Spinner(DemoDefaults.font, new DoubleRange(space.state.getPrimaryFrequency(), new DoubleVar(0), new DoubleVar(30.0)), new DoubleVar(0.1))); freqSpin.span(-0.5, 0.25, -0.05, -0.25); ColorChooser primColorChooser = add(new ColorChooser() { @Override public void onColorSelected(Color c) { space.state.getPrimaryColor().set(c); } }); primColorChooser.span(0.5, 0.25, 0.05, -0.25); } } public static class BrainwaveSpace extends Box { public final BrainwaveState state; private BrainwaveSpaceMenu menu; private boolean showingMenu; public class StrobeRect extends Rect implements Pressable { public StrobeRect() { super(RectShape.Rect); } @Override public void onPressStart(PickData pick) { } @Override public void onPressStop(PickData pick) { toggleMenu(); } @Override public boolean isTangible() { return true; } } public BrainwaveSpace(BrainwaveState bstate) { super(BoxShape.Empty); this.state = bstate; final Rect rect = add(new StrobeRect()); rect.scale(4); add(new Repeat() { @Override protected void update(double t, double dt, Spatial s) { double f = Math.PI * state.getPrimaryFrequency().d(); double w = (Math.sin(t * f) * state.getSharpness().d()); if (w > 1.0) { w = 1.0; } if (w < -1.0) { w = -1.0; } w += 1.0; w /= 2.0; double r = (float) w * state.getPrimaryColor().getRed(); double g = (float) w * state.getPrimaryColor().getGreen(); double b = (float) w * state.getPrimaryColor().getBlue(); double a = 1.0f; rect.color(new Color(r, g, b, a)); } }); toggleMenu(); } protected void resetCamera() { try { getSpacetime().getCamera().getTargetPosition().set(new Vector3(0,0,3)); getSpacetime().getCamera().getTargetTarget().set(new Vector3(0,0,0)); } catch (NullPointerException npe) { } } protected void toggleMenu() { resetCamera(); if (showingMenu) { remove(menu); showingMenu = false; } else { menu = add(new BrainwaveSpaceMenu(this)); menu.moveDZ(1.5); showingMenu = true; } } } public static abstract class ColorChooser extends Rect { public class ColorButton extends Rect implements Pressable { private final Color color; public ColorButton(Color color) { super(RectShape.Rect); this.color = color; color(color); } @Override public void onPressStart(PickData pick) { } @Override public void onPressStop(PickData pick) { onColorSelected(this.color); } @Override public boolean isTangible() { return true; } } public ColorChooser() { super(RectShape.Empty); int hueDivisions = 16; int satDivisions = 16; double hueWidth = 1.0 / ((double)hueDivisions); double satWidth = 1.0 / ((double)satDivisions); double x; double y = -0.5; double hue = 0.0; double sat = 0.0; for (int i = 0; i < hueDivisions; i++) { x = -0.5; for (int j = 0; j < satDivisions; j++) { ColorButton b = add(new ColorButton(Color.hsb(hue, sat, 1.0))); b.span(x, y, x+hueWidth, y+satWidth); b.moveDZ(0.1); hue += hueWidth; x += hueWidth; } sat += satWidth; y += satWidth; } } abstract public void onColorSelected(Color c); } @Override protected void start() { final BrainwaveState bstate = new BrainwaveState(); add(new BrainwaveSpace(bstate)); getSpacetime().getInputLogic().registerTrigger(new InputTrigger(new KeyPressedCondition(Key.PAGEUP_PRIOR), new TriggerAction() { public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) { bstate.getPrimaryFrequency().add(0.5); } })); getSpacetime().getInputLogic().registerTrigger(new InputTrigger(new KeyPressedCondition(Key.PAGEDOWN_NEXT), new TriggerAction() { public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) { bstate.getPrimaryFrequency().add(-0.5); } })); } public static void main(String[] args) { ArdorSpacetime.newWindow(new SpaceStrobe()); } }