Allolib  1.0
C++ Components For Interactive Multimedia
al_DistributedApp.hpp
1 #ifndef INCLUDE_AL_DISTRIBUTEDAPP_HPP
2 #define INCLUDE_AL_DISTRIBUTEDAPP_HPP
3 
4 /* Keehong Youn, 2017, younkeehong@gmail.com
5  * Andres Cabrera, 2018, 2019, mantaraya36@gmail.com
6  */
7 
8 #include <iostream>
9 #include <map>
10 
11 #include "al/app/al_App.hpp"
12 #include "al/app/al_NodeConfiguration.hpp"
13 #include "al/app/al_OmniRendererDomain.hpp"
14 #include "al/app/al_StateDistributionDomain.hpp"
15 #include "al/io/al_PersistentConfig.hpp"
16 #include "al/io/al_Socket.hpp"
17 #include "al/io/al_Toml.hpp"
18 #include "al/scene/al_DistributedScene.hpp"
19 #include "al/scene/al_DynamicScene.hpp"
20 
21 namespace al {
22 
23 class AudioControl {
24 public:
25  void registerAudioIO(AudioIO &io) {
26  gain.registerChangeCallback([&io](float value) { io.gain(value); });
27  }
28 
29  void update(AudioIO &io) { gain = io.mGain; }
30 
31  Parameter gain{"gain", "sound", 1.0, 0.0, 2.0};
32 };
33 
71 class DistributedApp : public App, public NodeConfiguration {
72 public:
73  void start() override;
74 
75  std::string name();
76 
84  virtual void prepare();
85 
86  void registerDynamicScene(DynamicScene &scene);
87 
88  Graphics &graphics() override;
89  Window &defaultWindow() override;
90  Viewpoint &view() override;
91  Pose &pose() override;
92  Lens &lens() override;
93  Nav &nav() override;
94  NavInputControl &navControl() override;
95 
96  std::shared_ptr<GLFWOpenGLOmniRendererDomain> omniRendering;
97  std::map<std::string, std::string> additionalConfig;
98 
99 private:
100  AudioControl mAudioControl;
101 
102  bool initialized{false};
103 
104  std::map<std::string, std::string> mRoleMap;
105  bool mFoundHost = false;
106 };
107 
123 template <class TSharedState>
125 public:
127  // State will be same memory for local, but will be synced on the network
128  // for separate instances
129  mOpenGLGraphicsDomain->removeSubDomain(simulationDomain());
130 
131  // Replace Simulation domain with state simulation domain
132  mSimulationDomain =
133  mOpenGLGraphicsDomain
134  ->newSubDomain<StateDistributionDomain<TSharedState>>(true);
135  }
136 
137  TSharedState &state() {
138  return std::static_pointer_cast<StateDistributionDomain<TSharedState>>(
139  mSimulationDomain)
140  ->state();
141  }
142 
143  // void init() override {
144  // DistributedApp::init();
145  // }
146 
147  void start() override {
148  prepare();
149  auto distDomain =
150  std::static_pointer_cast<StateDistributionDomain<TSharedState>>(
151  mSimulationDomain);
152  if (isPrimary()) {
153  if (hasCapability(CAP_STATE_SEND)) {
154  std::cout << "Running primary with state send" << std::endl;
155  auto sender =
156  distDomain->addStateSender("state", distDomain->statePtr());
157  sender->configure(10101, "state", additionalConfig["broadcastAddress"]);
158  } else {
159  std::cout << "Not enabling state sending for primary." << std::endl;
160  }
161  } else {
162  std::cout << "Running REPLICA" << std::endl;
163  auto receiver =
164  distDomain->addStateReceiver("state", distDomain->statePtr());
165  receiver->configure(10101);
166  }
167  DistributedApp::start();
168  }
169 
170 private:
171 };
172 
173 } // namespace al
174 
175 #endif
Simple App class.
Definition: al_App.hpp:29
DistributedApp class.
virtual void prepare()
prepares domains and configuration
The DynamicScene class.
Interface for loading fonts and rendering text.
Definition: al_Graphics.hpp:63
The Parameter class.
void registerChangeCallback(ParameterChangeCallback cb)
registerChangeCallback adds a callback to be called when the value changes
A local coordinate frame.
Definition: al_Pose.hpp:63
Domain for distributing state for a simulation domain.
Viewpoint within a scene.
Window with OpenGL context.
Definition: al_Window.hpp:251
Definition: al_App.hpp:23
The NodeConfiguration struct describes a distributed node and its capabilities.