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(); }
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(); }
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(); }
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 }
/** 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(); }
/** 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(); }