int main() { czmqpp::context ctx; assert(ctx.self()); // Create a few sockets czmqpp::socket vent(ctx, ZMQ_PUSH); int rc = vent.bind("tcp://*:9000"); assert(rc != -1); czmqpp::socket sink(ctx, ZMQ_PULL); rc = sink.connect("tcp://localhost:9000"); assert(rc != -1); czmqpp::socket bowl(ctx, ZMQ_PULL); czmqpp::socket dish(ctx, ZMQ_PULL); // Set-up poller czmqpp::poller poller(bowl, sink, dish); assert(poller.self()); zstr_send(vent.self(), "Hello, World"); // We expect a message only on the sink czmqpp::socket which = poller.wait(-1); assert(which == sink); assert(poller.expired() == false); assert(poller.terminated() == false); char *message = zstr_recv(which.self()); assert(streq(message, "Hello, World")); free(message); return 0; }
void CFeatureCreator::CreateFeatures(CBitmap* bm, int startx, int starty,std::string metalfile) { printf("Creating features\n"); int xsize=bm->xsize/8; int ysize=bm->ysize/8; int mapx=xsize+1; //geovents CBitmap vent("geovent.bmp"); CBitmap metal(metalfile); //use the green channel for geos for(int y=0;y<metal.ysize;++y){ for(int x=0;x<metal.xsize;++x){ unsigned char c=metal.mem[(y*metal.xsize+x)*4+1]; if(c==255){ int bx=x*xsize/metal.xsize; int by=y*ysize/metal.ysize; for(int tries=0;tries<1000;++tries){ int x=bx+rand()*(40)/RAND_MAX-20; int y=by+rand()*(40)/RAND_MAX-20; if(x<5) x=5; if(x>xsize-5) x=xsize-5; if(y<5) y=5; if(y>ysize-5) y=ysize-5; float h=heightmap[y*mapx+x]; if(h<5) continue; bool good=true; for(int y2=y-3;y2<=y+3;++y2){ for(int x2=x-3;x2<=x+3;++x2){ if(fabs(h-heightmap[(y2)*mapx+x2])>3) good=false; } } if(good){ FeatureFileStruct ffs; ffs.featureType=NUM_TREE_TYPES+NUM_GRASS_TYPES; ffs.relativeSize=1; ffs.rotation=0; ffs.xpos=(float)x*8+4; ffs.ypos=0; ffs.zpos=(float)y*8+4; features.push_back(ffs); for(int y2=0;y2<vent.ysize;++y2){ for(int x2=0;x2<vent.xsize;++x2){ if(vent.mem[(y2*vent.xsize+x2)*4+0]!=255 || vent.mem[(y2*vent.xsize+x2)*4+2]!=255){ bm->mem[((y*8+y2-vent.ysize/2)*bm->xsize+x*8+x2-vent.xsize/2)*4+0]=vent.mem[(y2*vent.xsize+x2)*4+0]; bm->mem[((y*8+y2-vent.ysize/2)*bm->xsize+x*8+x2-vent.xsize/2)*4+1]=vent.mem[(y2*vent.xsize+x2)*4+1]; bm->mem[((y*8+y2-vent.ysize/2)*bm->xsize+x*8+x2-vent.xsize/2)*4+2]=vent.mem[(y2*vent.xsize+x2)*4+2]; } } } break; } } } } } //trees unsigned char* map=new unsigned char[ysize*xsize]; for(int y=0;y<ysize;++y){ for(int x=0;x<xsize;++x){ map[y*xsize+x]=0; } } for(int y=0;y<ysize;++y){ for(int x=0;x<xsize;++x){ int red=0; int green=0; int blue=0; for(int y2=0;y2<8;++y2){ for(int x2=0;x2<8;++x2){ red+=bm->mem[((y*8+y2)*bm->xsize+x*8+x2)*4+0]; green+=bm->mem[((y*8+y2)*bm->xsize+x*8+x2)*4+1]; blue+=bm->mem[((y*8+y2)*bm->xsize+x*8+x2)*4+2]; } } if(green>red*1.25 && green>blue*1.25){ bool foundClose=false; for(int y2=max(0,y-3);y2<=y;++y2){ for(int x2=max(0,x-3);x2<=min(xsize-1,x+3);++x2){ if(map[y2*xsize+x2]){ foundClose=true; } } } if(!foundClose && float(rand())/RAND_MAX>0.8){ map[y*xsize+x]=1; FeatureFileStruct ffs; ffs.featureType=(rand()*NUM_TREE_TYPES)/RAND_MAX; ffs.relativeSize=0.8f+float(rand())/RAND_MAX*0.4f; ffs.rotation=0; ffs.xpos=(float)startx+x*8+4; ffs.ypos=0; ffs.zpos=(float)starty+y*8+4; features.push_back(ffs); } } } } //grass for(int y=0;y<ysize/4;++y){ for(int x=0;x<xsize/4;++x){ int red=0; int green=0; int blue=0; for(int y2=0;y2<32;++y2){ for(int x2=0;x2<32;++x2){ red+=bm->mem[((y*32+y2)*bm->xsize+x*32+x2)*4+0]; green+=bm->mem[((y*32+y2)*bm->xsize+x*32+x2)*4+1]; blue+=bm->mem[((y*32+y2)*bm->xsize+x*32+x2)*4+2]; } } if(green>red*1.07 && green>blue*1.07 && heightmap[(y*4+2)*mapx+x*4+2]>2){ map[y*xsize+x]=1; FeatureFileStruct ffs; ffs.featureType=NUM_TREE_TYPES; ffs.relativeSize=0; ffs.rotation=0; ffs.xpos=(float)x*32+16; ffs.ypos=0; ffs.zpos=(float)y*32+16; features.push_back(ffs); } } } }