void drawTree(FastVoxelView &vv,Pos3D base,float h) { Pos3D p1(0,0,0),p2(0,0,0),p3(0,0,0); Color c(0x99,0x69,0); Color bc(0,0xAA,0); p1=base; p2=base+Pos3D(0,1,0)*h*0.25; p3=base+Pos3D(0,1,0)*h*0.5; cdebug(p1<<p2<<p3); Trunk t(p1,p2,p3,7,5); std::list<Trunk> tlist,nlist; tlist.push_back(t); int rw=h/4; float angle=M_PI/1.5; // 30 degrees int last=5; for(int i=0;i<=last;i++) { std::cout<<"_______________"<<std::endl; std::list<Trunk>::iterator k=tlist.begin(); for(;k!=tlist.end();k++) { Pos3D dir=k->p3 - k->p2; int count=4; std::list<Pos3D> l=splitDir(dir,count,angle,M_PI/count/8.0,0);//M_PI/count,angle/3); std::list<Pos3D>::iterator j=l.begin(); for(;j!=l.end();j++) { Pos3D r=*j; r=r*rw; int mi=i+1; // c=Color(mi&1,(mi>>1)&1,(mi>>2)&1); /* drawBall(vv,k->p1,4,c); drawBall(vv,k->p2,3,c); drawBall(vv,k->p3,2,c);*/ draw3Line(vv,k->p1,k->p2,k->p3,c,40,k->w1,k->w2); if(i==last) draw3Line(vv,k->p1,k->p2,k->p2,bc,4,2,1); float start=0.6; start+=getRandEq()*0.3; Pos3D sp=bezier(start, k->p1,k->p2,k->p3); // Pos3D np(k->p3*2-k->p2+Pos3D(rx,ry,rz)); Pos3D np(k->p3*2-k->p2+r); Trunk nt(sp, sp*0.5+np*0.5+getRandPos(rw), np, k->w2,k->w2-1); nlist.push_back(nt); } } rw*=0.9; tlist.clear(); cdebug(nlist.size()); tlist=nlist; nlist.clear(); } // roots std::list<Pos3D> l=splitDir(Pos3D(0,-1,0),4,M_PI/4,0,0); std::list<Pos3D>::iterator j=l.begin(); for(;j!=l.end();j++) { Pos3D n=*j * 10 + base; draw3Line(vv,base,base*0.5+n*0.5,n,c,40,t.w1,t.w2); } }
Pos3D getRandDirOrtho(Pos3D dir) { return (getRandPos(250)%dir).normalized(); }
void BeanLayer::start() { m_bean->setPosition(m_backgroundLayer->positionAt(getRandPos())); schedule(schedule_selector(BeanLayer::disappearCallback), BEAN_EXIST_TIME, 1, 0); }