int main() #endif { double rGlobalTime = 0; double rOldGlobalTime = 0; double rDeltaTime = 0; vector<SDispCS> DispCS; bool bAutoDetect = true; bool bDisplay = true; sint32 nSelected = 0; SDispCS dcsTemp; vector<CInstanceGroup*> vAllIGs; // 2 dynamics objects CTransformShape *pDynObj_InRoot; CTransformShape *pDynObj_InCS; CNELU::init (800, 600, CViewport(), 32, true); CNELU::Scene->enableLightingSystem(true); CNELU::Scene->setAmbientGlobal(CRGBA(128,128,128)); CPath::addSearchPath(CV_DIR); CPath::addSearchPath(CV_DIR"/shapes"); CPath::addSearchPath(CV_DIR"/groups"); CPath::addSearchPath(CV_DIR"/fonts"); CFontManager FontManager; CTextContext TextContext; TextContext.init (CNELU::Driver, &FontManager); TextContext.setFontGenerator (NLMISC::CPath::lookup("n019003l.pfb")); TextContext.setHotSpot (CComputedString::TopLeft); TextContext.setColor (CRGBA(255,255,255)); TextContext.setFontSize (20); CEvent3dMouseListener MouseListener; MouseListener.addToServer (CNELU::EventServer); MouseListener.setFrustrum (CNELU::Camera->getFrustum()); MouseListener.setMouseMode (CEvent3dMouseListener::firstPerson); CNELU::Camera->setTransformMode (ITransformable::DirectMatrix); // Force to automatically find the cluster system CNELU::Camera->setClusterSystem ((CInstanceGroup*)-1); CClipTrav *pClipTrav = (CClipTrav*)&(CNELU::Scene->getClipTrav()); dcsTemp.Name = "Root"; dcsTemp.pIG = NULL; DispCS.push_back (dcsTemp); // Add all instance that create the scene // -------------------------------------- // Beginning of script reading CVector CameraStart; LoadSceneScript ("main.cvs", CNELU::Scene, DispCS, CameraStart, vAllIGs); CMatrix m = MouseListener.getViewMatrix(); m.setPos (CameraStart); MouseListener.setMatrix (m); // End of script reading // Put a dynamic object in the root pDynObj_InRoot = CNELU::Scene->createInstance ("sphere01.shape"); pDynObj_InRoot->setPos (0.0f, 0.0f, 0.0f); // Put a dynamic object inside pDynObj_InCS = CNELU::Scene->createInstance ("sphere01.shape"); pDynObj_InCS->setPos (50.0f, 50.0f, 25.0f); // No automatic detection for moving objects - setup in street pDynObj_InCS->setClusterSystem (vAllIGs[0]); // Main loop do { rGlobalTime = CTime::ticksToSecond(CTime::getPerformanceTime()); rDeltaTime = rGlobalTime - rOldGlobalTime; rOldGlobalTime = rGlobalTime; pDynObj_InRoot->setPos (-20.0f+20.0f*sinf((float)rGlobalTime), -20.0f+20.0f*cosf((float)rGlobalTime*1.2f), 20.0f*sinf((float)rGlobalTime*1.1f+0.5f)); pDynObj_InCS->setPos (25.0f+5.0f*sinf((float)rGlobalTime*1.4f), -25.0f+5.0f*cosf((float)rGlobalTime*1.3f), 25.0f+2.0f*sinf((float)rGlobalTime*1.2f+0.7f)); CNELU::Scene->animate ((float)rGlobalTime); CNELU::EventServer.pump(); CNELU::clearBuffers (CRGBA(0,0,0)); CNELU::Scene->render (); // ----------------------------------------------------- // ----------------------------------------------------- if (bDisplay) { vector<CCluster*> vCluster; DispCS[0].pIG = pClipTrav->RootCluster->Group; TextContext.setColor (CRGBA(255,255,255,255)); if (bAutoDetect) { TextContext.printfAt (0, 1, "AutoDetect : ON"); pClipTrav->fullSearch (vCluster, pClipTrav->CamPos); for (uint32 i = 0; i < DispCS.size(); ++i) { TextContext.setColor (CRGBA(255,255,255,255)); for( uint32 j = 0; j < vCluster.size(); ++j) { if (DispCS[i].pIG == vCluster[j]->Group) { TextContext.setColor (CRGBA(255,0,0,255)); break; } } TextContext.printfAt (0, 1-(i+2)*0.028f, DispCS[i].Name.c_str()); } } else { TextContext.printfAt (0, 1, "AutoDetect : OFF"); CInstanceGroup *pCurIG = CNELU::Camera->getClusterSystem(); for (uint32 i = 0; i < DispCS.size(); ++i) { if (DispCS[i].pIG == pCurIG) TextContext.setColor (CRGBA(255,0,0,255)); else TextContext.setColor (CRGBA(255,255,255,255)); TextContext.printfAt (0, 1-(i+2)*0.028f, DispCS[i].Name.c_str()); } TextContext.setColor (CRGBA(255,255,255,255)); pClipTrav->Accel.select (pClipTrav->CamPos, pClipTrav->CamPos); CQuadGrid<CCluster*>::CIterator itAcc = pClipTrav->Accel.begin(); while (itAcc != pClipTrav->Accel.end()) { CCluster *pCluster = *itAcc; if (pCluster->Group == pClipTrav->Camera->getClusterSystem()) if (pCluster->isIn (pClipTrav->CamPos)) { vCluster.push_back (pCluster); } ++itAcc; } if ((vCluster.size() == 0) && (DispCS[0].pIG == pCurIG)) { vCluster.push_back (pClipTrav->RootCluster); } } TextContext.setColor (CRGBA(255,255,255,255)); string sAllClusters = ""; for( uint32 j = 0; j < vCluster.size(); ++j) { sAllClusters += vCluster[j]->Name; if (j < (vCluster.size()-1)) sAllClusters += ", "; } TextContext.printfAt (0, 1-0.028f, sAllClusters.c_str()); } // ----------------------------------------------------- // ----------------------------------------------------- CNELU::Driver->swapBuffers (); // Keys management // --------------- if (CNELU::AsyncListener.isKeyDown (KeySHIFT)) MouseListener.setSpeed (50.0f); else MouseListener.setSpeed (10.0f); CNELU::Camera->setMatrix (MouseListener.getViewMatrix()); if (CNELU::AsyncListener.isKeyPushed(KeyL)) { CNELU::Driver->setPolygonMode (IDriver::Line); } if (CNELU::AsyncListener.isKeyPushed (KeyP)) { CNELU::Driver->setPolygonMode (IDriver::Filled); } if (CNELU::AsyncListener.isKeyPushed (KeyTAB)) bDisplay = !bDisplay; if (CNELU::AsyncListener.isKeyPushed (KeyA)) { if (bAutoDetect) { bAutoDetect = false; CNELU::Camera->setClusterSystem (NULL); nSelected = 0; } else { bAutoDetect = true; CNELU::Camera->setClusterSystem ((CInstanceGroup*)-1); } } if (!bAutoDetect) { if (CNELU::AsyncListener.isKeyPushed (KeyZ)) { nSelected--; if(nSelected == -1) nSelected = (sint32)DispCS.size()-1; } if (CNELU::AsyncListener.isKeyPushed (KeyS)) { nSelected++; if(nSelected == (sint32)DispCS.size()) nSelected = 0; } CNELU::Camera->setClusterSystem (DispCS[nSelected].pIG); } } while ((!CNELU::AsyncListener.isKeyPushed(KeyESCAPE)) && CNELU::Driver->isActive()); return EXIT_SUCCESS; }
// // Main // int main( int argc, char **argv ) { createDebug (); DebugLog->addNegativeFilter(" "); InfoLog->displayRawNL ("\nNevrax UDP benchmark client\n\nPress <CTRL-C> to exit"); CPath::addSearchPath(UDP_DIR); loadConfigFile (); CCallbackClient *cc = new CCallbackClient; cc->addCallbackArray (CallbackArray, sizeof(CallbackArray)/sizeof(CallbackArray[0])); cc->setDisconnectionCallback (cbDisconnect, NULL); try { InfoLog->displayRawNL ("Try to connect to %s:%d", ServerAddr.c_str(), TCPPort); cc->connect(CInetAddress (ServerAddr, TCPPort)); CMessage msgout ("INIT"); msgout.serial (ConnectionName); msgout.serial (Version); cc->send (msgout); InfoLog->displayRawNL ("Waiting the server answer..."); } catch(Exception &e) { InfoLog->displayRawNL ("Can't connect to %s:%d (%s)\n", ServerAddr.c_str(), TCPPort, e.what()); exit (""); } uint8 *packet = new uint8[MaxUDPPacketSize]; uint32 psize; #ifdef USE_3D UDriver *Driver = UDriver::createDriver(); Driver->setDisplay(UDriver::CMode(800, 600, 32, true)); UScene *Scene= Driver->createScene(false); UCamera Camera= Scene->getCam(); Camera.setTransformMode(UTransform::DirectMatrix); UTextContext *TextContext= Driver->createTextContext(CPath::lookup("n019003l.pfb")); TextContext->setFontSize(18); Camera.setPerspective(80*Pi/180, 1.33, 0.15, 1000); CEvent3dMouseListener MouseListener; MouseListener.addToServer(Driver->EventServer); MouseListener.setFrustrum(Camera.getFrustum()); MouseListener.setHotSpot(CVector(0,0,0)); CMatrix initMat; initMat.setPos(CVector(0,-5,0)); MouseListener.setMatrix(initMat); #endif while (cc->connected ()) { #ifdef USE_3D // Manip. Camera.setMatrix(MouseListener.getViewMatrix()); Driver->EventServer.pump(); if(Driver->AsyncListener.isKeyPushed(KeyESCAPE)) return EXIT_SUCCESS; Driver->clearBuffers(CRGBA(255,255,255,0)); Scene->render(); CGraph::render (*Driver, *TextContext); Driver->swapBuffers(); FpsGraph.addValue (1); #endif CConfigFile::checkConfigFiles (); // update TCP connection cc->update (); // update UDP connection if (UdpSock != NULL) { if (Mode == 0) { // init the UDP connection CMemStream msgout; msgout.serial (Mode); msgout.serial (Session); uint32 size = msgout.length(); #ifdef USE_3D UploadGraph.addValue ((float)size); #endif UdpSock->send (msgout.buffer(), size); nldebug ("Sent init udp connection"); nlSleep (100); } while (UdpSock->dataAvailable()) { psize = MaxUDPPacketSize; UdpSock->receive (packet, psize); #ifdef USE_3D DownloadGraph.addValue ((float)psize); #endif CMemStream msgin( true ); memcpy (msgin.bufferToFill (psize), packet, psize); sint64 t; msgin.serial (t); uint32 p; msgin.serial (p); uint32 b; msgin.serial (b); // I received a ping, send a pong CMemStream msgout; msgout.serial (Mode); msgout.serial (t); msgout.serial (p); msgout.serial (b); uint8 dummy=0; while (msgout.length() < 200) msgout.serial (dummy); uint32 size = msgout.length(); nlassert (size == 200); #ifdef USE_3D UploadGraph.addValue ((float)size); #endif UdpSock->send (msgout.buffer(), size); } } nlSleep (1); } exit (""); return EXIT_SUCCESS; }