BsScriptDebug.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "BsScriptDebug.h"
  2. #include "BsMonoManager.h"
  3. #include "BsMonoClass.h"
  4. #include "BsMonoMethod.h"
  5. #include "BsMonoUtil.h"
  6. #include "BsDebug.h"
  7. #include "BsScriptLogEntry.h"
  8. namespace BansheeEngine
  9. {
  10. HEvent ScriptDebug::mOnLogEntryAddedConn;
  11. ScriptDebug::OnAddedThunkDef ScriptDebug::onAddedThunk = nullptr;
  12. /**
  13. * @brief C++ version of the managed LogEntry structure.
  14. */
  15. struct ScriptLogEntryData
  16. {
  17. UINT32 type;
  18. MonoString* message;
  19. };
  20. ScriptDebug::ScriptDebug(MonoObject* instance)
  21. :ScriptObject(instance)
  22. { }
  23. void ScriptDebug::initRuntimeData()
  24. {
  25. metaData.scriptClass->addInternalCall("Internal_Log", &ScriptDebug::internal_log);
  26. metaData.scriptClass->addInternalCall("Internal_LogWarning", &ScriptDebug::internal_logWarning);
  27. metaData.scriptClass->addInternalCall("Internal_LogError", &ScriptDebug::internal_logError);
  28. metaData.scriptClass->addInternalCall("Internal_LogError", &ScriptDebug::internal_logError);
  29. metaData.scriptClass->addInternalCall("Internal_Clear", &ScriptDebug::internal_clear);
  30. metaData.scriptClass->addInternalCall("Internal_GetMessages", &ScriptDebug::internal_getMessages);
  31. onAddedThunk = (OnAddedThunkDef)metaData.scriptClass->getMethod("Internal_OnAdded", 2)->getThunk();
  32. }
  33. void ScriptDebug::startUp()
  34. {
  35. mOnLogEntryAddedConn = gDebug().onLogEntryAdded.connect(&ScriptDebug::onLogEntryAdded);
  36. }
  37. void ScriptDebug::shutDown()
  38. {
  39. mOnLogEntryAddedConn.disconnect();
  40. }
  41. void ScriptDebug::onLogEntryAdded(const LogEntry& entry)
  42. {
  43. MonoString* message = MonoUtil::stringToMono(MonoManager::instance().getDomain(), entry.getMessage());
  44. MonoUtil::invokeThunk(onAddedThunk, entry.getChannel(), message);
  45. }
  46. void ScriptDebug::internal_log(MonoString* message)
  47. {
  48. gDebug().logDebug(MonoUtil::monoToString(message));
  49. }
  50. void ScriptDebug::internal_logWarning(MonoString* message)
  51. {
  52. gDebug().logWarning(MonoUtil::monoToString(message));
  53. }
  54. void ScriptDebug::internal_logError(MonoString* message)
  55. {
  56. gDebug().logError(MonoUtil::monoToString(message));
  57. }
  58. void ScriptDebug::internal_clear()
  59. {
  60. gDebug().getLog().clear();
  61. }
  62. MonoArray* ScriptDebug::internal_getMessages()
  63. {
  64. Vector<LogEntry> entries = gDebug().getLog().getEntries();
  65. UINT32 numEntries = (UINT32)entries.size();
  66. ScriptArray output = ScriptArray::create<ScriptLogEntry>(numEntries);
  67. for (UINT32 i = 0; i < numEntries; i++)
  68. {
  69. MonoString* message = MonoUtil::stringToMono(MonoManager::instance().getDomain(), entries[i].getMessage());
  70. ScriptLogEntryData scriptEntry = { entries[i].getChannel(), message };
  71. output.set(i, scriptEntry);
  72. }
  73. return output.getInternal();
  74. }
  75. }