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;
}
Example #2
0
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;
}
Example #3
0
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);
	}
}
Example #4
0
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);
}