//Callback de desenho da GLUT, nela é chamada a rotina que chama o passo da simulação void SimulationLoop() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //Chama a rotina que chama o passo da simulação RunBox2D(); //Define a cor dos objetos como vermelha b2Color color; color.r = 1.0; color.g = 0.0; color.b = 0.0; //Desenha os objetos b2Body *b; for(b = world->GetBodyList(); b; b=b->GetNext()) { DrawFixture(b->GetFixtureList(),color); } color.r = 1.0; color.g = 0.0; color.b = 1.0; if (distanceJoint) DrawJoint(distanceJoint,color); if (revoluteJoint1) DrawJoint(revoluteJoint1, color); if (revoluteJoint2) DrawJoint(revoluteJoint2, color); if (pJoint) DrawJoint(pJoint,color); if (gearJoint) DrawJoint(gearJoint,color); if (wheelJoint1) DrawJoint(wheelJoint1,color); if (wheelJoint2) DrawJoint(wheelJoint2,color); if (pulleyJoint) //Pulley joint { b2Vec2 anchor1 = pulleyJoint->GetAnchorA(); b2Vec2 anchor2 = pulleyJoint->GetAnchorB(); b2Vec2 ground1 = pulleyJoint->GetGroundAnchorA(); b2Vec2 ground2 = pulleyJoint->GetGroundAnchorB(); glBegin(GL_LINES); glVertex2f(anchor1.x,anchor1.y); glVertex2f(ground1.x,ground1.y); glVertex2f(anchor2.x,anchor2.y); glVertex2f(ground2.x,ground2.y); glVertex2f(ground1.x,ground1.y); glVertex2f(ground2.x,ground2.y); glEnd(); } //Desenha as forças aplicadas DesenhaForcasAplicadas(); //Desenhando o ponto de picking do mouse glPointSize(5); glBegin(GL_POINTS); glVertex2f(mouseWorld.x,mouseWorld.y); glEnd(); glPointSize(1); if(desenhaLinhaGuia == true) DesenhaLinhaGuia(); ostringstream aux1; //incluir sstream aux1 << "Comandos: r, R, p, P, g, w, t"; renderer.DrawString(10,20,aux1.str().c_str()); glutSwapBuffers(); }
//Callback de desenho da GLUT, nela é chamada a rotina que chama o passo da simulação void SimulationLoop() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //Chama a rotina que chama o passo da simulação RunBox2D(); //Define a cor do texto como preta b2Color color; color.r = 0.0; color.g = 0.0; color.b = 0.0; //Imprimindo dados da simulação int32 bodyCount = world->GetBodyCount(); int32 contactCount = world->GetContactCount(); int32 jointCount = world->GetJointCount(); renderer.DrawString(5, 15, color,"corpos/contatos/juntas = %d/%d/%d", bodyCount, contactCount, jointCount); renderer.DrawString(5, 30, color,"birds/pigs = %d/%d", birds.size(), pigs.size()-deadPigsCount); //Define a cor dos objetos como vermelha color.r = 1.0; color.g = 0.0; color.b = 0.0; b2Body *b; for(b = world->GetBodyList(); b; b=b->GetNext()){ renderer.DrawFixture(b->GetFixtureList(),color); } //Desenha o fundo EnableTextureInOpenGL(textures[2]); //a textura do fundo está na posição 2 DrawSprite(80,0,0,0,0); //Desenha os passarinhos color.r = 0.0; color.g = 1.0; color.b = 1.0; EnableTextureInOpenGL(textures[1]); //a textura do passaro está na posição 1 for (int i=0; i<birds.size(); i++) DrawShape(birds[i]->GetFixtureList(),color); //Desenha os pigs color.r = 0.0; color.g = 0.8; color.b = 0.0; EnableTextureInOpenGL(textures[0]); //a textura do passaro está na posição 0 for (int i=0; i<pigs.size(); i++) { if (pigs[i] != NULL) DrawShape(pigs[i]->GetFixtureList(),color); } //Desenhando o ponto de picking do mouse glPointSize(5); glBegin(GL_POINTS); glVertex2f(mouseWorld.x,mouseWorld.y); glEnd(); glPointSize(1); DesenhaLinhaGuia(); //Para desenhar os pontos de contatos color.r = 1.0; color.g = 0.0; color.b = 1.0; b2Contact * contact = world->GetContactList(); for (int i=0; i<world->GetContactCount(); i++) { b2WorldManifold worldManifold; contact->GetWorldManifold(&worldManifold); b2Vec2 p = worldManifold.points[0]; renderer.DrawPoint(p, 4, color); contact = contact->GetNext(); } //Depois de percorrer a lista de contatos, destruir os corpos dos pigs mortos for(int i=0; i < pigsToDieIndexes.size(); i++) { int pigIndex = pigsToDieIndexes[i]; if (pigs[pigIndex] != NULL) //desse jeito que eu fiz pode acontecer isso { world->DestroyBody(pigs[pigIndex]); pigs[pigIndex] = NULL; deadPigsCount++; } } glutSwapBuffers(); //O glutPostRedisplay() está sendo dada na rotina de callback de timer!! }