static void PlaneCollisionCollideCallbackDescrete (NewtonUserMeshCollisionCollideDesc* const collideDesc) { dInfinitePlane* const me = (dInfinitePlane*) collideDesc->m_userData; dVector p0 (collideDesc->m_boxP0[0], collideDesc->m_boxP0[1], collideDesc->m_boxP0[2], 0.0f); dVector p1 (collideDesc->m_boxP1[0], collideDesc->m_boxP1[1], collideDesc->m_boxP1[2], 0.0f); dVector suportVertex ((me->m_plane.m_x > 0.0f) ? p0.m_x : p1.m_x, (me->m_plane.m_y > 0.0f) ? p0.m_y : p1.m_y, (me->m_plane.m_z > 0.0f) ? p0.m_z : p1.m_z); dFloat dist = me->m_plane.DotProduct3(suportVertex) + me->m_plane.m_w; if (dist < 0.25f) { // calculate the aabb center dVector centre ((p1 + p0).Scale (0.5f)); //find the projection of center point over the plane dFloat t = - (me->m_plane.DotProduct3(centre) + me->m_plane.m_w); centre += me->m_plane.Scale (t); //know calculate the scale factor dVector size (p1 - p0); dFloat s = dMax(size.m_x, dMax (size.m_y, size.m_z)); dInt32 threadNumber = collideDesc->m_threadNumber; // initialize the callback data structure #ifdef PASS_A_QUAD collideDesc->m_faceCount = 1; #else collideDesc->m_faceCount = 2; #endif collideDesc->m_vertexStrideInBytes = sizeof (dVector); collideDesc->m_faceIndexCount = &me->m_faceIndices[threadNumber][0]; collideDesc->m_faceVertexIndex = &me->m_indexArray[threadNumber][0]; collideDesc->m_vertex = &me->m_collisionVertex[threadNumber][0][0]; dVector* const polygon = &me->m_collisionVertex[threadNumber][0]; for (int i = 0; i < 4; i ++) { polygon[i] = centre + me->m_unitSphape[i].Scale (s); } // save face normal polygon[4] = me->m_plane; // show debug display info if (DebugDisplayOn()) { dMatrix matrix; dVector face[64]; NewtonBodyGetMatrix (collideDesc->m_polySoupBody, &matrix[0][0]); matrix.TransformTriplex (&face[0].m_x, sizeof (dVector), &polygon[0].m_x, sizeof (dVector), 4); NewtonWorld* const world = NewtonBodyGetWorld (collideDesc->m_polySoupBody); // critical section lock NewtonWorldCriticalSectionLock (world, threadNumber); //DebugDrawPolygon (4, &face[0]); // unlock the critical section NewtonWorldCriticalSectionUnlock (world); } } }
static void PlaneCollisionCollideCallbackConstinue (NewtonUserMeshCollisionCollideDesc* const collideDesc, const void* const continueCollisionHandle) { dInfinitePlane* const me = (dInfinitePlane*) collideDesc->m_userData; // build that aabb of each face and submit only the one that pass the test. if (NewtonUserMeshCollisionContinuousOverlapTest (collideDesc, continueCollisionHandle, &me->m_minBox[0], &me->m_maxBox[0])) { const dVector& p0 = me->m_minBox; const dVector& p1 = me->m_maxBox; dVector centre ((p1 + p0).Scale (0.5f)); //find the projection of center point over the plane dFloat t = - (me->m_plane.DotProduct3(centre) + me->m_plane.m_w); centre += me->m_plane.Scale (t); //know calculate the scale factor dVector size (p1 - p0); dFloat s = dMax(size.m_x, dMax (size.m_y, size.m_z)) * 0.5f; dInt32 threadNumber = collideDesc->m_threadNumber; // initialize the callback data structure #ifdef PASS_A_QUAD collideDesc->m_faceCount = 1; #else collideDesc->m_faceCount = 2; #endif collideDesc->m_vertexStrideInBytes = sizeof (dVector); collideDesc->m_faceIndexCount = &me->m_faceIndices[threadNumber][0]; collideDesc->m_faceVertexIndex = &me->m_indexArray[threadNumber][0]; collideDesc->m_vertex = &me->m_collisionVertex[threadNumber][0][0]; dVector* const polygon = &me->m_collisionVertex[threadNumber][0]; for (int i = 0; i < 4; i ++) { polygon[i] = centre + me->m_unitSphape[i].Scale (s); } // save face normal polygon[4] = me->m_plane; // show debug display info if (DebugDisplayOn()) { dMatrix matrix; dVector face[64]; NewtonBodyGetMatrix (collideDesc->m_polySoupBody, &matrix[0][0]); matrix.TransformTriplex (&face[0].m_x, sizeof (dVector), &polygon[0].m_x, sizeof (dVector), 4); NewtonWorld* const world = NewtonBodyGetWorld (collideDesc->m_polySoupBody); // critical section lock NewtonWorldCriticalSectionLock (world, threadNumber); //DebugDrawPolygon (4, &face[0]); // unlock the critical section NewtonWorldCriticalSectionUnlock (world); } } }
FILE* DisplayDebugEnabled() { return ( DebugDisplayOn(sServer) ) ? stdout : NULL ; }
void RunServer() { Bool16 restartServer = false; UInt32 loopCount = 0; UInt32 debugLevel = 0; Bool16 printHeader = false; Bool16 printStatus = false; //just wait until someone stops the server or a fatal error occurs. QTSS_ServerState theServerState = sServer->GetServerState(); while ((theServerState != qtssShuttingDownState) && (theServerState != qtssFatalErrorState)) { #ifdef __sgi__ OSThread::Sleep(999); #else OSThread::Sleep(1000); #endif LogStatus(theServerState); if (sStatusUpdateInterval) { debugLevel = sServer->GetDebugLevel(); printHeader = PrintHeader(loopCount); printStatus = PrintLine(loopCount); if (printStatus) { if (DebugOn(sServer) ) // debug level display or logging is on DebugStatus(debugLevel, printHeader); if (!DebugDisplayOn(sServer)) PrintStatus(printHeader); // default status output } loopCount++; } if ((sServer->SigIntSet()) || (sServer->SigTermSet())) { // // start the shutdown process theServerState = qtssShuttingDownState; (void)QTSS_SetValue(QTSServerInterface::GetServer(), qtssSvrState, 0, &theServerState, sizeof(theServerState)); if (sServer->SigIntSet()) restartServer = true; } theServerState = sServer->GetServerState(); if (theServerState == qtssIdleState) sServer->KillAllRTPSessions(); } // // Kill all the sessions and wait for them to die, // but don't wait more than 5 seconds sServer->KillAllRTPSessions(); for (UInt32 shutdownWaitCount = 0; (sServer->GetNumRTPSessions() > 0) && (shutdownWaitCount < 5); shutdownWaitCount++) OSThread::Sleep(1000); //Now, make sure that the server can't do any work TaskThreadPool::RemoveThreads(); //now that the server is definitely stopped, it is safe to initate //the shutdown process delete sServer; CleanPid(false); //ok, we're ready to exit. If we're quitting because of some fatal error //while running the server, make sure to let the parent process know by //exiting with a nonzero status. Otherwise, exit with a 0 status if (theServerState == qtssFatalErrorState || restartServer) ::exit (-2);//-2 signals parent process to restart server }
void RunServer() { Bool16 restartServer = false; UInt32 loopCount = 0; UInt32 debugLevel = 0; Bool16 printHeader = false; Bool16 printStatus = false; UInt32 num=0;//add //just wait until someone stops the server or a fatal error occurs. QTSS_ServerState theServerState = sServer->GetServerState(); while ((theServerState != qtssShuttingDownState) && (theServerState != qtssFatalErrorState)) { #ifdef __sgi__ OSThread::Sleep(999); #else OSThread::Sleep(1000); #endif //add,redis,定时保活 num++; if(num%5==0) { num=0; UInt32 numModules = QTSServerInterface::GetNumModulesInRole(QTSSModule::kRedisTTLRole); for ( UInt32 currentModule=0;currentModule < numModules; currentModule++) { QTSSModule* theModule = QTSServerInterface::GetModule(QTSSModule::kRedisTTLRole, currentModule); (void)theModule->CallDispatch(Easy_RedisTTL_Role, NULL); } } // LogStatus(theServerState); if (sStatusUpdateInterval) { debugLevel = sServer->GetDebugLevel(); printHeader = PrintHeader(loopCount); printStatus = PrintLine(loopCount); if (printStatus) { if (DebugOn(sServer) ) // debug level display or logging is on DebugStatus(debugLevel, printHeader); if (!DebugDisplayOn(sServer)) PrintStatus(printHeader); // default status output } loopCount++; } if ((sServer->SigIntSet()) || (sServer->SigTermSet())) { // // start the shutdown process theServerState = qtssShuttingDownState; (void)QTSS_SetValue(QTSServerInterface::GetServer(), qtssSvrState, 0, &theServerState, sizeof(theServerState)); if (sServer->SigIntSet()) restartServer = true; } } //Now, make sure that the server can't do any work TaskThreadPool::RemoveThreads(); //now that the server is definitely stopped, it is safe to initate //the shutdown process delete sServer; CleanPid(false); //ok, we're ready to exit. If we're quitting because of some fatal error //while running the server, make sure to let the parent process know by //exiting with a nonzero status. Otherwise, exit with a 0 status if (theServerState == qtssFatalErrorState || restartServer) ::exit (-2);//-2 signals parent process to restart server }