示例#1
0
void JTLine::draw(float alpha){
    
    //draw line
    ofNoFill();

    glPushAttrib(GL_ENABLE_BIT);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
    ofSetLineWidth(this->lineWidth);
    glBegin(GL_LINES);
    
    if(pluckCounter==0){
        glColor4b(
                   color.red() * 255.0,  
                   color.green() * 255.0,
                   color.blue() * 255.0,
                   128.0 * alpha );
    }else{
        glColor4f(1,1,1,alpha);
    }
    
    glVertex2f(x3,y3);
    glColor4b(0,0,0,0);
    
    glVertex2f(x4,y4);
    glEnd();
    glPopAttrib();
    
    
    //draw ball
    ofSetColor(
               ballColor.red() * 255.0,
               ballColor.green() * 255.0,
               ballColor.blue() * 255.0,
               128.0 * alpha );
    
    ofFill();
    ofSetLineWidth(1);
    ofCircle(ballX,ballY,radius);
    
}
示例#2
0
/////////////////////////////////////////////////////////
// Render
//
void GEMglColor4b :: render(GemState *state) {
	glColor4b (red, green, blue, alpha);
}
inline void glColor( const GLbyte & red, const GLbyte & green, const GLbyte & blue, const GLbyte & alpha )	{ glColor4b( red, green, blue, alpha ); }
示例#4
0
M(void, glColor4b, jbyte red, jbyte green, jbyte blue, jbyte alpha) {
	glColor4b(red, green, blue, alpha);
}
示例#5
0
/** Main displaying function
 */
