Files
lity3d/Demo/main.c
T
shuiyu1123 2d56cb3bc9 MiMoEngine ASM: x86-64 MASM汇编+C混合架构游戏引擎
核心热路径(数学/内存/字符串/性能分析)用MASM汇编(SSE/AVX2)
外围系统(窗口/渲染/ECS/音频/UI/脚本)用C语言
含自研编辑器、VisualScript积木编程、中文渲染(glyph_atlas)
2026-07-10 19:20:40 +08:00

125 lines
3.8 KiB
C

#include "../Engine/Core/engine.h"
#include "../Engine/Core/logger.h"
#include "../Engine/Core/timer.h"
#include "../Engine/Window/window.h"
#include "../Engine/Rendering/graphics_device.h"
#include "../Engine/Rendering/shader.h"
#include "../Engine/Rendering/mesh.h"
#include "../Engine/Rendering/camera.h"
#include "../Engine/include/engine_api.h"
#include "../Engine/ASM/math_c_fallback.h"
#include <math.h>
#include <stdio.h>
static GraphicsDevice* g_dev = NULL;
static Shader* g_shader = NULL;
static Mesh* g_cube = NULL;
static Camera g_camera;
static float g_angle = 0.0f;
static void mat4_transpose(const Mat4* in, Mat4* out) {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
out->m[i][j] = in->m[j][i];
}
static void on_render(Engine* engine) {
if (!g_dev || !g_shader || !g_cube) return;
float w = (float)window_get_width(engine->window);
float h = (float)window_get_height(engine->window);
graphics_device_clear(g_dev, 0.15f, 0.15f, 0.2f, 1.0f);
g_dev->context->lpVtbl->IASetPrimitiveTopology(g_dev->context, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
Mat4 model, wvp, wvp_t;
mat4_rotate_y(g_angle, &model);
Mat4* view = (Mat4*)camera_get_view(&g_camera);
Mat4* proj = (Mat4*)camera_get_projection(&g_camera);
Mat4 vp;
mat4_multiply(view, proj, &vp);
mat4_multiply(&model, &vp, &wvp);
mat4_transpose(&wvp, &wvp_t);
shader_bind(g_shader, g_dev->context);
shader_set_matrix(g_shader, g_dev->context, (float*)&wvp_t);
ID3D11DepthStencilView* dsv = g_dev->depth_stencil;
g_dev->context->lpVtbl->OMSetRenderTargets(g_dev->context, 1, &g_dev->render_target, dsv);
D3D11_VIEWPORT vp2 = {0};
vp2.Width = w; vp2.Height = h; vp2.MaxDepth = 1.0f;
g_dev->context->lpVtbl->RSSetViewports(g_dev->context, 1, &vp2);
g_dev->context->lpVtbl->RSSetState(g_dev->context, NULL);
mesh_draw(g_cube, g_dev->context);
graphics_device_present(g_dev);
g_angle += 0.02f;
}
static void on_key(Engine* engine, int key) {
if (key == VK_ESCAPE) engine_request_quit(engine);
}
static void on_resize(Engine* engine, int width, int height) {
if (g_dev && width > 0 && height > 0) {
graphics_device_resize(g_dev, width, height);
g_camera.aspect = (float)width / (float)height;
g_camera.dirty = 1;
}
}
int main(int argc, char* argv[]) {
(void)argc; (void)argv;
EngineConfig config = engine_default_config();
config.app_name = "MiMo Engine - Cube Demo";
config.vsync = 0;
config.window_width = 1280;
config.window_height = 720;
Engine* engine = engine_create();
if (!engine_init(engine, &config)) {
LOG_FATAL("Engine init failed");
return -1;
}
g_dev = graphics_device_create();
if (!graphics_device_init(g_dev, window_get_handle(engine->window), config.window_width, config.window_height, 0)) {
LOG_FATAL("D3D11 init failed");
return -1;
}
LOG_INFO("D3D11 device ready");
g_shader = shader_create();
if (!shader_compile(g_shader, g_dev->device, NULL, NULL, 0, 0)) {
LOG_FATAL("Shader compile failed");
return -1;
}
LOG_INFO("Shader compiled");
g_cube = mesh_create_cube(g_dev->device);
LOG_INFO("Cube mesh created");
float aspect = (float)config.window_width / (float)config.window_height;
g_camera = camera_perspective(1.0472f, aspect, 0.1f, 100.0f);
g_camera.position = (Vec3){0, 1.5f, -4.0f};
g_camera.target = (Vec3){0, 0, 0};
g_camera.dirty = 1;
engine_set_render_callback(engine, on_render);
engine_set_key_callback(engine, on_key);
engine_set_resize_callback(engine, on_resize);
LOG_INFO("Running cube demo...");
engine_run(engine);
mesh_destroy(g_cube);
shader_destroy(g_shader);
graphics_device_destroy(g_dev);
engine_shutdown(engine);
return 0;
}