void fractal_group::run( bool create_second_fractal ) { // initialize task scheduler tbb::task_scheduler_init init( num_threads ); // create contexts to manage fractal priorities context = new tbb::task_group_context[2]; set_priorities(); draw_borders(); // the second fractal is calculating on separated thread std::thread *fg_thread = 0; if ( create_second_fractal ) fg_thread = new std::thread( fg_thread_func, this ); // calculate the first fractal calc_fractal( 0 ); if ( fg_thread ) { // wait for second fractal fg_thread->join(); delete fg_thread; } delete[] context; }
void fractal_group::run( bool create_second_fractal ) { // initialize task scheduler tbb::task_scheduler_init init( num_threads ); // create contexts to manage fractal priorities context = new tbb::task_group_context[2]; set_priorities(); draw_borders(); tbb::task_arena arena; tbb::task_group gr; // the second fractal is calculating on separated thread if ( create_second_fractal ) { #if __TBB_CPP11_LAMBDAS_PRESENT arena.execute( [&] { gr.run( [&] { calc_fractal( 1 ); } ); } ); #else task_group_body tg_body( *this ); arena_body a_body( tg_body, gr ); arena.execute( a_body ); #endif } // calculate the first fractal calc_fractal( 0 ); if ( create_second_fractal ) { #if __TBB_CPP11_LAMBDAS_PRESENT // wait for second fractal arena.execute( [&] { gr.wait(); } ); #else arena.execute( arena_body_wait( gr ) ); #endif } delete[] context; }
int sleeper4(void*) { float acc = fack; float spp[18] = { 0, 0, (GLfloat)iterations, // 255 iterations 0.35f, 0, F_QUATMANDEL, -acc+playerpos.a*10*zoom2, acc+playerpos.a*10*zoom2, -acc+playerpos.b*10*zoom2, acc+playerpos.b*10*zoom2, -acc+playerpos.c*10*zoom2, acc+playerpos.c*10*zoom2, -acc+playerpos.d*10*zoom2, acc+playerpos.d*10*zoom2, acc, zoom2, tesseract, simplex }; float prevzoom = zoom2; int ttt,j; while(!done) { if(prevzoom != zoom2 || movx || movy || movz || movw) { if(points) { float inccc=0.5*zoom2; posx += movx*inccc; posy += movy*inccc; posz += movz*inccc; posw += movw*inccc; movx = 0; movz = 0; movw = 0; movy = 0; printf("ppos: %f, %f, %f, %f\n", posx, posy, posz, posw); resetpso = 1; SDL_Delay(100); while(posbufrunning) SDL_Delay(10); spp[6] = -acc+posx; spp[7] = acc+posx; spp[8] = -acc+posy; spp[9] = acc+posy; spp[10] = -acc+posz; spp[11] = acc+posz; spp[12] = -acc+posw; spp[13] = acc+posw; ttt = calc_fractal(spp, q); quatnum = ttt; maxquat = quatnum; for(j = 0; j < quatnum; j++) zposbufi[j] = j; if(ddebug) printf("calcfractal finish %d\n", quatnum); SDL_Delay(1000); resetpso = 0; } prevzoom = zoom2; } else SDL_Delay(100); } }
int mainloop(void*) { int drawchange = 0; int refreshdelay[2] = {33, 33}; int rdelay = 33; Uint32 time1 = SDL_GetTicks(), time2 = SDL_GetTicks(); float ts; int u; int i; if(!init_SDL(surface)) { fprintf(stderr, "SDL_OPENGL failed\n"); exit(1);} if(!initGL(w_width, w_height)) { fprintf(stderr, "OpenGL failed\n"); exit(1);} SDL_WM_SetCaption( "Tesseract", NULL ); glPointSize(8.0f); resizewindow(1280, 1024); load_textures(); lbounds[0] = 10; ts = lbounds[0]; q = (Quaternion*)(malloc(9999999*sizeof(Quaternion))); qbuffer = (Quaternion*)(malloc(9999*sizeof(Quaternion))); quatnum = 0; // quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 1,quatnum, 0.5); playerpost.set(0,0,0,0); float acc = fack; float spp[18] = { 0, 0, (GLfloat)iterations, // 255 iterations 0.35f, 0, F_QUATMANDEL, -acc+playerpost.a, acc+playerpost.a, -acc+playerpost.b, acc+playerpost.b, -acc+playerpost.c, acc+playerpost.c, -acc+playerpost.d, acc+playerpost.d, acc, zoom2, tesseract, simplex }; if(points) { quatnum = calc_fractal(spp, q); } else quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.5); bquat = quatnum; t_size = quatnum; /* quatnum += construct_tesseract(1,1,1,1, -ts, ts, ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, -ts, ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, ts, -ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, ts, ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, -ts, -ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, -ts, -ts, ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, -ts, ts, -ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, -ts, -ts, -ts, ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, -ts, ts, ts, -ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, -ts, ts, -ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, ts, -ts, -ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, ts, ts, -ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, ts, -ts, -ts, -ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, -ts, -ts, ts, -ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, -ts, ts, -ts, -ts,quatnum, 0.5); quatnum += construct_tesseract(1,1,1,1, -ts, -ts, -ts, -ts,quatnum, 0.5); */ freequat = quatnum; // quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.5); /* for(u = 4; u <= 8; u+=2) quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, -(5-u*4),quatnum, 1.75); for(u = 4; u <= 8; u+=2) quatnum += construct_tesseract(1,1,1,1, 0, 0, -(5-u*4), 0,quatnum, 1.75); for(u = 4; u <= 8; u+=2) quatnum += construct_tesseract(1,1,1,1, 0, -(5-u*4), 0, 0,quatnum, 1.75); for(u = 4; u <= 8; u+=2) quatnum += construct_tesseract(1,1,1,1, -(5-u*4), 0, 0, 0,quatnum, 1.75); */ movquat = quatnum; /* quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.8); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 1.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); quatnum += construct_tesseract(1,1,1,1, 0, 0, 0, 0,quatnum, 0.1); */ maxquat = quatnum; int yy; printf("quatnum: %d\n", quatnum); // for(u = 0; u < quatnum; u++) // qo[u] = q[u]; playerpos.set(0,0,0,0); playerpost.set(0,0,0,0); padd.set(0,0,0,0); ptemp.set(0,0,0,0); ptemp2.set(0,0,0,0); randreinit(); init_fbo(0); init_fbo(1); init_fbo(2); init_fbo(3); for(i = 0; i < quatnum/4; i++) { zposbuf[i] = get_zposbuf(i); zposbufi[i] = i; } while(!done) { framecounter++; if(framecounter > 4294967000UL) framecounter = 0; drawchange = keylistener(); SDL_Delay(rdelay*0.5); if(!(framecounter%5)) { // printf("Delay: %d\n", rdelay); time1 = SDL_GetTicks(); refreshdelay[framecounter%2] = 1000/((((int)(time1-time2)) > 0) ? (int)(time1-time2) : 1000 ); time2 = time1; if(abs(refreshdelay[framecounter%2] - refreshdelay[(framecounter-1)%2]) >= 2) { rdelay = (refreshdelay[framecounter%2] + refreshdelay[(framecounter-1)%2])/2; rdelay -= 16; if(rdelay <= 0) rdelay = 0; rdelay = 33; } } if(!(framecounter%((int)(33*20)))) randreinit(); drawGLscene(); } printf("Quit called, cleaning up\n"); SDL_Quit(); return(0); }