void display(void)
{
	//Update Scene if not paused
	int i,j,k;
	int err_coord_cnt = 0;
	double calculationTime;
	double renderTime;
    void * m_font = GLUT_BITMAP_8_BY_13;
	if(!sPause){
		if(!load_from_file){
			try{
				calculationTime = fluid_simulation->simulationStep(load_to); // Run one simulation step
				p_indexb = fluid_simulation->getParticleIndex_cpp();
				p_cpp = fluid_simulation->getPosition_cpp();
				d_cpp = fluid_simulation->getDensity_cpp();
				ec_cpp = fluid_simulation->getElasticConnectionsData_cpp();
				if(!load_from_file)
					md_cpp = fluid_simulation->getMembraneData_cpp();
			}catch(std::runtime_error & ex){
				cleanupSimulation();
				std::cout << "ERROR: " << ex.what() << std::endl;
				exit (EXIT_FAILURE); // unfortunately we cannot leave glutmain loop by the other way
			}
			int pib;
			for(i=0;i<localConfig->getParticleCount();++i)
			{
				pib = p_indexb[2*i + 1];
				p_indexb[2*pib + 0] = i;
			}

			if(fluid_simulation->getIteration() == localConfig->getNumberOfIteration()){
				std::cout << "Simulation is reached time limit" << std::endl;
				cleanupSimulation();
				exit (EXIT_SUCCESS); // unfortunately we cannot leave glutmain loop by the other way
			}
		}else{
			try{
				if(owHelper::loadConfigurationFromFile(p_cpp, ec_cpp, md_cpp, localConfig, iteration)){
					iteration++;
				}else{
				  cleanupSimulation();
				  std::cout << "Simulation has reached end of file" << std::endl;
				  exit(EXIT_SUCCESS);
				}
			 }catch(std::exception &e){
				  cleanupSimulation();
				  std::cout << "ERROR: " << e.what() << std::endl;
				  exit (EXIT_FAILURE);
			 }
		}
		helper->refreshTime();
	}

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	drawScene();
	glPointSize(3.f);
	glBegin(GL_POINTS);
	float dc, rho;
	//Display all particles
	for(i = 0; i<localConfig->getParticleCount(); ++i)
	{
		if(!load_from_file){
			rho = d_cpp[ p_indexb[ i * 2 + 0 ] ];
			if( rho < 0 ) rho = 0;
			if( rho > 2 * rho0) rho = 2 * rho0;
			dc = 100.f * ( rho - rho0 ) / rho0 ;
			if(dc>1.f) dc = 1.f;
			//  R   G   B
			glColor4f(  0,  0,  1, 1.0f);//blue
			if(!load_from_file){
				if( (dc=100*(rho-rho0*1.00f)/rho0) >0 )	glColor4f(   0,  dc,   1,1.0f);//cyan
				if( (dc=100*(rho-rho0*1.01f)/rho0) >0 )	glColor4f(   0,   1,1-dc,1.0f);//green
				if( (dc=100*(rho-rho0*1.02f)/rho0) >0 )	glColor4f(  dc,   1,   0,1.0f);//yellow
				if( (dc=100*(rho-rho0*1.03f)/rho0) >0 )	glColor4f(   1,1-dc,   0,1.0f);//red
				if( (dc=100*(rho-rho0*1.04f)/rho0) >0 )	glColor4f(   1,   0,   0,1.0f);
			}
		}
		else
			glColor4f(  0,  0,  1, 1.0f);//blue
		if((int)p_cpp[i*4 + 3] != BOUNDARY_PARTICLE /*&& (int)p_cpp[i*4 + 3] != ELASTIC_PARTICLE*/)
		{
			glBegin(GL_POINTS);
			if((int)p_cpp[i*4+3]==2)
			{
				glColor4f(   0,   0,   0,  1.0f);// color of elastic particles
				glPointSize(6.f);
			}
			glVertex3f( (p_cpp[i*4]-localConfig->xmax/2)*sc , (p_cpp[i*4+1]-localConfig->ymax/2)*sc, (p_cpp[i*4+2]-localConfig->zmax/2)*sc );
			glPointSize(3.f);
			glEnd();

			if(!((p_cpp[i*4  ]>=0)&&(p_cpp[i*4  ]<=localConfig->xmax)&&
				(p_cpp[i*4+1]>=0)&&(p_cpp[i*4+1]<=localConfig->ymax)&&
				(p_cpp[i*4+2]>=0)&&(p_cpp[i*4+2]<=localConfig->zmax) ))
			{
				char label[50];
				beginWinCoords();
				glRasterPos2f (0.01F, 0.05F);
				if(err_coord_cnt<50){
				sprintf(label,"%d: %f , %f , %f",i,p_cpp[i*4  ],p_cpp[i*4+1],p_cpp[i*4+2]);
				glPrint( 0.f, (float)(50+err_coord_cnt*11), label, m_font);}
				if(err_coord_cnt==50) {
				glPrint( 0, (float)(50+err_coord_cnt*11), "............", m_font);}
				err_coord_cnt++;
				endWinCoords();
			}
		}
	}
	glLineWidth((GLfloat)0.1);
	//Display elastic connections
	for(int i_ec=0; i_ec < localConfig->numOfElasticP * MAX_NEIGHBOR_COUNT; ++i_ec)
	{
		//offset = 0
		if((j=(int)ec_cpp[ 4 * i_ec + 0 ])>=0)
		{
			i = (i_ec / MAX_NEIGHBOR_COUNT);// + (generateInitialConfiguration!=1)*numOfBoundaryP;
			if(i<j)
			{
				glColor4b(150/2, 125/2, 0, 100/2/*alpha*/);
				if(ec_cpp[ 4 * i_ec + 2 ]>1.f)//muscles
				{
					glLineWidth((GLfloat)1.0);
					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.45f)
					{
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(127/2, 0, 255/2, 255/2);/* muscle_number+0.5 <--> violet*/
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-localConfig->xmax/2)*sc , (p_cpp[i*4+1]-localConfig->ymax/2)*sc, (p_cpp[i*4+2]-localConfig->zmax/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-localConfig->xmax/2)*sc , (p_cpp[j*4+1]-localConfig->ymax/2)*sc, (p_cpp[j*4+2]-localConfig->zmax/2)*sc );
						glEnd();
					}
					else
					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.35f)
					{
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(255/2, 0, 255/2, 255/2);/* muscle_number+0.4 <--> magenta*/
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-localConfig->xmax/2)*sc , (p_cpp[i*4+1]-localConfig->ymax/2)*sc, (p_cpp[i*4+2]-localConfig->zmax/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-localConfig->xmax/2)*sc , (p_cpp[j*4+1]-localConfig->ymax/2)*sc, (p_cpp[j*4+2]-localConfig->zmax/2)*sc );
						glEnd();
					}
					else
					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.25f)
					{
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(255/2, 127/2, 0, 255/2);/* muscle_number+0.3 <--> orange*/
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-localConfig->xmax/2)*sc , (p_cpp[i*4+1]-localConfig->ymax/2)*sc, (p_cpp[i*4+2]-localConfig->zmax/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-localConfig->xmax/2)*sc , (p_cpp[j*4+1]-localConfig->ymax/2)*sc, (p_cpp[j*4+2]-localConfig->zmax/2)*sc );
						glEnd();
					}
					else
					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.15f)
					{
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(255/2, 0, 0, 255/2);/* muscle_number+0.2 <--> red*/
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-localConfig->xmax/2)*sc , (p_cpp[i*4+1]-localConfig->ymax/2)*sc, (p_cpp[i*4+2]-localConfig->zmax/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-localConfig->xmax/2)*sc , (p_cpp[j*4+1]-localConfig->ymax/2)*sc, (p_cpp[j*4+2]-localConfig->zmax/2)*sc );
						glEnd();
					}
					else
					{
						glColor4b(255/2, 0,     0, 255/2);/* muscle_number+0.1 <--> red */

						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-localConfig->xmax/2)*sc , (p_cpp[i*4+1]-localConfig->ymax/2)*sc, (p_cpp[i*4+2]-localConfig->zmax/2)*sc );
						glVertex3f( (p_cpp[j*4+0]-localConfig->xmax/2)*sc , (p_cpp[j*4+1]-localConfig->ymax/2)*sc, (p_cpp[j*4+2]-localConfig->zmax/2)*sc );
						glEnd();
					}
				}
				else
				{//ordinary springs
					glLineWidth((GLfloat)0.1);
					glBegin(GL_LINES);
											glColor4b(150/2, 125/2, 0, 100/2);
					if(p_cpp[i*4+3]>2.15)	glColor4b( 50/2, 125/2, 0, 100/2);
					glVertex3f( (p_cpp[i*4+0]-localConfig->xmax/2)*sc , (p_cpp[i*4+1]-localConfig->ymax/2)*sc, (p_cpp[i*4+2]-localConfig->zmax/2)*sc );
											glColor4b(150/2, 125/2, 0, 100/2);
					if(p_cpp[j*4+3]>2.15)	glColor4b( 50/2, 125/2, 0, 100/2);
					glVertex3f( (p_cpp[j*4+0]-localConfig->xmax/2)*sc , (p_cpp[j*4+1]-localConfig->ymax/2)*sc, (p_cpp[j*4+2]-localConfig->zmax/2)*sc );
					glEnd();
				}
			}
		}
	}
	// Draw membranes
	glColor4b(0, 200/2, 150/2, 255/2/*alpha*/);
	for(unsigned int i_m = 0; i_m < localConfig->numOfMembranes; ++i_m)
	{
		i = md_cpp [i_m*3+0];
		j = md_cpp [i_m*3+1];
		k = md_cpp [i_m*3+2];

		glBegin(GL_LINES);
		glVertex3f( ((p_cpp[i*4]+p_cpp[j*4]+4*p_cpp[k*4])/6-localConfig->xmax/2)*sc , ((p_cpp[i*4+1]+p_cpp[j*4+1]+4*p_cpp[k*4+1])/6-localConfig->ymax/2)*sc, ((p_cpp[i*4+2]+p_cpp[j*4+2]+4*p_cpp[k*4+2])/6-localConfig->zmax/2)*sc );
		glVertex3f( ((p_cpp[i*4]+p_cpp[k*4]+4*p_cpp[j*4])/6-localConfig->xmax/2)*sc , ((p_cpp[i*4+1]+p_cpp[k*4+1]+4*p_cpp[j*4+1])/6-localConfig->ymax/2)*sc, ((p_cpp[i*4+2]+p_cpp[k*4+2]+4*p_cpp[j*4+2])/6-localConfig->zmax/2)*sc );

		glVertex3f( ((p_cpp[i*4]+p_cpp[k*4]+4*p_cpp[j*4])/6-localConfig->xmax/2)*sc , ((p_cpp[i*4+1]+p_cpp[k*4+1]+4*p_cpp[j*4+1])/6-localConfig->ymax/2)*sc, ((p_cpp[i*4+2]+p_cpp[k*4+2]+4*p_cpp[j*4+2])/6-localConfig->zmax/2)*sc );
		glVertex3f( ((p_cpp[j*4]+p_cpp[k*4]+4*p_cpp[i*4])/6-localConfig->xmax/2)*sc , ((p_cpp[j*4+1]+p_cpp[k*4+1]+4*p_cpp[i*4+1])/6-localConfig->ymax/2)*sc, ((p_cpp[j*4+2]+p_cpp[k*4+2]+4*p_cpp[i*4+2])/6-localConfig->zmax/2)*sc );

		glVertex3f( ((p_cpp[j*4]+p_cpp[k*4]+4*p_cpp[i*4])/6-localConfig->xmax/2)*sc , ((p_cpp[j*4+1]+p_cpp[k*4+1]+4*p_cpp[i*4+1])/6-localConfig->ymax/2)*sc, ((p_cpp[j*4+2]+p_cpp[k*4+2]+4*p_cpp[i*4+2])/6-localConfig->zmax/2)*sc );
		glVertex3f( ((p_cpp[i*4]+p_cpp[j*4]+4*p_cpp[k*4])/6-localConfig->xmax/2)*sc , ((p_cpp[i*4+1]+p_cpp[j*4+1]+4*p_cpp[k*4+1])/6-localConfig->ymax/2)*sc, ((p_cpp[i*4+2]+p_cpp[j*4+2]+4*p_cpp[k*4+2])/6-localConfig->zmax/2)*sc );
		glEnd();
	}
	glLineWidth((GLfloat)1.0);
	glutSwapBuffers();
	helper->watch_report("graphics: \t\t%9.3f ms\n====================================\n");
	renderTime = helper->getElapsedTime();
	totalTime += calculationTime + renderTime;
	calculateFPS();
}
void display(void)
{
	helper->refreshTime();
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	
	drawScene();

	int i,j,k;
	//glColor3ub(255,255,255);//yellow
	if(!load_from_file)
		p_indexb = fluid_simulation->getParticleIndex_cpp();
	int pib;
	int err_coord_cnt = 0;
	if(!load_from_file)
		for(i=0;i<PARTICLE_COUNT;i++)
		{
			pib = p_indexb[2*i + 1];
			p_indexb[2*pib + 0] = i;
		}
	glPointSize(3.f);
	glBegin(GL_POINTS);
	if(!load_from_file){
		p_cpp = fluid_simulation->getPosition_cpp();
		d_cpp = fluid_simulation->getDensity_cpp();
	}
	float dc, rho;
	for(i = 0; i<PARTICLE_COUNT; i++)
	{
		//printf("[%d]",i);
		if(!load_from_file){
			rho = d_cpp[ p_indexb[ i * 2 + 0 ] ];
			if( rho < 0 ) rho = 0;
			if( rho > 2 * rho0) rho = 2 * rho0;
			dc = 100.f * ( rho - rho0 ) / rho0 ;
			if(dc>1.f) dc = 1.f;
			//  R   G   B
			glColor4f(  0,  0,  1, 1.0f);//blue
			if(!load_from_file){
				if( (dc=100*(rho-rho0*1.00f)/rho0) >0 )	glColor4f(   0,  dc,   1,1.0f);//cyan
				if( (dc=100*(rho-rho0*1.01f)/rho0) >0 )	glColor4f(   0,   1,1-dc,1.0f);//green
				if( (dc=100*(rho-rho0*1.02f)/rho0) >0 )	glColor4f(  dc,   1,   0,1.0f);//yellow
				if( (dc=100*(rho-rho0*1.03f)/rho0) >0 )	glColor4f(   1,1-dc,   0,1.0f);//red
				if( (dc=100*(rho-rho0*1.04f)/rho0) >0 )	glColor4f(   1,   0,   0,1.0f);
			}
		}
		else
			glColor4f(  0,  0,  1, 1.0f);//blue
		if((int)p_cpp[i*4 + 3] != BOUNDARY_PARTICLE /*&& (int)p_cpp[i*4 + 3] != ELASTIC_PARTICLE*/)
		{
			glBegin(GL_POINTS);
			if((int)p_cpp[i*4+3]==2) 
			{ 
				glColor4f(   0,   0,   0,  1.0f);// color of elastic particles
				glPointSize(6.f);
			}
			glVertex3f( (p_cpp[i*4]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
			glPointSize(3.f);
			glEnd();

			if(!(	(p_cpp[i*4  ]>=0)&&(p_cpp[i*4  ]<=XMAX)&&
					(p_cpp[i*4+1]>=0)&&(p_cpp[i*4+1]<=YMAX)&&
					(p_cpp[i*4+2]>=0)&&(p_cpp[i*4+2]<=ZMAX) ))
			{
			char label[50];
			beginWinCoords();
			glRasterPos2f (0.01F, 0.05F); 
			if(err_coord_cnt<50){
			sprintf(label,"%d: %f , %f , %f",i,p_cpp[i*4  ],p_cpp[i*4+1],p_cpp[i*4+2]);
			glPrint( 0, 50+err_coord_cnt*11, label, m_font);}
			if(err_coord_cnt==50) {
			glPrint( 0, 50+err_coord_cnt*11, "............", m_font);}
			err_coord_cnt++;
			endWinCoords();
			}
		}
	}

				
	if(!load_from_file)
		ec_cpp = fluid_simulation->getElasticConnectionsData_cpp();
	
	glLineWidth((GLfloat)0.1);

	int ecc=0;//elastic connections counter;
	//if(generateInitialConfiguration)
	for(int i_ec=0; i_ec < numOfElasticP * MAX_NEIGHBOR_COUNT; i_ec++)
	{
		//offset = 0
		if((j=(int)ec_cpp[ 4 * i_ec + 0 ])>=0)
		{
			i = (i_ec / MAX_NEIGHBOR_COUNT);// + (generateInitialConfiguration!=1)*numOfBoundaryP;

			if(i<j)	
			{
				glColor4b(150/2, 125/2, 0, 100/2/*alpha*/);

				if(ec_cpp[ 4 * i_ec + 2 ]>1.f)//muscles 
				{
					glLineWidth((GLfloat)1.0);

					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.45f) 
					{
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(127/2, 0, 255/2, 255/2);/* muscle_number+0.5 <--> violet*/  
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );
						glEnd();
					}
					else
					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.35f) 
					{ 
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(255/2, 0, 255/2, 255/2);/* muscle_number+0.4 <--> magenta*/  
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );
						glEnd();
					}
					else
					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.25f) 
					{ 
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(255/2, 127/2, 0, 255/2);/* muscle_number+0.3 <--> orange*/  
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );
						glEnd();
					}
					else
					if(ec_cpp[4*i_ec+2]-floor(ec_cpp[4*i_ec+2])>0.15f) 
					{ 
						if(muscle_activation_signal_cpp[ (int)(floor( ec_cpp[4*i_ec+2])-1) ]>0.1)
						glLineWidth((GLfloat)6.0); else glLineWidth((GLfloat)2.0);
						glColor4b(255/2, 0, 0, 255/2);/* muscle_number+0.2 <--> red*/  
						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
						glColor4b(255/2, 255/2, 255/2, 255/2);
						glVertex3f( (p_cpp[j*4+0]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );
						glEnd();
					}
					else
					{
						glColor4b(255/2, 0,     0, 255/2);/* muscle_number+0.1 <--> red */

						glBegin(GL_LINES);
						glVertex3f( (p_cpp[i*4+0]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
						glVertex3f( (p_cpp[j*4+0]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );
						glEnd();
					}
				}
				else
				{//ordinary springs
					glLineWidth((GLfloat)0.1);
					glBegin(GL_LINES);
											glColor4b(150/2, 125/2, 0, 100/2);
					if(p_cpp[i*4+3]>2.15)	glColor4b( 50/2, 125/2, 0, 100/2);
					glVertex3f( (p_cpp[i*4+0]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
											glColor4b(150/2, 125/2, 0, 100/2);
					if(p_cpp[j*4+3]>2.15)	glColor4b( 50/2, 125/2, 0, 100/2);
					glVertex3f( (p_cpp[j*4+0]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );
					glEnd();
				}
				
				ecc++;
			}
		}
	}

	/*beginWinCoords();
	char label[300];
	glRasterPos2f (0.01F, 0.05F); 
	glColor4b(255/2, 255/2, 0, 255/2);
	sprintf(label,"elastic connections count: %d, elementary membranes count: %d",ecc,numOfMembranes);
	glPrint( 1, 50, label, m_font);
	endWinCoords();*/


	//draw membranes
	if(!load_from_file)
		md_cpp = fluid_simulation->getMembraneData_cpp();

	glColor4b(0, 200/2, 150/2, 255/2/*alpha*/);

	/**/
	for(int i_m = 0; i_m < numOfMembranes; i_m++)
	{
		i = md_cpp [i_m*3+0];
		j = md_cpp [i_m*3+1];
		k = md_cpp [i_m*3+2];

		/*
		glBegin(GL_LINES);
		glVertex3f( (p_cpp[i*4]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
		glVertex3f( (p_cpp[j*4]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );

		glVertex3f( (p_cpp[j*4]-XMAX/2)*sc , (p_cpp[j*4+1]-YMAX/2)*sc, (p_cpp[j*4+2]-ZMAX/2)*sc );
		glVertex3f( (p_cpp[k*4]-XMAX/2)*sc , (p_cpp[k*4+1]-YMAX/2)*sc, (p_cpp[k*4+2]-ZMAX/2)*sc );

		glVertex3f( (p_cpp[k*4]-XMAX/2)*sc , (p_cpp[k*4+1]-YMAX/2)*sc, (p_cpp[k*4+2]-ZMAX/2)*sc );
		glVertex3f( (p_cpp[i*4]-XMAX/2)*sc , (p_cpp[i*4+1]-YMAX/2)*sc, (p_cpp[i*4+2]-ZMAX/2)*sc );
		glEnd();*/

		glBegin(GL_LINES);
		glVertex3f( ((p_cpp[i*4]+p_cpp[j*4]+4*p_cpp[k*4])/6-XMAX/2)*sc , ((p_cpp[i*4+1]+p_cpp[j*4+1]+4*p_cpp[k*4+1])/6-YMAX/2)*sc, ((p_cpp[i*4+2]+p_cpp[j*4+2]+4*p_cpp[k*4+2])/6-ZMAX/2)*sc );
		glVertex3f( ((p_cpp[i*4]+p_cpp[k*4]+4*p_cpp[j*4])/6-XMAX/2)*sc , ((p_cpp[i*4+1]+p_cpp[k*4+1]+4*p_cpp[j*4+1])/6-YMAX/2)*sc, ((p_cpp[i*4+2]+p_cpp[k*4+2]+4*p_cpp[j*4+2])/6-ZMAX/2)*sc );

		glVertex3f( ((p_cpp[i*4]+p_cpp[k*4]+4*p_cpp[j*4])/6-XMAX/2)*sc , ((p_cpp[i*4+1]+p_cpp[k*4+1]+4*p_cpp[j*4+1])/6-YMAX/2)*sc, ((p_cpp[i*4+2]+p_cpp[k*4+2]+4*p_cpp[j*4+2])/6-ZMAX/2)*sc );
		glVertex3f( ((p_cpp[j*4]+p_cpp[k*4]+4*p_cpp[i*4])/6-XMAX/2)*sc , ((p_cpp[j*4+1]+p_cpp[k*4+1]+4*p_cpp[i*4+1])/6-YMAX/2)*sc, ((p_cpp[j*4+2]+p_cpp[k*4+2]+4*p_cpp[i*4+2])/6-ZMAX/2)*sc );

		glVertex3f( ((p_cpp[j*4]+p_cpp[k*4]+4*p_cpp[i*4])/6-XMAX/2)*sc , ((p_cpp[j*4+1]+p_cpp[k*4+1]+4*p_cpp[i*4+1])/6-YMAX/2)*sc, ((p_cpp[j*4+2]+p_cpp[k*4+2]+4*p_cpp[i*4+2])/6-ZMAX/2)*sc );
		glVertex3f( ((p_cpp[i*4]+p_cpp[j*4]+4*p_cpp[k*4])/6-XMAX/2)*sc , ((p_cpp[i*4+1]+p_cpp[j*4+1]+4*p_cpp[k*4+1])/6-YMAX/2)*sc, ((p_cpp[i*4+2]+p_cpp[j*4+2]+4*p_cpp[k*4+2])/6-ZMAX/2)*sc );
		glEnd();
	}/**/


	//glEnd();//???

	glLineWidth((GLfloat)1.0);

	glutSwapBuffers();
	helper->watch_report("graphics: \t\t%9.3f ms\n====================================\n");
	renderTime = helper->get_elapsedTime();
	totalTime += calculationTime + renderTime;
	calculateFPS();
}