BsScriptDebug.cpp 3.2 KB

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