// Hairfield 7 /* [SHIFT]-[A] anti-aliasing on/off [SHIFT]-[B] bugs visible on/off [SHIFT]-[B] toggle bugs visibility [SHIFT]-[H] toggle hair visibility [Q] randomize hair direction [SHIFT]-[Q] randomize hair sliders [W] randomize bug position [SHIFT]-[W] randomize bug sliders [E] randomize everything [SHIFT]-[E] randomize everything & clear [R] clear screen */ int MOUSE_INFLUENCE_RADIUS = 4; float MOUSE_INFLUENCE_STRENGTH = 12.0; Hair[][] hair; Vector bugs; SliderGroup sliders, slidersTop; boolean HAIR_VISIBLE; boolean BUGS_VISIBLE; boolean SIMULATION_IS_RUNNING; boolean SHIFT_IS_PRESSED = false; boolean CONTROL_IS_PRESSED = false; boolean ALT_IS_PRESSED = false; int BACKGROUND = 0xFFFFFF; QImage drawImage; String SLIDER_NAME_ANTIALIASING = "Anti-aliasing"; KeyBinding KEY_TOGGLE_ANTI_ALIASING = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'a',"Toggle anti-aliasing"); String SLIDER_NAME_CHANNEL_DEPTH = "Channel Depth"; KeyBinding KEY_TOGGLE_CHANNEL_DEPTH = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'c',"Toggle channel depth"); String SLIDER_NAME_BUG_VISIBILITY = "Bugs visible"; KeyBinding KEY_TOGGLE_BUG_VISIBILITY = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'b',"Toggle bugs visibility"); String SLIDER_NAME_HAIR_VISIBILITY = "Hair visible"; KeyBinding KEY_TOGGLE_HAIR_VISIBILITY = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'h',"Toggle hair visibility"); String SLIDER_NAME_TOGGLE_SIMULATION = "Simulation"; KeyBinding KEY_TOGGLE_SIMULATION_RUNNING = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'s',"Toggle simulation running"); String SLIDER_NAME_HAIR_DENSITY = "Hair density"; String SLIDER_NAME_HAIR_ALIGNMENT = "Hair alignment"; String SLIDER_NAME_HAIR_LENGTH = "Hair->Bug influence"; String SLIDER_NAME_BUG_AMOUNT = "Bug amount"; String SLIDER_NAME_BUG_DRAG = "Bug drag"; String SLIDER_NAME_BUG_PRESSURE = "Bug pressure"; KeyBinding KEY_RANDOMIZE_HAIR_DIRECTIONS = new KeyBinding('q',"Randomize hair directions"); KeyBinding KEY_RANDOMIZE_HAIR_SLIDERS = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'q',"Randomize hair settings"); KeyBinding KEY_RANDOMIZE_BUG_POSITIONS = new KeyBinding('w',"Randomize bug positions"); KeyBinding KEY_RANDOMIZE_BUG_SLIDERS = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'w',"Randomize bug settings"); KeyBinding KEY_RANDOMIZE_EVERYTHING = new KeyBinding('e',"Randomize everything"); KeyBinding KEY_RANDOMIZE_EVERYTHING_AND_CLEAR = new KeyBinding(KeyBinding.SPECIALKEY_SHIFT,'e',"Randomize everything & clear"); KeyBinding KEY_CLEAR_SCREEN = new KeyBinding('r',"Clear drawing screen"); Vector KEY_COMMANDS; /* * * * VOID SETUP * initialisation of all variables and stuff * * */ void setup() { size(800,570,P3D); drawImage = new QImage(800,450); drawImage.setChannelDepth(QImage.CHANNEL_DEPTH_16BIT); drawImage.background(BACKGROUND); KEY_COMMANDS = new Vector(); KEY_COMMANDS.add(KEY_RANDOMIZE_HAIR_DIRECTIONS); KEY_COMMANDS.add(KEY_RANDOMIZE_HAIR_SLIDERS); KEY_COMMANDS.add(KEY_RANDOMIZE_BUG_POSITIONS); KEY_COMMANDS.add(KEY_RANDOMIZE_BUG_SLIDERS); KEY_COMMANDS.add(KEY_RANDOMIZE_EVERYTHING); KEY_COMMANDS.add(KEY_RANDOMIZE_EVERYTHING_AND_CLEAR); KEY_COMMANDS.add(KEY_CLEAR_SCREEN); HAIR_VISIBLE = false; BUGS_VISIBLE = false; SIMULATION_IS_RUNNING = true; // SETUP SLIDERS Slider s; slidersTop = new SliderGroup(); s = new Slider(10,10,22,0,1,1,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_ANTIALIASING); s.setNumberMode(Slider.NUMBER_MODE_BOOLEAN); s.addPreName(KEY_TOGGLE_ANTI_ALIASING.toCommand()); slidersTop.add(s); s = new Slider(10,25,22,0,1,1,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_CHANNEL_DEPTH); s.setNumberMode(Slider.NUMBER_MODE_BOOLEAN); s.addPreName(KEY_TOGGLE_CHANNEL_DEPTH.toCommand()); s.setBooleanStrings("8bit","16bit"); slidersTop.add(s); s = new Slider(10,40,22,0,1,0,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_BUG_VISIBILITY); s.setNumberMode(Slider.NUMBER_MODE_BOOLEAN); s.addPreName(KEY_TOGGLE_BUG_VISIBILITY.toCommand()); slidersTop.add(s); s = new Slider(10,55,22,0,1,0,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_HAIR_VISIBILITY); s.setNumberMode(Slider.NUMBER_MODE_BOOLEAN); s.addPreName(KEY_TOGGLE_HAIR_VISIBILITY.toCommand()); slidersTop.add(s); s = new Slider(10,70,22,0,1,1,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_TOGGLE_SIMULATION); s.setNumberMode(Slider.NUMBER_MODE_BOOLEAN); s.addPreName(KEY_TOGGLE_SIMULATION_RUNNING.toCommand()); s.setBooleanStrings("stopped","running"); slidersTop.add(s); slidersTop.createFrameFromSliders(220,0); slidersTop.move(270,450); sliders = new SliderGroup(); s = new Slider(10,0,80,0.01,0.3,0.1,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_HAIR_DENSITY); s.setStepSize(0.001); sliders.add(s); s = new Slider(10,15,80,-0.5,1.0,0.15,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_HAIR_ALIGNMENT); s.setSlideMode(Slider.SLIDE_MODE_SQUARE_ROOT); s.setStepSize(0.005); sliders.add(s); s = new Slider(10,30,80,1,80,15,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_HAIR_LENGTH); s.setStepSize(0.1); s.setDigits(2,1); sliders.add(s); s = new Slider(10,45,80,10,5000,1500,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_BUG_AMOUNT); s.setNumberMode(Slider.NUMBER_MODE_INT); s.setStepSize(10); s.setDigits(4,0); sliders.add(s); s = new Slider(10,60,80,0.5,0.990,0.98,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_BUG_DRAG); s.setStepSize(0.002); s.setDigits(1,3); sliders.add(s); s = new Slider(10,75,80,0,0.5,0.1,Slider.ORIENTATION_HORIZONTAL,SLIDER_NAME_BUG_PRESSURE); s.setDigits(0,3); s.setStepSize(0.01); sliders.add(s); sliders.createFrameFromSliders(170,0); sliders.move(0,460); // SETUP HAIR makeHairFromSliders(); // SETUP BUGS bugs = new Vector(); makeBugsFromSliders(int(sliders.getValueOfSlider(SLIDER_NAME_BUG_AMOUNT))); } /* * * * VOID DRAW * * */ void draw() { background(128,128,128); for (int i=0;inNow) { makeBugsFromSliders(nFut-nNow); } } if (sliders.hasChanged(SLIDER_NAME_BUG_PRESSURE)) { float p = sliders.getValueOfSlider(SLIDER_NAME_BUG_PRESSURE); for (int i=0;i=0&&ix=0&&iy=oldAmountX) xiOld=oldAmountX-1; if (yiOld>=oldAmountY) yiOld=oldAmountY-1; float x = xi/dens; float y = yi/dens; x += random(-0.5,0.5)/dens; y += random(-0.5,0.5)/dens; hair[xi][yi] = new Hair(x,y,x+oldhair[xiOld][yiOld].getDirX(),y+oldhair[xiOld][yiOld].getDirY(),xi,yi,alignment,hairlength); } } } /* * * * MOUSE AND KEYBOARD ROUTINES * * */ void keyPressed() { if (keyCode==SHIFT) SHIFT_IS_PRESSED = true; if (keyCode==CONTROL) CONTROL_IS_PRESSED = true; if (keyCode==ALT) ALT_IS_PRESSED = true; int specialKey = (new KeyBinding(SHIFT_IS_PRESSED,CONTROL_IS_PRESSED,ALT_IS_PRESSED)).getSpecialKey(); // TOGGLE ANTIALIASING: if (KEY_TOGGLE_ANTI_ALIASING.isPressed(specialKey,keyCode)) { int index = slidersTop.findIndexOfSliderNamed(SLIDER_NAME_ANTIALIASING); if (index!=-1) ((Slider)slidersTop.elementAt(index)).invertValue(); //slidersAntialiased.invertValue(); } // TOGGLE CHANNEL DEPTH: if (KEY_TOGGLE_CHANNEL_DEPTH.isPressed(specialKey,keyCode)) { int index = slidersTop.findIndexOfSliderNamed(SLIDER_NAME_CHANNEL_DEPTH); if (index!=-1) ((Slider)slidersTop.elementAt(index)).invertValue(); } // TOGGLE BUG VISIBILITY if (KEY_TOGGLE_BUG_VISIBILITY.isPressed(specialKey,keyCode)) { int index = slidersTop.findIndexOfSliderNamed(SLIDER_NAME_BUG_VISIBILITY); if (index!=-1) ((Slider)slidersTop.elementAt(index)).invertValue(); } // TOGGLE HAIR VISIBILITY if (KEY_TOGGLE_HAIR_VISIBILITY.isPressed(specialKey,keyCode)) { int index = slidersTop.findIndexOfSliderNamed(SLIDER_NAME_HAIR_VISIBILITY); if (index!=-1) ((Slider)slidersTop.elementAt(index)).invertValue(); } // TOGGLE SIMULATION RUNNIGN: if (KEY_TOGGLE_SIMULATION_RUNNING.isPressed(specialKey,keyCode)) { int index = slidersTop.findIndexOfSliderNamed(SLIDER_NAME_TOGGLE_SIMULATION); if (index!=-1) ((Slider)slidersTop.elementAt(index)).invertValue(); } // CLEAR SCREEN if (KEY_CLEAR_SCREEN.isPressed(specialKey,keyCode)) drawImage.background(BACKGROUND); // RANDOMIZE BUG POSITIONS if (KEY_RANDOMIZE_BUG_POSITIONS.isPressed(specialKey,keyCode)) { for (int i=0;i