Ejemplo n.º 1
0
void ParamListGL::Render(int x, int y, bool shadow)
{
    beginWinCoords();
    start_x = x; start_y = y;

    for(std::vector<ParamBase *>::const_iterator p = m_params.begin(); p != m_params.end(); ++p)
    {
        if ((*p)->IsList())
        {
            ParamListGL *list = (ParamListGL *) (*p);
            list->Render(x+10, y);
            y += separation*list->GetSize();
        } 
        else 
        {
            if (p == m_current)
            {
                glColor3fv(text_col_selected);
            }
            else
            {
                glColor3fv(text_col_unselected);
            }

            if (shadow)
            {
                glPrintShadowed(x + text_x, y + font_h, (*p)->GetName()->c_str(), font, (p == m_current) ? text_col_selected : text_col_unselected);
                glPrintShadowed(x + value_x, y + font_h, (*p)->GetValueString().c_str(), font, (p == m_current) ? text_col_selected : text_col_unselected);
            }
            else 
            {
                glPrint(x + text_x, y + font_h, (*p)->GetName()->c_str(), font);
                glPrint(x + value_x, y + font_h, (*p)->GetValueString().c_str(), font);
            } 

            // glColor3fv((GLfloat *) &bar_col_outer);
            glBegin(GL_LINE_LOOP);
            glVertex2f((GLfloat)(x + bar_x)        , (GLfloat)(y + bar_offset));
            glVertex2f((GLfloat)(x + bar_x + bar_w), (GLfloat)(y + bar_offset));
            glVertex2f((GLfloat)(x + bar_x + bar_w), (GLfloat)(y + bar_offset + bar_h));
            glVertex2f((GLfloat)(x + bar_x)        , (GLfloat)(y + bar_offset + bar_h));
            glEnd();

            // glColor3fv((GLfloat *) &bar_col_inner);
            glRectf((GLfloat)(x + bar_x), (GLfloat)(y + bar_offset + bar_h), (GLfloat)(x + bar_x + (bar_w*(*p)->GetPercentage())), (GLfloat)(y + bar_offset));
            y += separation;
        }
    }

    endWinCoords();
}
Ejemplo n.º 2
0
void
ParamListGL::Render(int x, int y, bool shadow)
{
    beginWinCoords();

    m_start_x = x;
    m_start_y = y;

    for(std::vector<ParamBase *>::const_iterator p = m_params.begin(); p != m_params.end(); ++p) {
        if ((*p)->IsList()) {
            ParamListGL *list = (ParamListGL *) (*p);
            list->Render(x+10, y);
            y += m_separation*list->GetSize();

        } else {
            if (p == m_current)
                glColor3fv(&m_text_color_selected.r);
            else
                glColor3fv(&m_text_color_unselected.r);

            if (shadow) {
                glPrintShadowed(x + m_text_x, y + m_font_h, (*p)->GetName().c_str(), m_font, (p == m_current) ? &m_text_color_selected.r : &m_text_color_unselected.r);
                glPrintShadowed(x + m_value_x, y + m_font_h, (*p)->GetValueString().c_str(), m_font, (p == m_current) ? &m_text_color_selected.r : &m_text_color_unselected.r);
            } else {
                glPrint(x + m_text_x, y + m_font_h, (*p)->GetName().c_str(), m_font);
                glPrint(x + m_value_x, y + m_font_h, (*p)->GetValueString().c_str(), m_font);
            } 

            glColor3fv((GLfloat *) &m_bar_color_outer.r);
            glBegin(GL_LINE_LOOP);
            glVertex2f((GLfloat)(x + m_bar_x)          , (GLfloat)(y + m_bar_offset)          );
            glVertex2f((GLfloat)(x + m_bar_x + m_bar_w), (GLfloat)(y + m_bar_offset)          );
            glVertex2f((GLfloat)(x + m_bar_x + m_bar_w), (GLfloat)(y + m_bar_offset + m_bar_h));
            glVertex2f((GLfloat)(x + m_bar_x)          , (GLfloat)(y + m_bar_offset + m_bar_h));
            glEnd();

            glColor3fv((GLfloat *) &m_bar_color_inner.r);
            glRectf((GLfloat)(x + m_bar_x), (GLfloat)(y + m_bar_offset + m_bar_h), (GLfloat)(x + m_bar_x + ((m_bar_w-1)*(*p)->GetPercentage())), (GLfloat)(y + m_bar_offset + 1));

            y += m_separation;
        }

    }

    endWinCoords();
}
Ejemplo n.º 3
0
void display()
{
    static double gflops = 0;
    static double ifps = 0;
    static double interactionsPerSecond = 0;

    // update the simulation
    if (!bPause)
    {
        if (cycleDemo && (sdkGetTimerValue(&demoTimer) > demoTime))
        {
            activeDemo = (activeDemo + 1) % numDemos;
            selectDemo(activeDemo);
        }

        updateSimulation();

        if (!useCpu)
        {
            cudaEventRecord(hostMemSyncEvent, 0);    // insert an event to wait on before rendering
        }
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (displayEnabled)
    {
        // view transform
        {
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();

            for (int c = 0; c < 3; ++c)
            {
                camera_trans_lag[c] += (camera_trans[c] - camera_trans_lag[c]) * inertia;
                camera_rot_lag[c] += (camera_rot[c] - camera_rot_lag[c]) * inertia;
            }

            glTranslatef(camera_trans_lag[0], camera_trans_lag[1], camera_trans_lag[2]);
            glRotatef(camera_rot_lag[0], 1.0, 0.0, 0.0);
            glRotatef(camera_rot_lag[1], 0.0, 1.0, 0.0);
        }

        displayNBodySystem();

        // display user interface
        if (bShowSliders)
        {
            glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // invert color
            glEnable(GL_BLEND);
            paramlist->Render(0, 0);
            glDisable(GL_BLEND);
        }

        if (bFullscreen)
        {
            beginWinCoords();
            char msg0[256], msg1[256], msg2[256];

            if (bDispInteractions)
            {
                sprintf(msg1, "%0.2f billion interactions per second", interactionsPerSecond);
            }
            else
            {
                sprintf(msg1, "%0.2f GFLOP/s", gflops);
            }

            sprintf(msg0, "%s", deviceName);
            sprintf(msg2, "%0.2f FPS [%s | %d bodies]",
                    ifps, fp64 ? "double precision" : "single precision", numBodies);

            glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // invert color
            glEnable(GL_BLEND);
            glColor3f(0.46f, 0.73f, 0.0f);
            glPrint(80, glutGet(GLUT_WINDOW_HEIGHT) - 122, msg0, GLUT_BITMAP_TIMES_ROMAN_24);
            glColor3f(1.0f, 1.0f, 1.0f);
            glPrint(80, glutGet(GLUT_WINDOW_HEIGHT) - 96, msg2, GLUT_BITMAP_TIMES_ROMAN_24);
            glColor3f(1.0f, 1.0f, 1.0f);
            glPrint(80, glutGet(GLUT_WINDOW_HEIGHT) - 70, msg1, GLUT_BITMAP_TIMES_ROMAN_24);
            glDisable(GL_BLEND);

            endWinCoords();
        }

        glutSwapBuffers();
    }

    fpsCount++;

    // this displays the frame rate updated every second (independent of frame rate)
    if (fpsCount >= fpsLimit)
    {
        char fps[256];

        float milliseconds = 1;

        // stop timer
        if (useCpu)
        {
            milliseconds = sdkGetTimerValue(&timer);
            sdkResetTimer(&timer);
        }
        else
        {
            checkCudaErrors(cudaEventRecord(stopEvent, 0));
            checkCudaErrors(cudaEventSynchronize(stopEvent));
            checkCudaErrors(cudaEventElapsedTime(&milliseconds, startEvent, stopEvent));
        }

        milliseconds /= (float)fpsCount;
        computePerfStats(interactionsPerSecond, gflops, milliseconds, 1);

        ifps = 1.f / (milliseconds / 1000.f);
        sprintf(fps,
                "CUDA N-Body (%d bodies): "
                "%0.1f fps | %0.1f BIPS | %0.1f GFLOP/s | %s",
                numBodies, ifps, interactionsPerSecond, gflops,
                fp64 ? "double precision" : "single precision");

        glutSetWindowTitle(fps);
        fpsCount = 0;
        fpsLimit = (ifps > 1.f) ? (int)ifps : 1;

        if (bPause)
        {
            fpsLimit = 0;
        }

        // restart timer
        if (!useCpu)
        {
            checkCudaErrors(cudaEventRecord(startEvent, 0));
        }
    }

    glutReportErrors();
}
Ejemplo n.º 4
0
void ParticleRenderer::showProfileInfo(float& xOffset,float& yStart, float yIncr)
{
#ifndef BT_NO_PROFILE

	static double time_since_reset = 0.f;
//	if (!m_idle)
	{
		time_since_reset = CProfileManager::Get_Time_Since_Reset();
	}
  beginWinCoords();

	{
		//recompute profiling data, and store profile strings

		char blockTime[128];

		double totalTime = 0;

		int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset();

		m_profileIterator->First();

		double parent_time = m_profileIterator->Is_Root() ? time_since_reset : m_profileIterator->Get_Current_Parent_Total_Time();

		{
			sprintf(blockTime,"--- Profiling: %s (total running time: %.3f ms) ---",	m_profileIterator->Get_Current_Parent_Name(), parent_time );
			displayProfileString(xOffset,yStart,blockTime);
			yStart += yIncr;
			sprintf(blockTime,"press number (1,2...) to display child timings, or 0 to go up to parent" );
			displayProfileString(xOffset,yStart,blockTime);
			yStart += yIncr;

		}
		double accumulated_time = 0.f;

		for (int i = 0; !m_profileIterator->Is_Done(); m_profileIterator->Next())
		{
			double current_total_time = m_profileIterator->Get_Current_Total_Time();
			accumulated_time += current_total_time;
			double fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f;

			sprintf(blockTime,"%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)",
				++i, m_profileIterator->Get_Current_Name(), fraction,
				(current_total_time / (double)frames_since_reset),m_profileIterator->Get_Current_Total_Calls());
			displayProfileString(xOffset,yStart,blockTime);
			yStart += yIncr;
			totalTime += current_total_time;
		}

		sprintf(blockTime,"%s (%.3f %%) :: %.3f ms", "Unaccounted",
			// (min(0, time_since_reset - totalTime) / time_since_reset) * 100);
			parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time);

		displayProfileString(xOffset,yStart,blockTime);
		yStart += yIncr;
		sprintf(blockTime,"-------------------------------------------------");
		displayProfileString(xOffset,yStart,blockTime);
		yStart += yIncr;

	}
  endWinCoords();
#endif//BT_NO_PROFILE
}
Ejemplo n.º 5
0
/** Render addition test information
 */
inline void renderInfo(int x, int y)
{
	beginWinCoords();
	void * m_font = GLUT_BITMAP_8_BY_13;
	int i_shift = 0;
	if(showInfo){
		glColor3f (0.5F, 1.0F, 1.0F);
		sprintf(label,"Liquid particles: %d, elastic matter particles: %d, boundary particles: %d; total count: %d", localConfig->numOfLiquidP,
																													 localConfig->numOfElasticP,
																													 localConfig->numOfBoundaryP,localConfig->getParticleCount());
		glPrint( 0 , 2 , label, m_font);
		glColor3f (1.0F, 1.0F, 1.0F);
		if(load_from_file)
			sprintf(label,"Selected device: %s FPS = %.2f, time step: %d (%f s)", localConfig->getDeviceName(), fps, iteration, iteration * localConfig->getTimeStep() * localConfig->getLogStep());
		else
			sprintf(label,"Selected device: %s FPS = %.2f, time step: %d (%f s)", localConfig->getDeviceName(), fps, fluid_simulation->getIteration(),((float)fluid_simulation->getIteration())*localConfig->getTimeStep());
		glPrint( 0 , 17 , label, m_font);

		if(localConfig->isWormConfig()){
			i_shift = 0;
			sprintf(label,"MDR: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +0",
				muscle_activation_signal_cpp[ 0+i_shift],
				muscle_activation_signal_cpp[ 2+i_shift],
				muscle_activation_signal_cpp[ 4+i_shift],
				muscle_activation_signal_cpp[ 6+i_shift],
				muscle_activation_signal_cpp[ 8+i_shift],
				muscle_activation_signal_cpp[10+i_shift],
				muscle_activation_signal_cpp[12+i_shift],
				muscle_activation_signal_cpp[14+i_shift],
				muscle_activation_signal_cpp[16+i_shift],
				muscle_activation_signal_cpp[18+i_shift],
				muscle_activation_signal_cpp[20+i_shift],
				muscle_activation_signal_cpp[22+i_shift]);
			glPrint( 0 , 32 , label, m_font);
			sprintf(label,"MDR: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +0",
				muscle_activation_signal_cpp[ 1+i_shift],
				muscle_activation_signal_cpp[ 3+i_shift],
				muscle_activation_signal_cpp[ 5+i_shift],
				muscle_activation_signal_cpp[ 7+i_shift],
				muscle_activation_signal_cpp[ 9+i_shift],
				muscle_activation_signal_cpp[11+i_shift],
				muscle_activation_signal_cpp[13+i_shift],
				muscle_activation_signal_cpp[15+i_shift],
				muscle_activation_signal_cpp[17+i_shift],
				muscle_activation_signal_cpp[19+i_shift],
				muscle_activation_signal_cpp[21+i_shift],
				muscle_activation_signal_cpp[23+i_shift]);
			glPrint( 0 , 45 , label, m_font);

			i_shift = 24;
			sprintf(label,"MVR: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +24",
				muscle_activation_signal_cpp[ 0+i_shift],
				muscle_activation_signal_cpp[ 2+i_shift],
				muscle_activation_signal_cpp[ 4+i_shift],
				muscle_activation_signal_cpp[ 6+i_shift],
				muscle_activation_signal_cpp[ 8+i_shift],
				muscle_activation_signal_cpp[10+i_shift],
				muscle_activation_signal_cpp[12+i_shift],
				muscle_activation_signal_cpp[14+i_shift],
				muscle_activation_signal_cpp[16+i_shift],
				muscle_activation_signal_cpp[18+i_shift],
				muscle_activation_signal_cpp[20+i_shift],
				muscle_activation_signal_cpp[22+i_shift]);
			glPrint( 0 , 60 , label, m_font);
			sprintf(label,"MVR: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +24",
				muscle_activation_signal_cpp[ 1+i_shift],
				muscle_activation_signal_cpp[ 3+i_shift],
				muscle_activation_signal_cpp[ 5+i_shift],
				muscle_activation_signal_cpp[ 7+i_shift],
				muscle_activation_signal_cpp[ 9+i_shift],
				muscle_activation_signal_cpp[11+i_shift],
				muscle_activation_signal_cpp[13+i_shift],
				muscle_activation_signal_cpp[15+i_shift],
				muscle_activation_signal_cpp[17+i_shift],
				muscle_activation_signal_cpp[19+i_shift],
				muscle_activation_signal_cpp[21+i_shift],
				muscle_activation_signal_cpp[23+i_shift]);
			glPrint( 0 , 62+15 , label, m_font);

			i_shift = 24*2;
			sprintf(label,"MVL: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +48",
				muscle_activation_signal_cpp[ 0+i_shift],
				muscle_activation_signal_cpp[ 2+i_shift],
				muscle_activation_signal_cpp[ 4+i_shift],
				muscle_activation_signal_cpp[ 6+i_shift],
				muscle_activation_signal_cpp[ 8+i_shift],
				muscle_activation_signal_cpp[10+i_shift],
				muscle_activation_signal_cpp[12+i_shift],
				muscle_activation_signal_cpp[14+i_shift],
				muscle_activation_signal_cpp[16+i_shift],
				muscle_activation_signal_cpp[18+i_shift],
				muscle_activation_signal_cpp[20+i_shift],
				muscle_activation_signal_cpp[22+i_shift]);
			glPrint( 0 , 62 + 15 + 12 , label, m_font);
			sprintf(label,"MVL: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +48",
				muscle_activation_signal_cpp[ 1+i_shift],
				muscle_activation_signal_cpp[ 3+i_shift],
				muscle_activation_signal_cpp[ 5+i_shift],
				muscle_activation_signal_cpp[ 7+i_shift],
				muscle_activation_signal_cpp[ 9+i_shift],
				muscle_activation_signal_cpp[11+i_shift],
				muscle_activation_signal_cpp[13+i_shift],
				muscle_activation_signal_cpp[15+i_shift],
				muscle_activation_signal_cpp[17+i_shift],
				muscle_activation_signal_cpp[19+i_shift],
				muscle_activation_signal_cpp[21+i_shift],
				muscle_activation_signal_cpp[23+i_shift]);
			glPrint( 0 , 91 + 15 , label, m_font);

			i_shift = 24*3;
			sprintf(label,"MDL: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +72",
				muscle_activation_signal_cpp[ 0+i_shift],
				muscle_activation_signal_cpp[ 2+i_shift],
				muscle_activation_signal_cpp[ 4+i_shift],
				muscle_activation_signal_cpp[ 6+i_shift],
				muscle_activation_signal_cpp[ 8+i_shift],
				muscle_activation_signal_cpp[10+i_shift],
				muscle_activation_signal_cpp[12+i_shift],
				muscle_activation_signal_cpp[14+i_shift],
				muscle_activation_signal_cpp[16+i_shift],
				muscle_activation_signal_cpp[18+i_shift],
				muscle_activation_signal_cpp[20+i_shift],
				muscle_activation_signal_cpp[22+i_shift]);
			glPrint( 0 , 91 + 15 + 12 , label, m_font);
			sprintf(label,"MDL: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +72",
				muscle_activation_signal_cpp[ 1+i_shift],
				muscle_activation_signal_cpp[ 3+i_shift],
				muscle_activation_signal_cpp[ 5+i_shift],
				muscle_activation_signal_cpp[ 7+i_shift],
				muscle_activation_signal_cpp[ 9+i_shift],
				muscle_activation_signal_cpp[11+i_shift],
				muscle_activation_signal_cpp[13+i_shift],
				muscle_activation_signal_cpp[15+i_shift],
				muscle_activation_signal_cpp[17+i_shift],
				muscle_activation_signal_cpp[19+i_shift],
				muscle_activation_signal_cpp[21+i_shift],
				muscle_activation_signal_cpp[23+i_shift]);
			glPrint( 0 , 119+15 , label, m_font);
		}
	}
	endWinCoords();
}
Ejemplo n.º 6
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 renderInfo(int x, int y)
{
	beginWinCoords();
	int y_m = y;
	int i_shift = 0;
	if(showInfo){
		glColor3f (0.5F, 1.0F, 1.0F);
		sprintf(label,"Liquid particles: %d, elastic matter particles: %d, boundary particles: %d; total count: %d", numOfLiquidP,
																													 numOfElasticP,
																													 numOfBoundaryP,PARTICLE_COUNT); 
		glPrint( 0 , 2 , label, m_font);
		glColor3f (1.0F, 1.0F, 1.0F); 
		sprintf(label,"Selected device: %s FPS = %.2f, time step: %d (%f s)", device_full_name+7, fps, iterationCount,((float)iterationCount)*timeStep); 
		glPrint( 0 , 17 , label, m_font);


		sprintf(label,"Muscle activation signals:          // demo: use keys '1' to '9' to activate/deactivate first nine muscles in array ");
//		glRasterPos2f (0.01F, 0.05F); 
		glPrint( 0 , 32 , label, m_font);

		i_shift = 0;
		sprintf(label,"MDR: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +0",
			muscle_activation_signal_cpp[ 0+i_shift],
			muscle_activation_signal_cpp[ 2+i_shift],
			muscle_activation_signal_cpp[ 4+i_shift],
			muscle_activation_signal_cpp[ 6+i_shift],
			muscle_activation_signal_cpp[ 8+i_shift],
			muscle_activation_signal_cpp[10+i_shift],
			muscle_activation_signal_cpp[12+i_shift],
			muscle_activation_signal_cpp[14+i_shift],
			muscle_activation_signal_cpp[16+i_shift],
			muscle_activation_signal_cpp[18+i_shift],
			muscle_activation_signal_cpp[20+i_shift],
			muscle_activation_signal_cpp[22+i_shift]); 
		glPrint( 0 , 45 , label, m_font);
		sprintf(label,"MDR: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +0",
			muscle_activation_signal_cpp[ 1+i_shift],
			muscle_activation_signal_cpp[ 3+i_shift],
			muscle_activation_signal_cpp[ 5+i_shift],
			muscle_activation_signal_cpp[ 7+i_shift],
			muscle_activation_signal_cpp[ 9+i_shift],
			muscle_activation_signal_cpp[11+i_shift],
			muscle_activation_signal_cpp[13+i_shift],
			muscle_activation_signal_cpp[15+i_shift],
			muscle_activation_signal_cpp[17+i_shift],
			muscle_activation_signal_cpp[19+i_shift],
			muscle_activation_signal_cpp[21+i_shift],
			muscle_activation_signal_cpp[23+i_shift]);
		glPrint( 0 , 60 , label, m_font);

		i_shift = 24;
		sprintf(label,"MVR: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +24",
			muscle_activation_signal_cpp[ 0+i_shift],
			muscle_activation_signal_cpp[ 2+i_shift],
			muscle_activation_signal_cpp[ 4+i_shift],
			muscle_activation_signal_cpp[ 6+i_shift],
			muscle_activation_signal_cpp[ 8+i_shift],
			muscle_activation_signal_cpp[10+i_shift],
			muscle_activation_signal_cpp[12+i_shift],
			muscle_activation_signal_cpp[14+i_shift],
			muscle_activation_signal_cpp[16+i_shift],
			muscle_activation_signal_cpp[18+i_shift],
			muscle_activation_signal_cpp[20+i_shift],
			muscle_activation_signal_cpp[22+i_shift]); 
		glPrint( 0 , 62+15 , label, m_font);
		sprintf(label,"MVR: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +24",
			muscle_activation_signal_cpp[ 1+i_shift],
			muscle_activation_signal_cpp[ 3+i_shift],
			muscle_activation_signal_cpp[ 5+i_shift],
			muscle_activation_signal_cpp[ 7+i_shift],
			muscle_activation_signal_cpp[ 9+i_shift],
			muscle_activation_signal_cpp[11+i_shift],
			muscle_activation_signal_cpp[13+i_shift],
			muscle_activation_signal_cpp[15+i_shift],
			muscle_activation_signal_cpp[17+i_shift],
			muscle_activation_signal_cpp[19+i_shift],
			muscle_activation_signal_cpp[21+i_shift],
			muscle_activation_signal_cpp[23+i_shift]);
		glPrint( 0 , 62+15+12 , label, m_font);
		
		i_shift = 24*2;
		sprintf(label,"MVL: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +48",
			muscle_activation_signal_cpp[ 0+i_shift],
			muscle_activation_signal_cpp[ 2+i_shift],
			muscle_activation_signal_cpp[ 4+i_shift],
			muscle_activation_signal_cpp[ 6+i_shift],
			muscle_activation_signal_cpp[ 8+i_shift],
			muscle_activation_signal_cpp[10+i_shift],
			muscle_activation_signal_cpp[12+i_shift],
			muscle_activation_signal_cpp[14+i_shift],
			muscle_activation_signal_cpp[16+i_shift],
			muscle_activation_signal_cpp[18+i_shift],
			muscle_activation_signal_cpp[20+i_shift],
			muscle_activation_signal_cpp[22+i_shift]); 
		glPrint( 0 , 91+15 , label, m_font);
		sprintf(label,"MVL: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +48",
			muscle_activation_signal_cpp[ 1+i_shift],
			muscle_activation_signal_cpp[ 3+i_shift],
			muscle_activation_signal_cpp[ 5+i_shift],
			muscle_activation_signal_cpp[ 7+i_shift],
			muscle_activation_signal_cpp[ 9+i_shift],
			muscle_activation_signal_cpp[11+i_shift],
			muscle_activation_signal_cpp[13+i_shift],
			muscle_activation_signal_cpp[15+i_shift],
			muscle_activation_signal_cpp[17+i_shift],
			muscle_activation_signal_cpp[19+i_shift],
			muscle_activation_signal_cpp[21+i_shift],
			muscle_activation_signal_cpp[23+i_shift]);
		glPrint( 0 , 91+15+12 , label, m_font);

		i_shift = 24*3;
		sprintf(label,"MDL: %.2f[01] %.2f[03] %.2f[05] %.2f[07] %.2f[09] %.2f[11] %.2f[13] %.2f[15] %.2f[17] %.2f[19] %.2f[21] %.2f[23] indexes: +72",
			muscle_activation_signal_cpp[ 0+i_shift],
			muscle_activation_signal_cpp[ 2+i_shift],
			muscle_activation_signal_cpp[ 4+i_shift],
			muscle_activation_signal_cpp[ 6+i_shift],
			muscle_activation_signal_cpp[ 8+i_shift],
			muscle_activation_signal_cpp[10+i_shift],
			muscle_activation_signal_cpp[12+i_shift],
			muscle_activation_signal_cpp[14+i_shift],
			muscle_activation_signal_cpp[16+i_shift],
			muscle_activation_signal_cpp[18+i_shift],
			muscle_activation_signal_cpp[20+i_shift],
			muscle_activation_signal_cpp[22+i_shift]); 
		glPrint( 0 , 119+15 , label, m_font);
		sprintf(label,"MDL: %.2f[02] %.2f[04] %.2f[06] %.2f[08] %.2f[10] %.2f[12] %.2f[14] %.2f[16] %.2f[18] %.2f[20] %.2f[22] %.2f[24] indexes: +72",
			muscle_activation_signal_cpp[ 1+i_shift],
			muscle_activation_signal_cpp[ 3+i_shift],
			muscle_activation_signal_cpp[ 5+i_shift],
			muscle_activation_signal_cpp[ 7+i_shift],
			muscle_activation_signal_cpp[ 9+i_shift],
			muscle_activation_signal_cpp[11+i_shift],
			muscle_activation_signal_cpp[13+i_shift],
			muscle_activation_signal_cpp[15+i_shift],
			muscle_activation_signal_cpp[17+i_shift],
			muscle_activation_signal_cpp[19+i_shift],
			muscle_activation_signal_cpp[21+i_shift],
			muscle_activation_signal_cpp[23+i_shift]);
		glPrint( 0 , 119+15+12 , label, m_font);

		y_m = 40;
	}
	if(showRuler){
		glColor3ub(255, 0, 0);
		float s_v = 1 * sc_scale * (1 /( accuracy * simulationScale));
		float s_v_10 = s_v / 10;
		std::stringstream ss;
		std::string s;
		glBegin(GL_LINES);
			glColor3f(1.0f,0.0f,0.0f);
			glVertex2f((GLfloat) 0.f,(GLfloat)y_m );
			glVertex2f((GLfloat) s_v,(GLfloat)y_m );
			glVertex2f((GLfloat) s_v,(GLfloat)y_m );
			glVertex2f((GLfloat) s_v,(GLfloat)y_m + 5.f );
		glEnd();
			glPrint( s_v , y_m + 15.f , "1E-02 m", m_font);
		glBegin(GL_LINES);		
			glVertex2f((GLfloat) s_v_10,(GLfloat)y_m + 0.f);
			glVertex2f((GLfloat) s_v_10,(GLfloat)y_m + 5.f);
		glEnd();
		if( 8 * s_v/pow(10.f,count_s) >= glutGet(GLUT_WINDOW_WIDTH)/2 ){
			count_s++;
			flag = true;
		}else{
			if(count_s != 0 && 8 * s_v/pow(10.f,count_s - 1) < glutGet(GLUT_WINDOW_WIDTH)/2){
				//flag = false;
				count_s--;
			}
		}
		if(flag){
			for(int i = 1;i <= count_s; i++){
				glBegin(GL_LINES);		
					glVertex2f((GLfloat) s_v/pow(10.f,i + 1),(GLfloat)y_m + 0.f);
					glVertex2f((GLfloat) s_v/pow(10.f,i + 1),(GLfloat)y_m + 5.f);
				glEnd();
				ss << i + 1 + 2;
				s = "1E-" + ss.str() + "m";
				ss.str("");
				glPrint( s_v/pow(10.f,i + 1) , y_m + 15.f , s.c_str(), m_font);
			}
		}
	}
	endWinCoords();
}
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();
}