AEPlayerMode.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include <Atomic/IO/IOEvents.h>
  2. #include <Atomic/IO/Log.h>
  3. #include <Atomic/Input/InputEvents.h>
  4. #include <Atomic/Core/ProcessUtils.h>
  5. #include <Atomic/Graphics/GraphicsEvents.h>
  6. #include <Atomic/Graphics/Camera.h>
  7. #include <Atomic/UI/SystemUI/DebugHud.h>
  8. #include <Atomic/UI/SystemUI/SystemUIEvents.h>
  9. #include <Atomic/UI/UI.h>
  10. #include <Atomic/IPC/IPCEvents.h>
  11. #include <Atomic/IPC/IPCWorker.h>
  12. #include <AtomicJS/Javascript/JSVM.h>
  13. #include <AtomicJS/Javascript/JSEvents.h>
  14. #include <AtomicJS/Javascript/JSIPCEvents.h>
  15. #include "AEPlayerMode.h"
  16. namespace AtomicEditor
  17. {
  18. PlayerMode::PlayerMode(Context* context) :
  19. Object(context),
  20. brokerActive_(false),
  21. launchedByEditor_(false),
  22. licenseModule3D_(false)
  23. {
  24. fd_[0] = INVALID_IPCHANDLE_VALUE;
  25. fd_[1] = INVALID_IPCHANDLE_VALUE;
  26. ipc_ = GetSubsystem<IPC>();
  27. SubscribeToEvent(E_LOGMESSAGE, HANDLER(PlayerMode, HandleLogMessage));
  28. SubscribeToEvent(E_JSERROR, HANDLER(PlayerMode, HandleJSError));
  29. // BEGIN LICENSE MANAGEMENT
  30. SubscribeToEvent(E_BEGINVIEWRENDER, HANDLER(PlayerMode, HandleViewRender));
  31. // END LICENSE MANAGEMENT
  32. }
  33. PlayerMode::~PlayerMode()
  34. {
  35. }
  36. void PlayerMode::HandleIPCInitialize(StringHash eventType, VariantMap& eventData)
  37. {
  38. brokerActive_ = true;
  39. JSVM* vm = JSVM::GetJSVM(0);
  40. if (!vm->ExecuteMain())
  41. {
  42. SendEvent(E_EXITREQUESTED);
  43. }
  44. // BEGIN LICENSE MANAGEMENT
  45. licenseModule3D_ = eventData["license3D"].GetBool();
  46. // END LICENSE MANAGEMENT
  47. SystemUI::DebugHud* debugHud = GetSubsystem<SystemUI::DebugHud>();
  48. if (debugHud)
  49. debugHud->SetMode(eventData["debugHudMode"].GetUInt());
  50. }
  51. void PlayerMode::ProcessArguments() {
  52. const Vector<String>& arguments = GetArguments();
  53. int id = -1;
  54. for (unsigned i = 0; i < arguments.Size(); ++i)
  55. {
  56. if (arguments[i].Length() > 1)
  57. {
  58. String argument = arguments[i].ToLower();
  59. // String value = i + 1 < arguments.Size() ? arguments[i + 1] : String::EMPTY;
  60. if (argument.StartsWith("--ipc-id="))
  61. {
  62. Vector<String> idc = argument.Split(argument.CString(), '=');
  63. if (idc.Size() == 2)
  64. id = ToInt(idc[1].CString());
  65. }
  66. else if (argument.StartsWith("--ipc-server=") || argument.StartsWith("--ipc-client="))
  67. {
  68. LOGINFOF("Starting IPCWorker %s", argument.CString());
  69. Vector<String> ipc = argument.Split(argument.CString(), '=');
  70. if (ipc.Size() == 2)
  71. {
  72. if (argument.StartsWith("--ipc-server="))
  73. {
  74. #ifdef ATOMIC_PLATFORM_WINDOWS
  75. // clientRead
  76. WString wipc(ipc[1]);
  77. HANDLE pipe = reinterpret_cast<HANDLE>(_wtoi64(wipc.CString()));
  78. fd_[0] = pipe;
  79. #else
  80. int fd = ToInt(ipc[1].CString());
  81. fd_[0] = fd;
  82. #endif
  83. }
  84. else
  85. {
  86. #ifdef ATOMIC_PLATFORM_WINDOWS
  87. // clientWrite
  88. WString wipc(ipc[1]);
  89. HANDLE pipe = reinterpret_cast<HANDLE>(_wtoi64(wipc.CString()));
  90. fd_[1] = pipe;
  91. #else
  92. int fd = ToInt(ipc[1].CString());
  93. fd_[1] = fd;
  94. #endif
  95. }
  96. }
  97. }
  98. }
  99. }
  100. if (id > 0 && fd_[0] != INVALID_IPCHANDLE_VALUE && fd_[1] != INVALID_IPCHANDLE_VALUE)
  101. {
  102. launchedByEditor_ = true;
  103. SubscribeToEvent(E_IPCINITIALIZE, HANDLER(PlayerMode, HandleIPCInitialize));
  104. ipc_->InitWorker((unsigned) id, fd_[0], fd_[1]);
  105. }
  106. }
  107. void PlayerMode::HandleJSError(StringHash eventType, VariantMap& eventData)
  108. {
  109. if (brokerActive_)
  110. {
  111. if (ipc_.Null())
  112. return;
  113. String errName = eventData[JSError::P_ERRORNAME].GetString();
  114. String errStack = eventData[JSError::P_ERRORSTACK].GetString();
  115. String errMessage = eventData[JSError::P_ERRORMESSAGE].GetString();
  116. String errFilename = eventData[JSError::P_ERRORFILENAME].GetString();
  117. int errLineNumber = eventData[JSError::P_ERRORLINENUMBER].GetInt();
  118. VariantMap ipcErrorData;
  119. ipcErrorData[IPCJSError::P_ERRORNAME] = errName;
  120. ipcErrorData[IPCJSError::P_ERRORSTACK] = errStack;
  121. ipcErrorData[IPCJSError::P_ERRORMESSAGE] = errMessage;
  122. ipcErrorData[IPCJSError::P_ERRORFILENAME] = errFilename;
  123. ipcErrorData[IPCJSError::P_ERRORLINENUMBER] = errLineNumber;
  124. ipc_->SendEventToBroker(E_IPCJSERROR, ipcErrorData);
  125. LOGERROR("SENDING E_IPCJSERROR");
  126. }
  127. }
  128. void PlayerMode::HandleLogMessage(StringHash eventType, VariantMap& eventData)
  129. {
  130. using namespace LogMessage;
  131. if (brokerActive_)
  132. {
  133. if (ipc_.Null())
  134. return;
  135. VariantMap logEvent;
  136. logEvent[IPCWorkerLog::P_LEVEL] = eventData[P_LEVEL].GetInt();
  137. logEvent[IPCWorkerLog::P_MESSAGE] = eventData[P_MESSAGE].GetString();
  138. ipc_->SendEventToBroker(E_IPCWORKERLOG, logEvent);
  139. }
  140. }
  141. void PlayerMode::HandleMessageAck(StringHash eventType, VariantMap& eventData)
  142. {
  143. messageBox_ = 0;
  144. GetSubsystem<UI>()->RequestExit();
  145. }
  146. void PlayerMode::HandleViewRender(StringHash eventType, VariantMap& eventData)
  147. {
  148. // BEGIN LICENSE MANAGEMENT
  149. static bool done = false;
  150. if (licenseModule3D_)
  151. return;
  152. Camera* camera = static_cast<Camera*>(eventData[BeginViewRender::P_CAMERA].GetPtr());
  153. if (!camera || camera->IsOrthographic())
  154. return;
  155. if (!done) {
  156. done = true;
  157. messageBox_ = GetSubsystem<UI>()->ShowSystemMessageBox("3D Module License Required", "A 3D Module License is required to display 3D content.\n\nUpgrade to Atomic Pro for all features and platforms.");
  158. SubscribeToEvent(messageBox_, SystemUI::E_MESSAGEACK, HANDLER(PlayerMode, HandleMessageAck));
  159. if (brokerActive_)
  160. {
  161. if (ipc_.Null())
  162. return;
  163. VariantMap msgEvent;
  164. msgEvent[IPCMessage::P_MESSAGE] = String("3D Module License Required");
  165. ipc_->SendEventToBroker(E_IPCMESSAGE, msgEvent);
  166. }
  167. }
  168. // END LICENSE MANAGEMENT
  169. }
  170. }