mirage/src/mirage_app/mirage.cpp

101 lines
2.6 KiB
C++

#include "mirage.h"
#include <iostream>
#include <thread>
#include "font/font_system.h"
#include "window/mwindow.h"
#include "misc/mirage_scoped_duration_timer.h"
#include "platform_window/platform_window.h"
#include "style/mirage_style.h"
void mirage_log(const char* tag, uint32_t log_level, uint32_t log_item_id, const char* message_or_null,
uint32_t line_nr, const char* filename_or_null, void* user_data) {
/* 处理NULL指针情况 */
const char* tag_str = tag ? tag : "(null)";
const char* msg_str = message_or_null ? message_or_null : "(no message)";
const char* file_str = filename_or_null ? filename_or_null : "(unknown)";
/* 根据log_level确定日志级别字符串和输出流 */
const char* level_str;
FILE* output_stream;
switch (log_level) {
case 0:
level_str = "PANIC";
output_stream = stderr;
break;
case 1:
level_str = "ERROR";
output_stream = stderr;
break;
case 2:
level_str = "WARNING";
output_stream = stderr;
break;
case 3:
level_str = "INFO";
output_stream = stdout;
break;
default:
level_str = "UNKNOWN";
output_stream = stderr; // 默认使用stderr
break;
}
/* 打印格式化的日志消息到相应的流 */
fprintf(output_stream, "[%s][%s][ID:%u][%s:%u] %s\n", tag_str, level_str, log_item_id, file_str, line_nr, msg_str);
/* 在此实现中未使用user_data */
(void) user_data;
}
void mirage_app::init() {
duration_type duration;
{
mirage_scoped_duration_timer timer(duration);
last_time = get_current_time();
if (!mirage_style::get().load_config("default_style.toml")) {
fprintf(stderr, "mirage: 无法加载样式配置\n");
}
render_context = mirage_create_render_context();
render_context->init();
const sg_desc desc = {
.logger = {
.func = mirage_log,
.user_data = nullptr
},
.environment = render_context->get_environment(),
};
sg_setup(desc);
render_context->end_init();
}
// 初始化用时
fprintf(stderr, "mirage: 初始化耗时 %lld ms\n", std::chrono::duration_cast<std::chrono::milliseconds>(duration).count());
}
void mirage_app::run() {
while (!platform_window::get_windows().empty()) {
delta_time = get_current_time() - last_time;
platform_window::poll_events();
for (const auto& window: mwindow::get_all()) {
if (const auto shared_window = window.lock()) {
shared_window->update();
}
}
last_time = get_current_time();
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
running = false;
texture_sampler_builder::clear();
render_context->cleanup();
delete render_context;
font_manager::instance().destroy();
}