1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "Prerequisites/BsPrerequisitesUtil.h"
6#include "Debug/BsLog.h"
7
8namespace bs
9{
10 class Log;
11
12 /** @addtogroup Debug
13 * @{
14 */
15
16 /** Available types of channels that debug messages can be logged to. */
17 enum class DebugChannel
18 {
19 Debug, Warning, Error, CompilerWarning, CompilerError
20 };
21
22 /**
23 * Utility class providing various debug functionality.
24 *
25 * @note Thread safe.
26 */
27 class BS_UTILITY_EXPORT Debug
28 {
29 public:
30 Debug() = default;
31
32 /** Adds a log entry in the "Debug" channel. */
33 void logDebug(const String& msg);
34
35 /** Adds a log entry in the "Warning" channel. */
36 void logWarning(const String& msg);
37
38 /** Adds a log entry in the "Error" channel. */
39 void logError(const String& msg);
40
41 /** Adds a log entry in the specified channel. You may specify custom channels as needed. */
42 void log(const String& msg, UINT32 channel);
43
44 /** Retrieves the Log used by the Debug instance. */
45 Log& getLog() { return mLog; }
46
47 /** Converts raw pixels into a BMP image and saves it as a file */
48 void writeAsBMP(UINT8* rawPixels, UINT32 bytesPerPixel, UINT32 width, UINT32 height, const Path& filePath,
49 bool overwrite = true) const;
50
51 /**
52 * Saves a log about the current state of the application to the specified location.
53 *
54 * @param path Absolute path to the log filename.
55 */
56 void saveLog(const Path& path) const;
57
58 /**
59 * Triggered when a new entry in the log is added.
60 *
61 * @note Sim thread only.
62 */
63 Event<void(const LogEntry&)> onLogEntryAdded;
64
65 /**
66 * Triggered whenever one or multiple log entries were added or removed. Triggers only once per frame.
67 *
68 * @note Sim thread only.
69 */
70 Event<void()> onLogModified;
71
72 public: // ***** INTERNAL ******
73 /** @name Internal
74 * @{
75 */
76
77 /**
78 * Triggers callbacks that notify external code that a log entry was added.
79 *
80 * @note Sim thread only.
81 */
82 void _triggerCallbacks();
83
84 /** @} */
85 private:
86 UINT64 mLogHash = 0;
87 Log mLog;
88 };
89
90 /** A simpler way of accessing the Debug module. */
91 BS_UTILITY_EXPORT Debug& gDebug();
92
93/** Shortcut for logging a message in the debug channel. */
94#define LOGDBG(x) bs::gDebug().logDebug((x) + String("\n\t\t in ") + __PRETTY_FUNCTION__ + " [" + __FILE__ + ":" + toString(__LINE__) + "]\n");
95
96/** Shortcut for logging a message in the warning channel. */
97#define LOGWRN(x) bs::gDebug().logWarning((x) + String("\n\t\t in ") + __PRETTY_FUNCTION__ + " [" + __FILE__ + ":" + toString(__LINE__) + "]\n");
98
99/** Shortcut for logging a message in the error channel. */
100#define LOGERR(x) bs::gDebug().logError((x) + String("\n\t\t in ") + __PRETTY_FUNCTION__ + " [" + __FILE__ + ":" + toString(__LINE__) + "]\n");
101
102/** Shortcut for logging a message in the debug channel, with support for formatting through StringUtil::format(). */
103#define LOGDBG_FMT(...) bs::gDebug().logDebug(StringUtil::format(__VA_ARGS__) + String("\n\t\t in ") + __PRETTY_FUNCTION__ + " [" + __FILE__ + ":" + toString(__LINE__) + "]\n");
104
105/** Shortcut for logging a message in the warning channel, with support for formatting through StringUtil::format(). */
106#define LOGWRN_FMT(...) bs::gDebug().logWarning(StringUtil::format(__VA_ARGS__) + String("\n\t\t in ") + __PRETTY_FUNCTION__ + " [" + __FILE__ + ":" + toString(__LINE__) + "]\n");
107
108/** Shortcut for logging a message in the error channel, with support for formatting through StringUtil::format(). */
109#define LOGERR_FMT(...) bs::gDebug().logError(StringUtil::format(__VA_ARGS__) + String("\n\t\t in ") + __PRETTY_FUNCTION__ + " [" + __FILE__ + ":" + toString(__LINE__) + "]\n");
110
111/** Shortcut for logging a verbose message in the debug channel. Verbose messages can be ignored unlike other log messages. */
112#define LOGDBG_VERBOSE(x) ((void)0)
113
114/** Shortcut for logging a verbose message in the warning channel. Verbose messages can be ignored unlike other log messages. */
115#define LOGWRN_VERBOSE(x) ((void)0)
116
117 /** @} */
118}
119