Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.10 KB | None | 0 0
  1. #include "client_application.h"
  2. #include "osgresourcemanager.h"
  3. #include "balloon_controller.h"
  4. #include "avacontroller.h"
  5. #include <iostream>
  6.  
  7. void MyInteractionCallback(unsigned int interactionID, const TA_ParamList& parameters)
  8. {
  9.     TA_Resource* pInteraction = TA_ResourceManager::GetInstance()->FindResourceByID(interactionID, TA_Resource::PATTERN);
  10.     if (pInteraction->GetName() == "Interaction1") {
  11.         int& p1 = *((int*)parameters[0]);
  12.         double& p2 = *((double*)parameters[1]);
  13.         float& p3 = *((float*)parameters[2]);
  14.         std::cout << "Interaction 1 received with parameters" << p1 << p2 << p3 << std::endl;
  15.     } else if (pInteraction->GetName() == "Interaction2") {
  16.         int& p1 = *((int*)parameters[0]);
  17.         int& p2 = *((int*)parameters[1]);
  18.         std::cout << "Interaction 2 received with parameters" << p1 << p2 << std::endl;
  19.     } else if (pInteraction->GetName() == "Interaction3") {
  20.         TA_Point3D& p1 = *((TA_Point3D*)parameters[0]);
  21.         TA_Point3F& p2 = *((TA_Point3F*)parameters[1]);
  22.         TA_Point3D& p3 = *((TA_Point3D*)parameters[2]);
  23.         std::cout << "Interaction 3 received with parameters" << p1.Length() << p2.Length() << p3.Length() << std::endl;
  24.     }
  25. }
  26.  
  27. ClientApplication::ClientApplication():
  28.       m_pWorld(NULL)
  29.     , m_pRenderer(NULL)
  30.     , m_pTimer(NULL)
  31.     , m_pResourceManager(TA_ResourceManager::GetInstance())
  32.     , m_bConsoleMode(false)
  33. {
  34.     strcpy(m_pczSrvIP, "127.0.0.1");
  35. }
  36.  
  37. bool ClientApplication :: _LoadSettings()
  38. {
  39.     FILE* pSettings = fopen("cl_settings.txt", "r");
  40.  
  41.     if (pSettings)
  42.         fscanf(pSettings, "Server IP = %s\n", m_pczSrvIP);
  43.     else
  44.         return false;
  45.     fclose(pSettings);
  46.     return true;
  47. }
  48.  
  49. bool ClientApplication :: Init(bool bConsoleMode)
  50. {
  51.     if (!_LoadSettings())
  52.         return false;
  53.  
  54.     m_bConsoleMode = bConsoleMode;
  55.  
  56.     m_pResourceManager->Init(TA_CLIENT, !m_bConsoleMode ? new OSGResourceManagerImpl() : NULL);
  57.     m_pResourceManager->RegisterController(new BalloonController);
  58.  
  59.     TA_StateAttribute* pAttr = NULL;
  60.     // Get a virtual environment instance
  61.     m_pWorld = m_pResourceManager->GetWorld();
  62.  
  63.     TA_NetworkInterface* pNetInterface = m_pResourceManager->GetNetworkInterface();
  64.     pNetInterface->GetCurProcessID();
  65.     // Connect our process to the server
  66.     if (!pNetInterface->Connect(m_pczSrvIP, true))
  67.         return false;
  68.  
  69.     // Subscribe on VE objects state updates
  70.     pNetInterface->SubscribeObject("Balloon");
  71.     pNetInterface->SubscribePattern("Interaction1");
  72.     pNetInterface->SubscribePattern("Interaction2");
  73.     pNetInterface->SubscribePattern("Interaction3");
  74.     pNetInterface->SetInteractionHandleCallback(MyInteractionCallback);
  75.  
  76.     // Create window
  77.     TA_Window* pWindow = m_pResourceManager->CreateGraphicWindow();
  78.     pWindow->Resize(100, 100, 640, 480);
  79.  
  80.     // Create camera
  81.     TA_Camera* pCamera = m_pResourceManager->CreateCamera();
  82.     pCamera->SetWindow(pWindow);
  83.     pCamera->SetViewPort(0, 0, 640, 480);
  84.     pCamera->SetFrustrumParameters(45.0, 0.1, 1000.0);
  85.     pCamera->LookAt(TA_Point3D(100.0, 100.0, 20.0), TA_Point3F(-TA_PI_0_5, 0.0f, -2.50f));
  86.     m_pWorld->SetCamera(pCamera);
  87.  
  88.     // Create renderer
  89.     m_pRenderer = m_pResourceManager->GetRenderer();
  90.     m_pRenderer->SetSceneData(m_pWorld);
  91.     // Call Realize() after setting windows and cameras
  92.     m_pRenderer->Realize();
  93.  
  94.     // Add our part to world
  95.     // Here we create an object, first locally, and after this share it
  96.     // NOTE: if object is already created, next call will be ignored and NULL returned
  97.     m_pBalloon = m_pResourceManager->CreateObject("Balloon", true, false);
  98.     if (m_pBalloon)
  99.     {
  100.         TA_State* pState = m_pBalloon->GetState();
  101.         // NOTE: you can import any early created state pattern (including patterns created by other processes)
  102. //      pState->ImportPattern("StatePattern1");
  103.         // Load and set object graphic representation
  104.         TA_Model* pBalloonModel = m_pResourceManager->CreateModel("Balloon.3ds");
  105.         m_pBalloon->SetModel(pBalloonModel);
  106.  
  107.         pAttr = pState->GetAttribute("POSITION");
  108.         pAttr->SetSerializationMode(TA_StateAttribute::SERIALIZE_WITH_CONSTANT_RATE);
  109.         pAttr->SetSerializationRate(10.0f);
  110.         pAttr->EnableFiltering(true);
  111.         pAttr = pState->GetAttribute("SCALE");
  112.         pAttr->SetValue(TA_Point3F(2.0f));
  113.  
  114.         // Here we assign previously created "CircleController"
  115.         BalloonController* bc = new BalloonController();
  116.         TA_Controller* pController = bc;
  117.         bc->pCam=pCamera;
  118.         m_pBalloon->SetController(pController);
  119.         pController->Enable();
  120.  
  121.         // Add object to scene locally
  122.         m_pWorld->GetRootObject()->AddChild(m_pBalloon);
  123.        
  124.         // Share object, that it becomes available for every process
  125.         m_pBalloon->Share();
  126.     }
  127.  
  128.     m_ava = m_pResourceManager->CreateObject("Ava", true, false);
  129.     if (m_ava)
  130.     {
  131.         TA_State* pState = m_ava->GetState();
  132.         // NOTE: you can import any early created state pattern (including patterns created by other processes)
  133. //      pState->ImportPattern("StatePattern1");
  134.         // Load and set object graphic representation
  135.         TA_Model* pAva = m_pResourceManager->CreateModel("icosahedron.osg");
  136.         m_ava->SetModel(pAva);
  137.  
  138.         pAttr = pState->GetAttribute("POSITION");
  139.         pAttr->SetSerializationMode(TA_StateAttribute::SERIALIZE_WITH_CONSTANT_RATE);
  140.         pAttr->SetSerializationRate(5.0);
  141.         pAttr->EnableFiltering(true);
  142.         pAttr = pState->GetAttribute("ROTATION");
  143.         pAttr->SetSerializationMode(TA_StateAttribute::SERIALIZE_WITH_CONSTANT_RATE);
  144.         pAttr->SetSerializationRate(5.0);
  145.         pAttr->EnableFiltering(true);
  146.         pAttr = pState->GetAttribute("SCALE");
  147.         pAttr->SetValue(TA_Point3F(2.0f));
  148.  
  149.         AvaController* ac = new AvaController();
  150.         TA_Controller* pController = ac;
  151.         ac->pCam=pCamera;
  152.         m_ava->SetController(pController);
  153.         pController->Enable();
  154.  
  155.         // Add object to scene locally
  156.         m_pWorld->GetRootObject()->AddChild(m_ava);
  157.        
  158.         // Share object, that it becomes available for every process
  159.         m_ava->Share();
  160.     }
  161.  
  162.     // Create timer
  163.     m_pTimer = m_pResourceManager->GetTimer();
  164.    
  165.     // Sync clocks with server
  166.     m_pTimer->Sync();
  167.  
  168.     // Register our own interaction pattern
  169.     TA_Pattern* pInteraction = new TA_Pattern(TA_Pattern::INTERACTION_PATTERN);
  170.     pInteraction->SetName("Interaction3");
  171.     pInteraction->AllocateParameter("pos", TA_StateAttribute::VECTOR_3D);
  172.     pInteraction->AllocateParameter("rot", TA_StateAttribute::VECTOR_3F);
  173.     pInteraction->AllocateParameter("velocity", TA_StateAttribute::VECTOR_3D);
  174.     m_pResourceManager->RegisterPattern(pInteraction);
  175.  
  176.     return true;
  177. }
  178.  
  179. void ClientApplication :: Run()
  180. {
  181.     Tick oldTick = m_pTimer->GetTick();
  182.  
  183.     TA_StringList attrList;
  184.     attrList.push_back("POSITION");
  185.     attrList.push_back("ROTATION");
  186.  
  187.     m_pWorld->SetCycleTime(1.0 / 60.0, true);
  188.  
  189.     int iRnd = 0;
  190.     int iToggle = 0;
  191.     TA_Key key;
  192.     if (m_bConsoleMode)
  193.     {
  194.         std::cout << "TerraNet Client v. 1.054 is started..." << std::endl << "Entering console mode" << std::endl;
  195.         while (true)
  196.             m_pWorld->Simulate();
  197.     }
  198.     else
  199.     {
  200.         while (!m_pRenderer->Done())
  201.         {
  202.             double dCurTime = m_pTimer->GetTime();
  203.             double dStartTime = dCurTime + 5.0;
  204.             if (m_pResourceManager->GetInputManager()->IsKeyPressed())
  205.             {
  206.                 key = m_pResourceManager->GetInputManager()->GetKey();
  207.                 switch (key.code)
  208.                 {
  209.                     case 'p':
  210.                     {
  211.                         TA_Object* object = m_pWorld->GetUserObject();
  212.                         if (!object)
  213.                             break;
  214.                         object->PlayStateTrack((object->GetName() + "_local.track").c_str(), dStartTime);
  215.                     } break;
  216.                     case 'r':
  217.                     {
  218.                         TA_Object* object = m_pWorld->GetUserObject();
  219.                         if (!object)
  220.                             break;
  221.                         object->RecordStateTrack((object->GetName() + "_local.track").c_str(), dStartTime, dStartTime + 10.0, attrList);
  222.                     } break;
  223.                     case 'q':
  224.                         TA_ParamList paramList;
  225.                         if (++iRnd % 3 == 0) {
  226.                             int param1 = 1;
  227.                             double param2 = 2.0;
  228.                             float param3 = 5.3;
  229.                             paramList.push_back(&param1);
  230.                             paramList.push_back(&param2);
  231.                             paramList.push_back(&param3);
  232.                             // Send interaction to everyone who subscribed it
  233.                             m_pResourceManager->GetNetworkInterface()->SendInteraction("Interaction1", paramList, LOW_RELIABILITY);
  234.                         } else {
  235.                             if (iRnd % 3 == 1) {
  236.                                 int param1 = 1;
  237.                                 int param2 = 15;
  238.                                 paramList.push_back(&param1);
  239.                                 paramList.push_back(&param2);
  240.                                 // Send interaction to everyone who subscribed it
  241.                                 m_pResourceManager->GetNetworkInterface()->SendInteraction("Interaction2", paramList, HIGH_RELIABILITY);
  242.                             } else {
  243.                                 TA_Point3D param1 = TA_Point3D(10, -8, 10);
  244.                                 TA_Point3F param2 = TA_Point3F(-1, 50, 50);
  245.                                 TA_Point3D param3 = TA_Point3D(1, 1, 1);
  246.                                 paramList.push_back(&param1);
  247.                                 paramList.push_back(&param2);
  248.                                 paramList.push_back(&param3);
  249.                                 // Send interaction to everyone who subscribed it
  250.                                 m_pResourceManager->GetNetworkInterface()->SendInteraction("Interaction3", paramList, HIGH_RELIABILITY);
  251.                             }
  252.                         }
  253.                         break;
  254.                 }
  255.             }
  256.             m_pWorld->Simulate();
  257.             m_pRenderer->RenderFrame();
  258.         }
  259.     }
  260. }
  261.  
  262. void ClientApplication :: Finalize()
  263. {
  264.     // Here we remove our objects from world if they are not captured by other users
  265.     m_pResourceManager->RemoveObject((TA_Object*)m_pResourceManager->FindResourceByName("Helicopter3", TA_Resource::OBJECT));
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement