boolean init; void setup() { size(400,400,P3D); //smooth(); init=true; } float lastMS=0; void draw() { if (init) { init=false; initBush(); mousevec=new Mousevec(); } background(166,124,81); if (mouseX!=0||mouseY!=0) { mousevec.update(); } updateBush(); // println(1000/(millis()-lastMS)); // saveFrame("g:/!temp/hairfield6_####.tga"); lastMS=millis(); } void keyPressed() { if (key==' ') {init=true;} } ////////////////////////////// Mousevec class ////////////////////////////// Mousevec mousevec; class Mousevec { float deg=0, len=0; int col=0, row=0; Mousevec() {} void update() { float mx=mouseX, my=mouseY, pmx=pmouseX, pmy=pmouseY; float dx=mx-pmx, dy=my-pmy; len=sqrt(sq(dx)+sq(dy)); if (mx!=pmx&&my!=pmy) { deg=atan2(dy,dx); } col=widthToCol(mouseX); row=heightToRow(mouseY); } } ////////////////////////////// end Mousevec ////////////////////////////// //////////////////////////////////////////////////////////////////////// ////////////////////////////// Bush class ////////////////////////////// int nr_col=100, nr_row=100, nr_bush; // number of rows/columns float colWid, rowHei; // column width/row height float baseLen=10, randLen=10; // basic bush length plus random length int nrHairPerBush=5; float randDir=radians(45); int range=8; float maxD=sqrt(2)*8; // range rows/cols for mouse Bush[] bush; void initBush() { nr_bush=nr_col*nr_row; colWid=width/(float)nr_col; rowHei=height/(float)nr_row; bush=new Bush[nr_bush]; for (int x=0;x=nr_col) {x2=nr_col-1;} int y1=mousevec.row-range; if (y1<0) {y1=0;} int y2=mousevec.row+range; if (y2>=nr_row) {y2=nr_row-1;} for (int x=x1;x<=x2;x++) { for (int y=y1;y<=y2;y++) { int i=y*nr_col+x; bush[i].mouseDistance=10+100*sqrt(sq(x-mousevec.col)+sq(y-mousevec.row))/maxD; } } // update Bushes: for (int i=0;i=nr_col) {x2=nr_col-1;} int y1=row-1; if (y1<0) {y1=0;} int y2=row+1; if (y2>=nr_row) {y2=nr_row-1;} for (int x=x1;x<=x2;x++) { for (int y=y1;y<=y2;y++) { if (!(x==0&&y==0)) { int i=y*nr_col+x; rot+=0.01*(getTurnDirection(dir,bush[i].dir)); } } } } void rotateToMouse() { rot+=0.9*(getTurnDirection(dir,mousevec.deg)/mouseDistance); } void setNewRotation() { rot*=0.95; dir+=rot; while (dir>PI) {dir-=TWO_PI;} while (dir<-PI) {dir+=TWO_PI;} } void drawMe() { dirLine(x,y,len,dir,c); for (int i=0;ideg2)?deg2-(deg1-TWO_PI):deg2-deg1; if (rdeg>16&255)*p1 + (c2>>16&255)*p2); int g=int((c1>>8&255)*p1 + (c2>>8&255)*p2); int b=int((c1&255)*p1 + (c2&255)*p2); set(x,y,(r<<16|g<<8|b)); }