void FractureDemo::showMessage() { if((getDebugMode() & btIDebugDraw::DBG_DrawText)) { setOrthographicProjection(); glDisable(GL_LIGHTING); glColor3f(0, 0, 0); char buf[124]; int lineWidth=380; int xStart = m_glutScreenWidth - lineWidth; int yStart = 20; btFractureDynamicsWorld* world = (btFractureDynamicsWorld*)m_dynamicsWorld; if (world->getFractureMode()) { sprintf(buf,"Fracture mode"); } else { sprintf(buf,"Glue mode"); } GLDebugDrawString(xStart,yStart,buf); sprintf(buf,"f to toggle fracture/glue mode"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); sprintf(buf,"space to restart, mouse to pick/shoot"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); resetPerspectiveProjection(); glEnable(GL_LIGHTING); } }
//to be implemented by the demo void ForkLiftDemo::renderme() { updateCamera(); btScalar m[16]; int i; btVector3 wheelColor(1,0,0); btVector3 worldBoundsMin,worldBoundsMax; getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); for (i=0;i<m_vehicle->getNumWheels();i++) { //synchronize the wheels with the (interpolated) chassis worldtransform m_vehicle->updateWheelTransform(i,true); //draw wheels (cylinders) m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); m_shapeDrawer->drawOpenGL(m,m_wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); } int lineWidth=250; int xStart = m_glutScreenWidth - lineWidth; int yStart = 20; if((getDebugMode() & btIDebugDraw::DBG_NoHelpText)==0) { setOrthographicProjection(); glDisable(GL_LIGHTING); glColor3f(0, 0, 0); char buf[124]; glRasterPos3f(xStart, yStart, 0); sprintf(buf,"SHIFT+Cursor Left/Right - rotate lift"); GLDebugDrawString(xStart,20,buf); yStart+=20; glRasterPos3f(xStart, yStart, 0); sprintf(buf,"SHIFT+Cursor UP/Down - move fork up/down"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); glRasterPos3f(xStart, yStart, 0); sprintf(buf,"F5 - toggle camera mode"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); glRasterPos3f(xStart, yStart, 0); sprintf(buf,"Click inside this window for keyboard focus"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); resetPerspectiveProjection(); glEnable(GL_LIGHTING); } DemoApplication::renderme(); }
void ParticlesDemo::outputDebugInfo(int & xOffset,int & yStart, int yIncr) { char buf[124]; glDisable(GL_LIGHTING); glColor3f(0, 0, 0); sprintf(buf,"mouse move+buttons to interact"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"space to reset"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"cursor keys and z,x to navigate"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"i to toggle simulation, s single step"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"q to quit"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"h to toggle help text"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"p to toggle profiling (+results to file)"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"j to toggle between demos (integration/OECake2D/OECake3D)"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; { sprintf(buf,"G to draw broadphase grid"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"D and U to toggle between GPU and CPU"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; } }
void CcdPhysicsDemo::displayText() { #ifndef __QNX__ int lineWidth=440; int xStart = m_glutScreenWidth - lineWidth; int yStart = 20; if((getDebugMode() & btIDebugDraw::DBG_DrawText)!=0) { setOrthographicProjection(); glDisable(GL_LIGHTING); glColor3f(0, 0, 0); char buf[124]; glRasterPos3f(xStart, yStart, 0); switch (m_ccdMode) { case USE_CCD: { sprintf(buf,"Predictive contacts and motion clamping"); break; } case USE_NO_CCD: { sprintf(buf,"CCD handling disabled"); break; } default: { sprintf(buf,"unknown CCD setting"); }; }; GLDebugDrawString(xStart,20,buf); glRasterPos3f(xStart, yStart, 0); sprintf(buf,"Press 'p' to change CCD mode"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); glRasterPos3f(xStart, yStart, 0); sprintf(buf,"Press '.' or right mouse to shoot bullets"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); glRasterPos3f(xStart, yStart, 0); sprintf(buf,"space to restart, h(elp), t(ext), w(ire)"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); resetPerspectiveProjection(); glEnable(GL_LIGHTING); } #endif }
void GL_TextControl::draw(int& parentHorPos,int& parentVertPos,btScalar deltaTime) { for (int i=0;i<m_textLines.size();i++) { GLDebugDrawString(parentHorPos,parentVertPos,m_textLines[i]); parentVertPos+=20; } }
virtual void clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float xOffset = 10.f; float yStart = 20.f; float yIncr = 20.f; char buf[124]; glColor3f(0, 0, 0); setOrthographicProjection(); glRasterPos3f(xOffset,yStart,0); sprintf(buf,"gNumAlignedAllocs= %d",gNumAlignedAllocs); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"gNumAlignedFree= %d",gNumAlignedFree); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"# alloc-free = %d",gNumAlignedAllocs-gNumAlignedFree); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; #ifdef BT_DEBUG_MEMORY_ALLOCATIONS glRasterPos3f(xOffset,yStart,0); sprintf(buf,"gTotalBytesAlignedAllocs = %d",gTotalBytesAlignedAllocs); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; #endif //BT_DEBUG_MEMORY_ALLOCATIONS glFlush(); glutSwapBuffers(); }
void BasicDemo3D::DrawConstraintInfo() { char buf[32]; float xOffs = m_glutScreenWidth - 50; float yOffs = 30; glColor4f(1, 1, 1,1); glDisable(GL_LIGHTING); glRasterPos3f(xOffs-40.f, yOffs, 0); sprintf(buf,"solver %2d on %s", gUseSolver2 ? 2 : 1, gUseCPUSolver ? "CPU" : "CUDA"); GLDebugDrawString(xOffs-140.f, yOffs,buf); yOffs += 15.f; btCudaDemoDynamicsWorld3D* cddw = (btCudaDemoDynamicsWorld3D*)m_dynamicsWorld; for(int i = 0; i < CUDA_DEMO_DYNAMICS_WORLD3D_MAX_BATCHES; i++) { const float* pCol = cBatchColorTab + i * 3; glColor3f(pCol[0], pCol[1], pCol[2]); glRasterPos3f(xOffs, yOffs, 0); sprintf(buf,"%2d : %5d", i, cddw->m_numInBatches[i]); GLDebugDrawString(xOffs-80, yOffs,buf); yOffs += 15.f; } }
void BasicDemo::DrawConstraintInfo() { int fontW = 10; // hack, could be changed int fontH = 14; // hack, could be changed char buf[32]; float xOffs; float yOffs = fontH * 2; glDisable(GL_LIGHTING); glColor3f(1, 1, 1); sprintf(buf,"solver on %s", gUseCPUSolver ? "CPU" : "OpenCL"); xOffs = m_glutScreenWidth - (strlen(buf) + 1) * fontW; GLDebugDrawString(xOffs, yOffs,buf); yOffs += fontH; btGpuDemoDynamicsWorld* cddw = (btGpuDemoDynamicsWorld*)m_dynamicsWorld; for(int i = 0; i < CUDA_DEMO_DYNAMICS_WORLD_MAX_BATCHES; i++) { const float* pCol = cBatchColorTab + i * 3; glColor3f(pCol[0], pCol[1], pCol[2]); sprintf(buf,"%2d : %5d", i, cddw->m_numInBatches[i]); xOffs = m_glutScreenWidth - (strlen(buf) + 1) * fontW; GLDebugDrawString(xOffs, yOffs,buf); yOffs += fontH; } }
void VoronoiFractureDemo::renderme() { DemoApplication::renderme(); char buf[124]; int lineWidth = 200; int xStart = m_glutScreenWidth - lineWidth; if (useMpr) { sprintf(buf, "Using GJK+MPR"); } else { sprintf(buf, "Using GJK+EPA"); } GLDebugDrawString(xStart, 20, buf); }
void BasicDemo3D::outputDebugInfo(int & xOffset,int & yStart, int yIncr) { char buf[124]; glDisable(GL_LIGHTING); glColor3f(0, 0, 0); glRasterPos3f(xOffset,yStart,0); sprintf(buf,"mouse to interact"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"space to reset"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"cursor keys and z,x to navigate"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"i to toggle simulation, s single step"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"q to quit"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"h to toggle help text"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"p to toggle profiling (+results to file)"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"w to toggle wireframe/solid rendering"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"c to toggle constraint drawing"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"b to draw single constraint batch"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"u to toggle between CPU and CUDA solvers"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"d to toggle between different batch builders"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"m to toggle between CUDA / CPU motion integrators"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; if (getDynamicsWorld()) { glRasterPos3f(xOffset,yStart,0); sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"# skipped collisions=%d",gSkippedCol); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"# processed collisions=%d",gProcessedCol); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); btScalar fract = (gProcessedCol+gSkippedCol)? btScalar(gSkippedCol)/(gProcessedCol+gSkippedCol) : 0.f; sprintf(buf,"culled narrowphase collisions=%f",fract); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; gProcessedCol = 0; gSkippedCol = 0; } } // BasicDemo3D::outputDebugInfo()
void GL_DialogWindow::draw(btScalar deltaTime) { if (!m_screenWidth || !m_screenHeight) return; m_dialogHorPos = int(m_collisionObject->getWorldTransform().getOrigin()[0]+m_screenWidth/2.f-m_dialogWidth/2.f); m_dialogVertPos = int(m_collisionObject->getWorldTransform().getOrigin()[1]+m_screenHeight/2.f-m_dialogHeight/2.f); saveOpenGLState(); //drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth,m_dialogVertPos+m_dialogHeight,0xa6000000); unsigned int argbColor = 0x86000000; int charHeight = 16; int charWidth = 10; int titleHeight = charHeight + 2; drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+titleHeight,argbColor,argbColor,argbColor,argbColor); //const unsigned int COL0 = 0x50ffffff; const unsigned int COL0 = 0xffffffff; const unsigned int COL1 = 0xff1f1f1f; drawRect(m_dialogHorPos,m_dialogVertPos,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+1,COL0,COL0,COL1,COL1); argbColor = 0x864f4f4f; drawRect(m_dialogHorPos+1,m_dialogVertPos+titleHeight,m_dialogHorPos+m_dialogWidth-1,m_dialogVertPos+m_dialogHeight,argbColor,argbColor,argbColor,argbColor); int y = m_dialogVertPos+charHeight+1; glLineWidth(3); drawLine(m_dialogHorPos, y, m_dialogHorPos+m_dialogWidth-1, y, 0x80afafaf,0x80afafaf); unsigned int clight = 0x5FFFFFFF; // bar contour drawLine(m_dialogHorPos, m_dialogVertPos, m_dialogHorPos, m_dialogVertPos+m_dialogHeight, clight,clight); drawLine(m_dialogHorPos, m_dialogVertPos, m_dialogHorPos+m_dialogWidth, m_dialogVertPos, clight,clight); drawLine(m_dialogHorPos+m_dialogWidth, m_dialogVertPos, m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, clight,clight); drawLine(m_dialogHorPos, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, clight,clight); int dshad = 3; // bar shadows unsigned int cshad = (((0x40000000>>24)/2)<<24) & 0xFF000000; drawRect(m_dialogHorPos, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+dshad, m_dialogVertPos+m_dialogHeight+dshad, 0, cshad, 0, 0); drawRect(m_dialogHorPos+dshad+1, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth-1, m_dialogVertPos+m_dialogHeight+dshad, cshad, cshad, 0, 0); drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos+m_dialogHeight, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+m_dialogHeight+dshad, cshad, 0, 0, 0); drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+dshad, 0, 0, cshad, 0); drawRect(m_dialogHorPos+m_dialogWidth, m_dialogVertPos+dshad+1, m_dialogHorPos+m_dialogWidth+dshad, m_dialogVertPos+m_dialogHeight-1, cshad, 0, cshad, 0); int yInc = 16; int curHorPos = m_dialogHorPos+5; int curVertPos = m_dialogVertPos; curVertPos += yInc; GLDebugDrawString(m_dialogHorPos+m_dialogWidth/2-((int(strlen(m_dialogTitle)/2))*charWidth),m_dialogVertPos+yInc ,m_dialogTitle); curVertPos += 20; for (int i=0;i<m_controls.size();i++) { m_controls[i]->draw(curHorPos,curVertPos,deltaTime); } restoreOpenGLState(); }
//to be implemented by the demo void Hinge2Vehicle::renderScene() { m_guiHelper->syncPhysicsToGraphics(m_dynamicsWorld); #if 0 for (int i=0;i<m_vehicle->getNumWheels();i++) { //synchronize the wheels with the (interpolated) chassis worldtransform m_vehicle->updateWheelTransform(i,true); CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); if (renderer) { btTransform tr = m_vehicle->getWheelInfo(i).m_worldTransform; btVector3 pos=tr.getOrigin(); btQuaternion orn = tr.getRotation(); renderer->writeSingleInstanceTransformToCPU(pos,orn,m_wheelInstances[i]); } } #endif m_guiHelper->render(m_dynamicsWorld); btVector3 wheelColor(1,0,0); btVector3 worldBoundsMin,worldBoundsMax; getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); #if 0 int lineWidth=400; int xStart = m_glutScreenWidth - lineWidth; int yStart = 20; if((getDebugMode() & btIDebugDraw::DBG_NoHelpText)==0) { setOrthographicProjection(); glDisable(GL_LIGHTING); glColor3f(0, 0, 0); char buf[124]; sprintf(buf,"SHIFT+Cursor Left/Right - rotate lift"); GLDebugDrawString(xStart,20,buf); yStart+=20; sprintf(buf,"SHIFT+Cursor UP/Down - fork up/down"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); if (m_useDefaultCamera) { sprintf(buf,"F5 - camera mode (free)"); } else { sprintf(buf,"F5 - camera mode (follow)"); } yStart+=20; GLDebugDrawString(xStart,yStart,buf); yStart+=20; if (m_dynamicsWorld->getConstraintSolver()->getSolverType()==BT_MLCP_SOLVER) { sprintf(buf,"F6 - solver (direct MLCP)"); } else { sprintf(buf,"F6 - solver (sequential impulse)"); } GLDebugDrawString(xStart,yStart,buf); btDiscreteDynamicsWorld* world = (btDiscreteDynamicsWorld*) m_dynamicsWorld; if (world->getLatencyMotionStateInterpolation()) { sprintf(buf,"F7 - motionstate interpolation (on)"); } else { sprintf(buf,"F7 - motionstate interpolation (off)"); } yStart+=20; GLDebugDrawString(xStart,yStart,buf); sprintf(buf,"Click window for keyboard focus"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); resetPerspectiveProjection(); glEnable(GL_LIGHTING); } #endif }
//------------------------------------------------------------------------------ void GimpactConcaveDemo::renderme() { updateCamera(); btScalar m[16]; if (m_dynamicsWorld) { btVector3 worldBoundsMin,worldBoundsMax; getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); int numObjects = m_dynamicsWorld->getNumCollisionObjects(); btVector3 wireColor(1,0,0); for (int i=0;i<numObjects;i++) { btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[i]; btRigidBody* body = btRigidBody::upcast(colObj); if (body && body->getMotionState()) { btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m); } else { colObj->getWorldTransform().getOpenGLMatrix(m); } btVector3 wireColor(1.f,1.0f,0.5f); //wants deactivation if (i & 1) { wireColor = btVector3(0.f,0.0f,1.f); } ///color differently for active, sleeping, wantsdeactivation states if (colObj->getActivationState() == 1) //active { if (i & 1) { wireColor += btVector3 (0.8f,0.1f,0.1f); } else { wireColor += btVector3 (0.5f,0.f,0.f); } } if (colObj->getActivationState() == 2) //ISLAND_SLEEPING { if (i & 1) { wireColor += btVector3 (0.5f,0.8f, 0.5f); } else { wireColor += btVector3 (0.f,0.5f,0.f); } } m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); } float xOffset = 10.f; float yStart = 20.f; float yIncr = 20.f; char buf[124]; glColor3f(0, 0, 0); setOrthographicProjection(); glRasterPos3f(xOffset,yStart,0); sprintf(buf,"mouse to interact"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; /* glRasterPos3f(xOffset,yStart,0); sprintf(buf,"space to reset"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; */ glRasterPos3f(xOffset,yStart,0); sprintf(buf,"cursor keys and z,x to navigate"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"i to toggle simulation, s single step"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"q to quit"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,". to shoot TRIMESH (dot)"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; // not yet hooked up again after refactoring... /* glRasterPos3f(xOffset,yStart,0); sprintf(buf,"d to toggle deactivation"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; */ /* glRasterPos3f(xOffset,yStart,0); sprintf(buf,"a to draw temporal AABBs"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; */ glRasterPos3f(xOffset,yStart,0); sprintf(buf,"h to toggle help text"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; //bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); bool useCCD = ((getDebugMode() & btIDebugDraw::DBG_EnableCCD) != 0); glRasterPos3f(xOffset,yStart,0); sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; #ifdef SHOW_NUM_DEEP_PENETRATIONS glRasterPos3f(xOffset,yStart,0); sprintf(buf,"gNumDeepPenetrationChecks = %d",gNumDeepPenetrationChecks); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"gNumSplitImpulseRecoveries= %d",gNumSplitImpulseRecoveries); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"gNumGjkChecks= %d",gNumGjkChecks); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; #endif //SHOW_NUM_DEEP_PENETRATIONS resetPerspectiveProjection(); } }
void DemoApplication::renderme() { myinit(); updateCamera(); if (m_dynamicsWorld) { if(m_enableshadows) { glClear(GL_STENCIL_BUFFER_BIT); glEnable(GL_CULL_FACE); renderscene(0); glDisable(GL_LIGHTING); glDepthMask(GL_FALSE); glDepthFunc(GL_LEQUAL); glEnable(GL_STENCIL_TEST); glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); glStencilFunc(GL_ALWAYS,1,0xFFFFFFFFL); glFrontFace(GL_CCW); glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); renderscene(1); glFrontFace(GL_CW); glStencilOp(GL_KEEP,GL_KEEP,GL_DECR); renderscene(1); glFrontFace(GL_CCW); glPolygonMode(GL_FRONT,GL_FILL); glPolygonMode(GL_BACK,GL_FILL); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_LIGHTING); glDepthMask(GL_TRUE); glCullFace(GL_BACK); glFrontFace(GL_CCW); glEnable(GL_CULL_FACE); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); glDepthFunc(GL_LEQUAL); glStencilFunc( GL_NOTEQUAL, 0, 0xFFFFFFFFL ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); glDisable(GL_LIGHTING); renderscene(2); glEnable(GL_LIGHTING); glDepthFunc(GL_LESS); glDisable(GL_STENCIL_TEST); glDisable(GL_CULL_FACE); } else { glDisable(GL_CULL_FACE); renderscene(0); } int xOffset = 10; int yStart = 20; int yIncr = 20; glDisable(GL_LIGHTING); glColor3f(0, 0, 0); if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) { setOrthographicProjection(); showProfileInfo(xOffset,yStart,yIncr); #ifdef USE_QUICKPROF if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings) { static int counter = 0; counter++; std::map<std::string, hidden::ProfileBlock*>::iterator iter; for (iter = btProfiler::mProfileBlocks.begin(); iter != btProfiler::mProfileBlocks.end(); ++iter) { char blockTime[128]; sprintf(blockTime, "%s: %lf",&((*iter).first[0]),btProfiler::getBlockTime((*iter).first, btProfiler::BLOCK_CYCLE_SECONDS));//BLOCK_TOTAL_PERCENT)); glRasterPos3f(xOffset,yStart,0); GLDebugDrawString(BMF_GetFont(BMF_kHelvetica10),blockTime); yStart += yIncr; } } #endif //USE_QUICKPROF resetPerspectiveProjection(); } glEnable(GL_LIGHTING); } updateCamera(); }
void SpheresGridDemo::renderme() { glPointSize(5.0f); glEnable(GL_POINT_SPRITE_ARB); glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); #ifndef __APPLE__ glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_NV); #endif //__APPLE__ glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); glUseProgram(m_shaderProgram); btScalar dist = (m_glutScreenWidth > m_glutScreenHeight) ? m_glutScreenHeight : m_glutScreenWidth; glUniform1f( glGetUniformLocation(m_shaderProgram, "pointScale"), dist ); // glUniform1f( glGetUniformLocation(m_shaderProgram, "pointRadius"), 0.5f ); #ifdef SPHERES_DEMO #ifdef INTEGRATION_DEMO int numSpheres = (m_demoType == DEMO_INTEGRATION) ? m_pWorldI->getNumSpheres() : m_pWorldS->getNumSpheres(); int col_vbo = (m_demoType == DEMO_INTEGRATION) ? m_pWorldI->m_colVbo : m_pWorldS->m_colVbo; int curr_vbo = (m_demoType == DEMO_INTEGRATION) ? m_pWorldI->m_vbo : m_pWorldS->m_vbo; float sphere_rad = (m_demoType == DEMO_INTEGRATION) ? m_pWorldI->m_sphereRad : m_pWorldS->m_sphereRad; #else int numSpheres = m_pWorldS->getNumSpheres(); int col_vbo = m_pWorldS->m_colVbo; int curr_vbo = m_pWorldS->m_vbo; float sphere_rad = m_pWorldS->m_sphereRad; #endif #else int numSpheres = m_pWorldI->getNumSpheres(); int col_vbo = m_pWorldI->m_colVbo; int curr_vbo = m_pWorldI->m_vbo; float sphere_rad = m_pWorldI->m_sphereRad; #endif glUniform1f( glGetUniformLocation(m_shaderProgram, "pointRadius"), sphere_rad ); glColor3f(1, 1, 1); // render from the vbo glBindBuffer(GL_ARRAY_BUFFER, curr_vbo); glVertexPointer(4, GL_FLOAT, 0, 0); glEnableClientState(GL_VERTEX_ARRAY); if(col_vbo) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, col_vbo); glColorPointer(4, GL_FLOAT, 0, 0); glEnableClientState(GL_COLOR_ARRAY); } glDrawArrays(GL_POINTS, 0, numSpheres); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glUseProgram(0); glDisable(GL_POINT_SPRITE_ARB); glBindBufferARB(GL_ARRAY_BUFFER,0); #ifdef SPHERES_DEMO if((m_demoType != DEMO_INTEGRATION) && m_drawGridMode) { btVector3& wmin = m_pWorldS->m_worldMin; btVector3& wmax = m_pWorldS->m_worldMax; glBegin(GL_LINE_LOOP); glVertex3f(wmin[0], wmin[1], wmin[2]); glVertex3f(wmin[0], wmax[1], wmin[2]); glVertex3f(wmax[0], wmax[1], wmin[2]); glVertex3f(wmax[0], wmin[1], wmin[2]); glVertex3f(wmax[0], wmin[1], wmax[2]); glVertex3f(wmax[0], wmax[1], wmax[2]); glVertex3f(wmin[0], wmax[1], wmax[2]); glVertex3f(wmin[0], wmin[1], wmax[2]); glEnd(); glBegin(GL_LINES); glVertex3f(wmin[0], wmin[1], wmin[2]); glVertex3f(wmax[0], wmin[1], wmin[2]); glVertex3f(wmin[0], wmin[1], wmax[2]); glVertex3f(wmax[0], wmin[1], wmax[2]); glVertex3f(wmin[0], wmax[1], wmin[2]); glVertex3f(wmin[0], wmax[1], wmax[2]); glVertex3f(wmax[0], wmax[1], wmin[2]); glVertex3f(wmax[0], wmax[1], wmax[2]); glEnd(); if(m_drawGridMode == 2) { int szx = m_pWorldS->m_simParams.m_gridSize[0]; int szy = m_pWorldS->m_simParams.m_gridSize[1]; glBegin(GL_LINES); for(int i = 1; i < (szx-1); i++) { float wgt = (float)i / (float)(szx-1); btVector3 vtx = wmax * wgt + wmin * (1.0f - wgt); glVertex3f(vtx[0], wmin[1], wmin[2]); glVertex3f(vtx[0], wmax[1], wmin[2]); } for(int i = 1; i < (szy-1); i++) { float wgt = (float)i / (float)(szy-1); btVector3 vtx = wmax * wgt + wmin * (1.0f - wgt); glVertex3f(wmin[0], vtx[1], wmin[2]); glVertex3f(wmax[0], vtx[1], wmin[2]); } glEnd(); } } #endif if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) { setOrthographicProjection(); int xOffset = 10.f; int yStart = 20.f; int yIncr = 20.f; if(m_demoType == DEMO_INTEGRATION) { #ifdef INTEGRATION_DEMO switch(m_pWorldI->m_usedDevice) { case 0: GLDebugDrawString(xOffset,yStart,"CPU"); break; case 1: GLDebugDrawString(xOffset,yStart,"OpenCL"); break; case 2: GLDebugDrawString(xOffset,yStart,"CUDA"); break; } yStart += 30.f; #endif } showProfileInfo(xOffset, yStart, yIncr); outputDebugInfo(xOffset, yStart, yIncr); resetPerspectiveProjection(); } }
void DemoApplication::displayProfileString(int xOffset,int yStart,char* message) { glRasterPos3f(btScalar(xOffset),btScalar(yStart),btScalar(0)); GLDebugDrawString(xOffset,yStart,message); }
void BasicDemo::outputDebugInfo(int & xOffset,int & yStart, int yIncr) { char buf[124]; glDisable(GL_LIGHTING); glColor3f(0, 0, 0); sprintf(buf,"mouse move+buttons to interact"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"space to reset"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"cursor keys and z,x to navigate"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"i to toggle simulation, s single step"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"q to quit"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"h to toggle help text"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"p to toggle profiling (+results to file)"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"c to toggle constraint drawing"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"b to draw single constraint batch"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"u to toggle between CPU and OpenCL solvers"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"d to toggle between different batch builders"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; if (getDynamicsWorld()) { sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; } } // BasicDemo::outputDebugInfo()
void bulletBaseApp::displayProfileString(int xOffset,int yStart,char* message) { glRasterPos3f(xOffset,yStart,0); GLDebugDrawString(xOffset,yStart,message); }
static void doPrint(int x,int& y,int dy,const char * text) { GLDebugDrawString(x,y, text); y += dy; }
void InternalEdgeDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float dt = getDeltaTimeMicroseconds() * 0.000001f; if (m_animatedMesh) { static float offset=0.f; offset+=0.01f; // setVertexPositions(waveheight,offset); #if 0 ///not currently supported, we need to update the btInternalTriangleInfoMap int i; int j; btVector3 aabbMin(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); btVector3 aabbMax(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); for ( i=NUM_VERTS_X/2-3;i<NUM_VERTS_X/2+2;i++) { for (j=NUM_VERTS_X/2-3;j<NUM_VERTS_Y/2+2;j++) { aabbMax.setMax(gVertices[i+j*NUM_VERTS_X]); aabbMin.setMin(gVertices[i+j*NUM_VERTS_X]); gVertices[i+j*NUM_VERTS_X].setValue((i-NUM_VERTS_X*0.5f)*TRIANGLE_SIZE, 0.f, //waveheight*sinf((float)i+offset)*cosf((float)j+offset), (j-NUM_VERTS_Y*0.5f)*TRIANGLE_SIZE); aabbMin.setMin(gVertices[i+j*NUM_VERTS_X]); aabbMax.setMax(gVertices[i+j*NUM_VERTS_X]); } } trimeshShape->partialRefitTree(aabbMin,aabbMax); #else btVector3 aabbMin,aabbMax; trimeshShape->getMeshInterface()->calculateAabbBruteForce(aabbMin,aabbMax); trimeshShape->refitTree(aabbMin,aabbMax); #endif //for debugging: clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. //m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); } m_dynamicsWorld->stepSimulation(dt); ///enable one of the following to debug (render debug lines each frame) //m_dynamicsWorld->stepSimulation(1./800.,0); //m_dynamicsWorld->stepSimulation(1./60.,100,1./800.); //m_dynamicsWorld->stepSimulation(1./60.,0); int lineWidth=450; int xStart = m_glutScreenWidth - lineWidth; int yStart = 20; #ifndef __QNX__ if((getDebugMode() & btIDebugDraw::DBG_DrawText)!=0) { setOrthographicProjection(); glDisable(GL_LIGHTING); glColor3f(0, 0, 0); char buf[124]; glRasterPos3f(xStart, yStart, 0); if (enable) { sprintf(buf,"InternalEdgeUtility enabled"); } else { sprintf(buf,"InternalEdgeUtility disabled"); } GLDebugDrawString(xStart,20,buf); yStart+=20; glRasterPos3f(xStart, yStart, 0); sprintf(buf,"Press 'n' to toggle InternalEdgeUtility"); yStart+=20; GLDebugDrawString(xStart,yStart,buf); glRasterPos3f(xStart, yStart, 0); resetPerspectiveProjection(); glEnable(GL_LIGHTING); } #endif renderme(); //optional but useful: debug drawing m_dynamicsWorld->debugDrawWorld(); glFlush(); swapBuffers(); }
void DoublePrecisionDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_LIGHTING); collisionWorld->getDispatchInfo().m_debugDraw = &debugDrawer; if (collisionWorld) collisionWorld->performDiscreteCollisionDetection(); int i; btVector3 worldBoundsMin,worldBoundsMax; collisionWorld->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); ///one way to draw all the contact points is iterating over contact manifolds / points: int numManifolds = collisionWorld->getDispatcher()->getNumManifolds(); for (i=0;i<numManifolds;i++) { btPersistentManifold* contactManifold = collisionWorld->getDispatcher()->getManifoldByIndexInternal(i); btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0()); btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1()); contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform()); int numContacts = contactManifold->getNumContacts(); for (int j=0;j<numContacts;j++) { btManifoldPoint& pt = contactManifold->getContactPoint(j); glBegin(GL_LINES); glColor3f(1, 1, 1); btVector3 ptA = pt.getPositionWorldOnA() - m_cameraPosition; btVector3 ptB = pt.getPositionWorldOnB() - m_cameraPosition; glVertex3d(ptA.x(),ptA.y(),ptA.z()); glVertex3d(ptB.x(),ptB.y(),ptB.z()); glEnd(); } //you can un-comment out this line, and then all points are removed //contactManifold->clearManifold(); } btScalar m[16]; btTransform temp; btVector3 color; //int i; for (i=0;i<numObjects;i++) { if (i % 2) { color = btVector3(1,0,0); } else { color = btVector3(0,0,1); } temp = objects[i].getWorldTransform(); temp.setOrigin(temp.getOrigin() - m_cameraPosition); temp.getOpenGLMatrix( m ); m_shapeDrawer->drawOpenGL(m,objects[i].getCollisionShape(),color,getDebugMode(),worldBoundsMin,worldBoundsMax); } objects[1].getWorldTransform().setOrigin(objects[1].getWorldTransform().getOrigin()+btVector3(-VERY_SMALL_INCREMENT,-VERY_SMALL_INCREMENT,0)); objects[0].getWorldTransform().setOrigin(objects[0].getWorldTransform().getOrigin()+btVector3(VERY_SMALL_INCREMENT,VERY_SMALL_INCREMENT,0)); float yStart = 20.f; float yIncr = 20.f; char buf[124]; glColor3f(0, 0, 0); setOrthographicProjection(); glRasterPos3f(10.0f,yStart,0); #ifdef BT_USE_DOUBLE_PRECISION GLDebugDrawString(10.f,yStart,"Double Precision Mode"); #else GLDebugDrawString(10.f,yStart,"Single Precision Mode"); #endif yStart += yIncr; glRasterPos3f(10.0f,yStart,0); sprintf(buf,"Movement distance in x and y axis = %lf", VERY_SMALL_INCREMENT); GLDebugDrawString(10.f,yStart,buf); yStart += yIncr; glRasterPos3f(10.0f,yStart,0); btScalar xValue = objects[0].getWorldTransform().getOrigin().x(); btScalar yValue = objects[0].getWorldTransform().getOrigin().y(); btScalar zValue = objects[0].getWorldTransform().getOrigin().z(); sprintf(buf,"Cube 0 location = ( %lf, %lf, %lf )", xValue, yValue, zValue); GLDebugDrawString(10.f,yStart,buf); yStart += yIncr; xValue = objects[1].getWorldTransform().getOrigin().x(); yValue = objects[1].getWorldTransform().getOrigin().y(); zValue = objects[1].getWorldTransform().getOrigin().z(); glRasterPos3f(10.0f,yStart,0); sprintf(buf,"Cube 1 location = ( %lf, %lf, %lf )", xValue, yValue, zValue); GLDebugDrawString(10.f,yStart,buf); yStart += yIncr; glRasterPos3f(10.0f,yStart,0); GLDebugDrawString(10.f,yStart,"w=toggle wireframe/solid"); resetPerspectiveProjection(); glFlush(); glutSwapBuffers(); }
static void RenderCallback() { // Clear buffers glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup camera glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0f, ((float)glutGet(GLUT_WINDOW_WIDTH))/((float)glutGet(GLUT_WINDOW_HEIGHT)), 1.0f, 10000.0f); gluLookAt(Eye.x(), Eye.y(), Eye.z(), Eye.x() + Dir.x(), Eye.y() + Dir.y(), Eye.z() + Dir.z(), 0.0f, 1.0f, 0.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_LIGHTING); //clear previous frames result gNormal.setValue(10,0,0); gPoint.setValue(0,0,0); gDepth = 999.999; gLastUsedMethod = -1; gNumGjkIterations = -1; TestEPA(gConvex0, gConvex1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); btVector3 RefSep(btScalar(0.), btScalar(0.), btScalar(0.)); float RefDMin=0.f; bool RefResult = false; if(gRefMode) RefResult = ReferenceCode(gConvex0, gConvex1, RefDMin, RefSep); // DrawLine(gPoint, gPoint + gNormal*20.0f, btVector3(1,0,0), 2.0f); // printf("%f: %f %f %f\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); #ifdef VERBOSE_TEXT_ONSCREEN glColor3f(255.f, 255.f, 255.f); setOrthographicProjection(); float xOffset = 10.f; float yStart = 20.f; float yIncr = 20.f; char buf[124]; sprintf(buf,"gDepth=%f: gNormal=(%f %f %f)\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"num GJK iterations =%d\n", gNumGjkIterations); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"gLastUsedMethod=%d\n", gLastUsedMethod); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; if (gLastUsedMethod >= 3) { switch ( gMethod) { case 0: sprintf(buf,"Bullet GjkEpa Penetration depth solver (zlib free\n" ); break; case 1: sprintf(buf,"Bullet Minkowski sampling Penetration depth solver\n" ); break; case 2: sprintf(buf,"Solid35 EPA Penetration depth solver\n" ); break; case 3: sprintf(buf,"EPA Penetration depth solver (Experimental/WorkInProgress, zlib free\n" ); break; default: sprintf(buf,"Unknown Penetration Depth\n" ); } GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; } else { sprintf(buf,"Hybrid GJK method %d\n", gLastUsedMethod); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; } if (gLastDegenerateSimplex) { sprintf(buf,"DegenerateSimplex %d\n", gLastDegenerateSimplex); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; } resetPerspectiveProjection(); #endif //VERBOSE_TEXT_ONSCREEN btVector3 color(0,0,0); gConvex0.Render(false, color); gConvex1.Render(false, color); if(gDepth<0.0f) { btTransform Saved = gConvex0.mTransform; gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() - btVector3(gNormal*gDepth)); gConvex0.Render(true, btVector3(1.0f, 0.5f, 0.0f)); gConvex0.mTransform = Saved; } else { DrawLine(gPoint, gPoint + gNormal, btVector3(0,1,0), 2.0f); } if(RefResult & gRefMode) { btTransform Saved = gConvex0.mTransform; gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(RefSep*RefDMin)); gConvex0.Render(true, btVector3(0.0f, 0.5f, 1.0f)); gConvex0.mTransform = Saved; } glutSwapBuffers(); }
void bulletBaseApp::renderme() { myinit(); updateCamera(); if (m_dynamicsWorld) { if(m_enableshadows) { glClear(GL_STENCIL_BUFFER_BIT); glEnable(GL_CULL_FACE); renderscene(0); glDisable(GL_LIGHTING); glDepthMask(GL_FALSE); glDepthFunc(GL_LEQUAL); glEnable(GL_STENCIL_TEST); glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); glStencilFunc(GL_ALWAYS,1,0xFFFFFFFFL); glFrontFace(GL_CCW); glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); renderscene(1); glFrontFace(GL_CW); glStencilOp(GL_KEEP,GL_KEEP,GL_DECR); renderscene(1); glFrontFace(GL_CCW); glPolygonMode(GL_FRONT,GL_FILL); glPolygonMode(GL_BACK,GL_FILL); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_LIGHTING); glDepthMask(GL_TRUE); glCullFace(GL_BACK); glFrontFace(GL_CCW); glEnable(GL_CULL_FACE); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); glDepthFunc(GL_LEQUAL); glStencilFunc( GL_NOTEQUAL, 0, 0xFFFFFFFFL ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); glDisable(GL_LIGHTING); renderscene(2); glEnable(GL_LIGHTING); glDepthFunc(GL_LESS); glDisable(GL_STENCIL_TEST); glDisable(GL_CULL_FACE); } else { glDisable(GL_CULL_FACE); renderscene(0); } int xOffset = 10; int yStart = 20; int yIncr = 20; char buf[124]; glDisable(GL_LIGHTING); glColor3f(0, 0, 0); if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) { setOrthographicProjection(); showProfileInfo(xOffset,yStart,yIncr); #ifdef USE_QUICKPROF if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings) { static int counter = 0; counter++; std::map<std::string, hidden::ProfileBlock*>::iterator iter; for (iter = btProfiler::mProfileBlocks.begin(); iter != btProfiler::mProfileBlocks.end(); ++iter) { char blockTime[128]; sprintf(blockTime, "%s: %lf",&((*iter).first[0]),btProfiler::getBlockTime((*iter).first, btProfiler::BLOCK_CYCLE_SECONDS));//BLOCK_TOTAL_PERCENT)); glRasterPos3f(xOffset,yStart,0); GLDebugDrawString(BMF_GetFont(BMF_kHelvetica10),blockTime); yStart += yIncr; } } #endif //USE_QUICKPROF sprintf(buf,"mouse to interact"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"ALT + mouse to move camera"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"space to reset"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"cursor keys and z,x to navigate"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"i to toggle simulation, s single step"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"q to quit"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,". to shoot box"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; // not yet hooked up again after refactoring... sprintf(buf,"d to toggle deactivation"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"g to toggle mesh animation (ConcaveDemo)"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"h to toggle help text"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"o to toggle orthogonal/perspective view"); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; //bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); //bool useCCD = (getDebugMode() & btIDebugDraw::DBG_EnableCCD); //glRasterPos3f(xOffset,yStart,0); //sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); //GLDebugDrawString(BMF_GetFont(BMF_kHelvetica10),buf); //yStart += yIncr; sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; #ifdef SHOW_NUM_DEEP_PENETRATIONS sprintf(buf,"gNumDeepPenetrationChecks = %d",gNumDeepPenetrationChecks); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"gNumGjkChecks= %d",gNumGjkChecks); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"gNumClampedCcdMotions = %d",gNumClampedCcdMotions); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"gNumSplitImpulseRecoveries= %d",gNumSplitImpulseRecoveries); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"gNumAlignedAllocs = %d",gNumAlignedAllocs); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"gNumAlignedFree= %d",gNumAlignedFree); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"# alloc-free = %d",gNumAlignedAllocs-gNumAlignedFree); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; //enable BT_DEBUG_MEMORY_ALLOCATIONS define in Bullet/src/LinearMath/btAlignedAllocator.h for memory leak detection #ifdef BT_DEBUG_MEMORY_ALLOCATIONS glRasterPos3f(xOffset,yStart,0); sprintf(buf,"gTotalBytesAlignedAllocs = %d",gTotalBytesAlignedAllocs); GLDebugDrawString(BMF_GetFont(BMF_kHelvetica10),buf); yStart += yIncr; #endif //BT_DEBUG_MEMORY_ALLOCATIONS if (getDynamicsWorld()) { glRasterPos3f(xOffset,yStart,0); sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; glRasterPos3f(xOffset,yStart,0); sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; sprintf(buf,"# hitPos = %f,%f,%f",gHitPos.getX(),gHitPos.getY(),gHitPos.getZ()); GLDebugDrawString(xOffset,yStart,buf); yStart += yIncr; } #endif //SHOW_NUM_DEEP_PENETRATIONS resetPerspectiveProjection(); } glEnable(GL_LIGHTING); } updateCamera(); }